diff --git a/applications/solvers/combustion/dieselEngineFoam/Make/options b/applications/solvers/combustion/dieselEngineFoam/Make/options
index c4d65fa137e5afa137669220ffae425c4d126430..8fdb0c5c33d6d9af10af064876dbea071641d0c9 100644
--- a/applications/solvers/combustion/dieselEngineFoam/Make/options
+++ b/applications/solvers/combustion/dieselEngineFoam/Make/options
@@ -16,6 +16,7 @@ EXE_INC = \
     -I$(LIB_SRC)/ODE/lnInclude \
     -I$(LIB_SRC)/engine/lnInclude \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude
 
 EXE_LIBS = \
     -lengine \
@@ -35,4 +36,5 @@ EXE_LIBS = \
     -llaminarFlameSpeedModels \
     -lchemistryModel \
     -lODE \
-    -ldistributionModels
+    -ldistributionModels \
+    -lcombustionModels
diff --git a/applications/solvers/combustion/dieselEngineFoam/YEqn.H b/applications/solvers/combustion/dieselEngineFoam/YEqn.H
index b8d39b4f46f329babb405d32cf0ae14c17c8079c..46d0f364e69f5689c9cc45301696d02ac19a6df1 100644
--- a/applications/solvers/combustion/dieselEngineFoam/YEqn.H
+++ b/applications/solvers/combustion/dieselEngineFoam/YEqn.H
@@ -10,7 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection
 );
 
 {
-
+    combustion->correct();
+    dQ = combustion->dQ();
     label inertIndex = -1;
     volScalarField Yt(0.0*Y[0]);
 
@@ -20,17 +21,19 @@ tmp<fv::convectionScheme<scalar> > mvConvection
         {
             volScalarField& Yi = Y[i];
 
-            solve
+            fvScalarMatrix YiEqn
             (
                 fvm::ddt(rho, Yi)
               + mvConvection->fvmDiv(phi, Yi)
               - fvm::laplacian(turbulence->muEff(), Yi)
               ==
                 dieselSpray.evaporationSource(i)
-              + kappa*chemistry.RR(i),
-                mesh.solver("Yi")
+              + combustion->R(Yi)
             );
 
+            YiEqn.relax();
+            YiEqn.solve(mesh.solver("Yi"));
+
             Yi.max(0.0);
             Yt += Yi;
         }
diff --git a/applications/solvers/combustion/dieselEngineFoam/createFields.H b/applications/solvers/combustion/dieselEngineFoam/createFields.H
index 4bd9f1a9160ed8509f062834bf7c72adea75f84c..bbb9000943dd0aef392551be5b1fe2a60156b2fb 100644
--- a/applications/solvers/combustion/dieselEngineFoam/createFields.H
+++ b/applications/solvers/combustion/dieselEngineFoam/createFields.H
@@ -1,10 +1,14 @@
-Info<< nl << "Reading thermophysicalProperties" << endl;
+Info<< "Creating combustion model\n" << endl;
 
-autoPtr<psiChemistryModel> pChemistry
+autoPtr<combustionModels::psiChemistryCombustionModel> combustion
 (
-    psiChemistryModel::New(mesh)
+    combustionModels::psiChemistryCombustionModel::New
+    (
+        mesh
+    )
 );
-psiChemistryModel& chemistry = pChemistry();
+
+psiChemistryModel& chemistry = combustion->pChemistry();
 
 hsCombustionThermo& thermo = chemistry.thermo();
 
@@ -55,20 +59,6 @@ volScalarField& hs = thermo.hs();
 
 #include "compressibleCreatePhi.H"
 
-volScalarField kappa
-(
-    IOobject
-    (
-        "kappa",
-        runTime.timeName(),
-        mesh,
-        IOobject::NO_READ,
-        IOobject::AUTO_WRITE
-    ),
-    mesh,
-    dimensionedScalar("zero", dimless, 0.0)
-);
-
 Info << "Creating turbulence model.\n" << nl;
 autoPtr<compressible::turbulenceModel> turbulence
 (
@@ -81,6 +71,9 @@ autoPtr<compressible::turbulenceModel> turbulence
     )
 );
 
+// Set the turbulence into the combustion model
+combustion->setTurbulence(turbulence());
+
 Info<< "Creating field DpDt\n" << endl;
 volScalarField DpDt
 (
@@ -96,16 +89,16 @@ forAll(Y, i)
 }
 fields.add(hs);
 
-DimensionedField<scalar, volMesh> chemistrySh
+volScalarField dQ
 (
     IOobject
     (
-        "chemistry::Sh",
+        "dQ",
         runTime.timeName(),
         mesh,
         IOobject::NO_READ,
-        IOobject::NO_WRITE
+        IOobject::AUTO_WRITE
     ),
     mesh,
-    dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0)
+    dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
 );
diff --git a/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C b/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C
index 94ab9289994012cf5e2a769e94826aecaf59c5b7..807051318fe37329137828e7c5e906f62c2af1dd 100644
--- a/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C
+++ b/applications/solvers/combustion/dieselEngineFoam/dieselEngineFoam.C
@@ -32,8 +32,8 @@ Description
 #include "fvCFD.H"
 #include "engineTime.H"
 #include "engineMesh.H"
-#include "hCombustionThermo.H"
 #include "turbulenceModel.H"
+#include "psiChemistryCombustionModel.H"
 #include "spray.H"
 #include "psiChemistryModel.H"
 #include "chemistrySolver.H"
@@ -54,7 +54,6 @@ int main(int argc, char *argv[])
     #include "createEngineMesh.H"
     #include "createFields.H"
     #include "readGravitationalAcceleration.H"
-    #include "readCombustionProperties.H"
     #include "createSpray.H"
     #include "initContinuityErrs.H"
     #include "readEngineTimeControls.H"
@@ -82,29 +81,6 @@ int main(int argc, char *argv[])
 
         dieselSpray.evolve();
 
-        Info<< "Solving chemistry" << endl;
-
-        chemistry.solve
-        (
-            runTime.value() - runTime.deltaTValue(),
-            runTime.deltaTValue()
-        );
-
-        // turbulent time scale
-        {
-            volScalarField tk
-            (
-                Cmix*sqrt(turbulence->muEff()/rho/turbulence->epsilon())
-            );
-            volScalarField tc(chemistry.tc());
-
-            // Chalmers PaSR model
-            kappa = (runTime.deltaT() + tc)/(runTime.deltaT() + tc + tk);
-        }
-
-        chemistrySh = kappa*chemistry.Sh()();
-
-
         #include "rhoEqn.H"
 
         for (pimple.start(); pimple.loop(); pimple++)
@@ -130,10 +106,7 @@ int main(int argc, char *argv[])
 
         rho = thermo.rho();
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
+        runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
diff --git a/applications/solvers/combustion/dieselEngineFoam/hsEqn.H b/applications/solvers/combustion/dieselEngineFoam/hsEqn.H
index 7ae59feb8199fc909983ed77cdba242f4d443b6c..7c0b7f9dc3327b65fa9a1a49b8e7e33e2e0a92e3 100644
--- a/applications/solvers/combustion/dieselEngineFoam/hsEqn.H
+++ b/applications/solvers/combustion/dieselEngineFoam/hsEqn.H
@@ -1,14 +1,21 @@
 {
-    solve
+    fvScalarMatrix hsEqn
     (
         fvm::ddt(rho, hs)
       + mvConvection->fvmDiv(phi, hs)
       - fvm::laplacian(turbulence->alphaEff(), hs)
      ==
-       DpDt
-     + dieselSpray.heatTransferSource()().dimensionedInternalField()
-     + chemistrySh
+        DpDt
+      + combustion->Sh()
+      + dieselSpray.heatTransferSource()()
+
     );
 
+    hsEqn.relax();
+    hsEqn.solve();
+
     thermo.correct();
+
+    Info<< "min/max(T) = "
+        << min(T).value() << ", " << max(T).value() << endl;
 }
diff --git a/applications/solvers/combustion/dieselEngineFoam/readCombustionProperties.H b/applications/solvers/combustion/dieselEngineFoam/readCombustionProperties.H
deleted file mode 100644
index 84cf9b9756a8ca420c58fdfeb5f64b3fcf6f0843..0000000000000000000000000000000000000000
--- a/applications/solvers/combustion/dieselEngineFoam/readCombustionProperties.H
+++ /dev/null
@@ -1,18 +0,0 @@
-Info<< "Reading combustion properties\n" << endl;
-
-IOdictionary combustionProperties
-(
-    IOobject
-    (
-        "combustionProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE
-    )
-);
-
-dimensionedScalar Cmix
-(
-    combustionProperties.lookup("Cmix")
-);
diff --git a/applications/solvers/combustion/dieselFoam/Make/options b/applications/solvers/combustion/dieselFoam/Make/options
index 124371575d752b3051af50923a0bde4f20fc3609..4083a59e9f6d148b4b2206fd2053b78c874e7383 100644
--- a/applications/solvers/combustion/dieselFoam/Make/options
+++ b/applications/solvers/combustion/dieselFoam/Make/options
@@ -14,7 +14,8 @@ EXE_INC = \
     -I$(LIB_SRC)/thermophysicalModels/laminarFlameSpeed/lnInclude \
     -I$(LIB_SRC)/../applications/solvers/reactionThermo/XiFoam \
     -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \
-    -I$(LIB_SRC)/ODE/lnInclude
+    -I$(LIB_SRC)/ODE/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude
 
 EXE_LIBS = \
     -lcompressibleTurbulenceModel \
@@ -33,4 +34,5 @@ EXE_LIBS = \
     -lchemistryModel \
     -lODE \
     -ldistributionModels \
-    -lfiniteVolume
+    -lfiniteVolume \
+    -lcombustionModels
diff --git a/applications/solvers/combustion/dieselFoam/dieselFoam.C b/applications/solvers/combustion/dieselFoam/dieselFoam.C
index 7fd74102476c6aab20528e167dfc4ec0b152d2db..45ee55195cd9d5cfa26a3a21ef15e7a6439d532d 100644
--- a/applications/solvers/combustion/dieselFoam/dieselFoam.C
+++ b/applications/solvers/combustion/dieselFoam/dieselFoam.C
@@ -30,12 +30,11 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hCombustionThermo.H"
+#include "psiChemistryCombustionModel.H"
 #include "turbulenceModel.H"
-#include "spray.H"
 #include "psiChemistryModel.H"
 #include "chemistrySolver.H"
-
+#include "spray.H"
 #include "multivariateScheme.H"
 #include "IFstream.H"
 #include "OFstream.H"
@@ -52,7 +51,6 @@ int main(int argc, char *argv[])
     #include "createMesh.H"
     #include "createFields.H"
     #include "readGravitationalAcceleration.H"
-    #include "readCombustionProperties.H"
     #include "createSpray.H"
     #include "initContinuityErrs.H"
     #include "readTimeControls.H"
@@ -79,26 +77,6 @@ int main(int argc, char *argv[])
 
         Info<< "Solving chemistry" << endl;
 
-        chemistry.solve
-        (
-            runTime.value() - runTime.deltaTValue(),
-            runTime.deltaTValue()
-        );
-
-        // turbulent time scale
-        {
-            volScalarField tk
-            (
-                Cmix*sqrt(turbulence->muEff()/rho/turbulence->epsilon())
-            );
-            volScalarField tc(chemistry.tc());
-
-            // Chalmers PaSR model
-            kappa = (runTime.deltaT() + tc)/(runTime.deltaT()+tc+tk);
-        }
-
-        chemistrySh = kappa*chemistry.Sh()();
-
         #include "rhoEqn.H"
 
         // --- Pressure-velocity PIMPLE corrector loop
@@ -124,10 +102,7 @@ int main(int argc, char *argv[])
 
         rho = thermo.rho();
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
+        runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
diff --git a/applications/solvers/combustion/fireFoam/YhsEqn.H b/applications/solvers/combustion/fireFoam/YhsEqn.H
index aed41a4431359997c531556cab966fd23d2c514e..299eb64ab7669e20893c3aa614d34e7a66af2653 100644
--- a/applications/solvers/combustion/fireFoam/YhsEqn.H
+++ b/applications/solvers/combustion/fireFoam/YhsEqn.H
@@ -20,7 +20,6 @@ tmp<fv::convectionScheme<scalar> > mvConvection
         if (Y[i].name() != inertSpecie)
         {
             volScalarField& Yi = Y[i];
-            fvScalarMatrix R(combustion->R(Yi));
 
             fvScalarMatrix YiEqn
             (
@@ -30,7 +29,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection
               ==
                 parcels.SYi(i, Yi)
               + surfaceFilm.Srho(i)
-              + R
+              + combustion->R(Yi)
             );
 
             YiEqn.relax();
@@ -55,7 +54,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection
       - fvm::laplacian(turbulence->alphaEff(), hs)
      ==
         DpDt
-      + dQ
+      + combustion->Sh()
       + radiation->Shs(thermo)
       + parcels.Sh(hs)
       + surfaceFilm.Sh()
@@ -66,5 +65,6 @@ tmp<fv::convectionScheme<scalar> > mvConvection
 
     thermo.correct();
 
-    Info<< "min/max(T) = " << min(T).value() << ", " << max(T).value() << endl;
+    Info<< "min/max(T) = "
+        << min(T).value() << ", " << max(T).value() << endl;
 }
diff --git a/applications/solvers/combustion/fireFoam/createFields.H b/applications/solvers/combustion/fireFoam/createFields.H
index f1e152dc320b47f428e326350f66aae48c947338..afabd393c74464a69451c860f700aeef2222e759 100644
--- a/applications/solvers/combustion/fireFoam/createFields.H
+++ b/applications/solvers/combustion/fireFoam/createFields.H
@@ -1,10 +1,16 @@
-    Info<< "Reading thermophysical properties\n" << endl;
+    Info<< "Creating combustion model\n" << endl;
 
-    autoPtr<hsCombustionThermo> pThermo
+    autoPtr<combustionModels::psiCombustionModel> combustion
     (
-        hsCombustionThermo::New(mesh)
+        combustionModels::psiCombustionModel::New
+        (
+            mesh
+        )
     );
-    hsCombustionThermo& thermo = pThermo();
+
+    Info<< "Reading thermophysical properties\n" << endl;
+
+    hsCombustionThermo& thermo = combustion->thermo();
 
     SLGThermo slgThermo(mesh, thermo);
 
@@ -60,30 +66,8 @@
         )
     );
 
-    IOdictionary combustionProperties
-    (
-        IOobject
-        (
-            "combustionProperties",
-            runTime.constant(),
-            mesh,
-            IOobject::MUST_READ_IF_MODIFIED,
-            IOobject::NO_WRITE
-        )
-    );
-
-    Info<< "Creating combustion model\n" << endl;
-    autoPtr<combustionModel> combustion
-    (
-        combustionModel::combustionModel::New
-        (
-            combustionProperties,
-            thermo,
-            turbulence(),
-            phi,
-            rho
-        )
-    );
+    // Set the turbulence into the combustion model
+    combustion->setTurbulence(turbulence());
 
     volScalarField dQ
     (
@@ -96,7 +80,7 @@
             IOobject::AUTO_WRITE
         ),
         mesh,
-        dimensionedScalar("dQ", dimMass/pow3(dimTime)/dimLength, 0.0)
+        dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
     );
 
     Info<< "Creating field DpDt\n" << endl;
diff --git a/applications/solvers/combustion/fireFoam/fireFoam.C b/applications/solvers/combustion/fireFoam/fireFoam.C
index 7c58a722d1676bfa6a6845e754df62344e9c386a..89968c6e5878160c3b7e32ce45170f2d448f88b4 100644
--- a/applications/solvers/combustion/fireFoam/fireFoam.C
+++ b/applications/solvers/combustion/fireFoam/fireFoam.C
@@ -38,9 +38,8 @@ Description
 #include "pyrolysisModel.H"
 #include "radiationModel.H"
 #include "SLGThermo.H"
-#include "hsCombustionThermo.H"
 #include "solidChemistryModel.H"
-#include "combustionModel.H"
+#include "psiCombustionModel.H"
 #include "pimpleControl.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -51,7 +50,6 @@ int main(int argc, char *argv[])
 
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "createClouds.H"
diff --git a/applications/solvers/combustion/fireFoam/readChemistryProperties.H b/applications/solvers/combustion/fireFoam/readChemistryProperties.H
deleted file mode 100644
index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000
--- a/applications/solvers/combustion/fireFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/combustion/reactingFoam/Make/options b/applications/solvers/combustion/reactingFoam/Make/options
index 6386af8c557fcea5ace76bfe7c203c36ab85cd6e..8eb6d4cabdac7d75a037f5f639685739bdb30b45 100644
--- a/applications/solvers/combustion/reactingFoam/Make/options
+++ b/applications/solvers/combustion/reactingFoam/Make/options
@@ -5,7 +5,8 @@ EXE_INC = \
     -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
     -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \
     -I$(LIB_SRC)/ODE/lnInclude \
-    -I$(LIB_SRC)/finiteVolume/lnInclude
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude
 
 EXE_LIBS = \
     -lcompressibleTurbulenceModel \
@@ -16,4 +17,5 @@ EXE_LIBS = \
     -lbasicThermophysicalModels \
     -lchemistryModel \
     -lODE \
-    -lfiniteVolume
+    -lfiniteVolume \
+    -lcombustionModels
diff --git a/applications/solvers/combustion/reactingFoam/YEqn.H b/applications/solvers/combustion/reactingFoam/YEqn.H
index 8d63a12868554b2d7c785d97549537c736ac8fa9..87b25079ff6dc5b31f09a60fbab9345d56aa2bc5 100644
--- a/applications/solvers/combustion/reactingFoam/YEqn.H
+++ b/applications/solvers/combustion/reactingFoam/YEqn.H
@@ -10,6 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection
 );
 
 {
+    combustion->correct();
+    dQ = combustion->dQ();
     label inertIndex = -1;
     volScalarField Yt(0.0*Y[0]);
 
@@ -19,16 +21,18 @@ tmp<fv::convectionScheme<scalar> > mvConvection
         {
             volScalarField& Yi = Y[i];
 
-            solve
+            fvScalarMatrix YiEqn
             (
                 fvm::ddt(rho, Yi)
               + mvConvection->fvmDiv(phi, Yi)
               - fvm::laplacian(turbulence->muEff(), Yi)
              ==
-                kappa*chemistry.RR(i),
-                mesh.solver("Yi")
+                combustion->R(Yi)
             );
 
+            YiEqn.relax();
+            YiEqn.solve(mesh.solver("Yi"));
+
             Yi.max(0.0);
             Yt += Yi;
         }
diff --git a/applications/solvers/combustion/reactingFoam/chemistry.H b/applications/solvers/combustion/reactingFoam/chemistry.H
deleted file mode 100644
index 99f418af6f10ac69b44d08fc2271e2dd79c73fc4..0000000000000000000000000000000000000000
--- a/applications/solvers/combustion/reactingFoam/chemistry.H
+++ /dev/null
@@ -1,44 +0,0 @@
-if (chemistry.chemistry())
-{
-    Info<< "Solving chemistry" << endl;
-
-    chemistry.solve
-    (
-        runTime.value() - runTime.deltaTValue(),
-        runTime.deltaTValue()
-    );
-
-    // turbulent time scale
-    if (turbulentReaction)
-    {
-        tmp<volScalarField> tepsilon(turbulence->epsilon());
-        const volScalarField& epsilon = tepsilon();
-        tmp<volScalarField> tmuEff(turbulence->muEff());
-        const volScalarField& muEff = tmuEff();
-        tmp<volScalarField> ttc(chemistry.tc());
-        const volScalarField& tc = ttc();
-
-        forAll(epsilon, i)
-        {
-            if (epsilon[i] > 0)
-            {
-                // Chalmers PaSR model
-                scalar tk = Cmix.value()*Foam::sqrt(muEff[i]/rho[i]/epsilon[i]);
-                kappa[i] =
-                    (runTime.deltaTValue() + tc[i])
-                   /(runTime.deltaTValue() + tc[i] + tk);
-            }
-            else
-            {
-                // Return to laminar combustion
-                kappa[i] = 1.0;
-            }
-        }
-    }
-    else
-    {
-        kappa = 1.0;
-    }
-
-    chemistrySh = kappa*chemistry.Sh()();
-}
diff --git a/applications/solvers/combustion/reactingFoam/createFields.H b/applications/solvers/combustion/reactingFoam/createFields.H
index a2f016e04622295e17aa3c5a67915e5f3feae69c..7cf94f754d9a205246efd838f58564f236aa5c0f 100644
--- a/applications/solvers/combustion/reactingFoam/createFields.H
+++ b/applications/solvers/combustion/reactingFoam/createFields.H
@@ -1,9 +1,14 @@
-Info<< nl << "Reading thermophysicalProperties" << endl;
-autoPtr<psiChemistryModel> pChemistry
+Info<< "Creating combustion model\n" << endl;
+
+autoPtr<combustionModels::psiChemistryCombustionModel> combustion
 (
-    psiChemistryModel::New(mesh)
+    combustionModels::psiChemistryCombustionModel::New
+    (
+        mesh
+    )
 );
-psiChemistryModel& chemistry = pChemistry();
+
+psiChemistryModel& chemistry = combustion->pChemistry();
 
 hsCombustionThermo& thermo = chemistry.thermo();
 
@@ -45,20 +50,6 @@ const volScalarField& T = thermo.T();
 
 #include "compressibleCreatePhi.H"
 
-volScalarField kappa
-(
-    IOobject
-    (
-        "kappa",
-        runTime.timeName(),
-        mesh,
-        IOobject::NO_READ,
-        IOobject::AUTO_WRITE
-    ),
-    mesh,
-    dimensionedScalar("zero", dimless, 0.0)
-);
-
 Info << "Creating turbulence model.\n" << nl;
 autoPtr<compressible::turbulenceModel> turbulence
 (
@@ -71,6 +62,9 @@ autoPtr<compressible::turbulenceModel> turbulence
     )
 );
 
+// Set the turbulence into the combustion model
+combustion->setTurbulence(turbulence());
+
 Info<< "Creating field DpDt\n" << endl;
 volScalarField DpDt
 (
@@ -85,16 +79,16 @@ forAll(Y, i)
 }
 fields.add(hs);
 
-DimensionedField<scalar, volMesh> chemistrySh
+volScalarField dQ
 (
     IOobject
     (
-        "chemistry::Sh",
+        "dQ",
         runTime.timeName(),
         mesh,
         IOobject::NO_READ,
-        IOobject::NO_WRITE
+        IOobject::AUTO_WRITE
     ),
     mesh,
-    dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0)
+    dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
 );
diff --git a/applications/solvers/combustion/reactingFoam/hsEqn.H b/applications/solvers/combustion/reactingFoam/hsEqn.H
index e3fa4e7a135adb1539de8d1e548329a8f97c7a06..de1a85fddf5365c2be897aaeff7ffa8a42cd35cc 100644
--- a/applications/solvers/combustion/reactingFoam/hsEqn.H
+++ b/applications/solvers/combustion/reactingFoam/hsEqn.H
@@ -7,7 +7,7 @@
 //      - fvm::laplacian(turbulence->muEff(), hs)  // unit lewis no.
      ==
         DpDt
-      + chemistrySh
+      + combustion->Sh()
     );
 
     hsEqn.relax();
diff --git a/applications/solvers/combustion/reactingFoam/reactingFoam.C b/applications/solvers/combustion/reactingFoam/reactingFoam.C
index ca156c3f7f305814548a1cfe97c372f9a3b0da92..75fb9ad71d59f5b7cdbf22dc2c88a00c0a728ee0 100644
--- a/applications/solvers/combustion/reactingFoam/reactingFoam.C
+++ b/applications/solvers/combustion/reactingFoam/reactingFoam.C
@@ -30,10 +30,8 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hCombustionThermo.H"
 #include "turbulenceModel.H"
-#include "psiChemistryModel.H"
-#include "chemistrySolver.H"
+#include "psiChemistryCombustionModel.H"
 #include "multivariateScheme.H"
 #include "pimpleControl.H"
 
@@ -44,7 +42,6 @@ int main(int argc, char *argv[])
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "initContinuityErrs.H"
@@ -67,7 +64,6 @@ int main(int argc, char *argv[])
         runTime++;
         Info<< "Time = " << runTime.timeName() << nl << endl;
 
-        #include "chemistry.H"
         #include "rhoEqn.H"
 
         for (pimple.start(); pimple.loop(); pimple++)
@@ -88,11 +84,6 @@ int main(int argc, char *argv[])
             }
         }
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
-
         runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
diff --git a/applications/solvers/combustion/reactingFoam/readChemistryProperties.H b/applications/solvers/combustion/reactingFoam/readChemistryProperties.H
deleted file mode 100644
index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000
--- a/applications/solvers/combustion/reactingFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/combustion/rhoReactingFoam/Make/options b/applications/solvers/combustion/rhoReactingFoam/Make/options
index d6306816fd8174d34268711983ddb53cdb4eb040..5a5df2ed7b6f552e4d6a281f8b0de7cff35470fc 100644
--- a/applications/solvers/combustion/rhoReactingFoam/Make/options
+++ b/applications/solvers/combustion/rhoReactingFoam/Make/options
@@ -6,7 +6,8 @@ EXE_INC = \
     -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \
     -I$(LIB_SRC)/ODE/lnInclude \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
-    -I$(FOAM_SOLVERS)/combustion/reactingFoam
+    -I$(FOAM_SOLVERS)/combustion/reactingFoam \
+    -I$(LIB_SRC)/combustionModels/lnInclude
 
 
 EXE_LIBS = \
@@ -18,4 +19,5 @@ EXE_LIBS = \
     -lbasicThermophysicalModels \
     -lchemistryModel \
     -lODE \
-    -lfiniteVolume
+    -lfiniteVolume \
+    -lcombustionModels
diff --git a/applications/solvers/combustion/rhoReactingFoam/YEqn.H b/applications/solvers/combustion/rhoReactingFoam/YEqn.H
index 8d63a12868554b2d7c785d97549537c736ac8fa9..3a371f035c6ad2c6c64e6f09cf99b0d633eb9734 100644
--- a/applications/solvers/combustion/rhoReactingFoam/YEqn.H
+++ b/applications/solvers/combustion/rhoReactingFoam/YEqn.H
@@ -10,6 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection
 );
 
 {
+    combustion->correct();
+    dQ = combustion->dQ();
     label inertIndex = -1;
     volScalarField Yt(0.0*Y[0]);
 
@@ -19,14 +21,13 @@ tmp<fv::convectionScheme<scalar> > mvConvection
         {
             volScalarField& Yi = Y[i];
 
-            solve
+            fvScalarMatrix YiEqn
             (
                 fvm::ddt(rho, Yi)
               + mvConvection->fvmDiv(phi, Yi)
               - fvm::laplacian(turbulence->muEff(), Yi)
              ==
-                kappa*chemistry.RR(i),
-                mesh.solver("Yi")
+                combustion->R(Yi)
             );
 
             Yi.max(0.0);
diff --git a/applications/solvers/combustion/rhoReactingFoam/createFields.H b/applications/solvers/combustion/rhoReactingFoam/createFields.H
index d58e082f5ba433ad1cc0925ebb5c69c114b9fe9b..65860a67eb26605f0501062cdbfbebf9da5949f8 100644
--- a/applications/solvers/combustion/rhoReactingFoam/createFields.H
+++ b/applications/solvers/combustion/rhoReactingFoam/createFields.H
@@ -1,9 +1,14 @@
-Info<< nl << "Reading thermophysicalProperties" << endl;
-autoPtr<rhoChemistryModel> pChemistry
+Info<< "Creating combustion model\n" << endl;
+
+autoPtr<combustionModels::rhoChemistryCombustionModel> combustion
 (
-    rhoChemistryModel::New(mesh)
+    combustionModels::rhoChemistryCombustionModel::New
+    (
+        mesh
+    )
 );
-rhoChemistryModel& chemistry = pChemistry();
+
+rhoChemistryModel& chemistry = combustion->pChemistry();
 
 hsReactionThermo& thermo = chemistry.thermo();
 
@@ -46,19 +51,6 @@ const volScalarField& T = thermo.T();
 
 #include "compressibleCreatePhi.H"
 
-volScalarField kappa
-(
-    IOobject
-    (
-        "kappa",
-        runTime.timeName(),
-        mesh,
-        IOobject::NO_READ,
-        IOobject::AUTO_WRITE
-    ),
-    mesh,
-    dimensionedScalar("zero", dimless, 0.0)
-);
 
 Info << "Creating turbulence model.\n" << nl;
 autoPtr<compressible::turbulenceModel> turbulence
@@ -72,6 +64,9 @@ autoPtr<compressible::turbulenceModel> turbulence
     )
 );
 
+// Set the turbulence into the combustion model
+combustion->setTurbulence(turbulence());
+
 Info<< "Creating field DpDt\n" << endl;
 volScalarField DpDt
 (
@@ -86,16 +81,16 @@ forAll(Y, i)
 }
 fields.add(hs);
 
-DimensionedField<scalar, volMesh> chemistrySh
+volScalarField dQ
 (
     IOobject
     (
-        "chemistry::Sh",
+        "dQ",
         runTime.timeName(),
         mesh,
         IOobject::NO_READ,
-        IOobject::NO_WRITE
+        IOobject::AUTO_WRITE
     ),
     mesh,
-    dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0)
+    dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
 );
diff --git a/applications/solvers/combustion/rhoReactingFoam/hsEqn.H b/applications/solvers/combustion/rhoReactingFoam/hsEqn.H
index 81bd6ea9d7bb4a03834d5db86deb7d728eb3d9db..01f85ac1da7432acf7a54a555dc8283af58979d3 100644
--- a/applications/solvers/combustion/rhoReactingFoam/hsEqn.H
+++ b/applications/solvers/combustion/rhoReactingFoam/hsEqn.H
@@ -4,9 +4,10 @@
         fvm::ddt(rho, hs)
       + mvConvection->fvmDiv(phi, hs)
       - fvm::laplacian(turbulence->alphaEff(), hs)
+//    - fvm::laplacian(turbulence->muEff(), hs)  // unit lewis no.
      ==
         DpDt
-      + chemistrySh
+      + combustion->Sh()
     );
 
     hsEqn.relax();
@@ -14,6 +15,6 @@
 
     thermo.correct();
 
-    Info<< "T gas min/max   = " << min(T).value() << ", "
-        << max(T).value() << endl;
+   Info<< "min/max(T) = "
+        << min(T).value() << ", " << max(T).value() << endl;
 }
diff --git a/applications/solvers/combustion/rhoReactingFoam/readChemistryProperties.H b/applications/solvers/combustion/rhoReactingFoam/readChemistryProperties.H
deleted file mode 100644
index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000
--- a/applications/solvers/combustion/rhoReactingFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C b/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C
index 9c22e63c51188674a5ea8d4ccb608b38e712ec93..afa7d9771da6b6ce722385bbd30abb6df5b86ec7 100644
--- a/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C
+++ b/applications/solvers/combustion/rhoReactingFoam/rhoReactingFoam.C
@@ -31,10 +31,8 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hReactionThermo.H"
+#include "rhoChemistryCombustionModel.H"
 #include "turbulenceModel.H"
-#include "rhoChemistryModel.H"
-#include "chemistrySolver.H"
 #include "multivariateScheme.H"
 #include "pimpleControl.H"
 
@@ -45,7 +43,6 @@ int main(int argc, char *argv[])
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "initContinuityErrs.H"
@@ -68,7 +65,6 @@ int main(int argc, char *argv[])
         runTime++;
         Info<< "Time = " << runTime.timeName() << nl << endl;
 
-        #include "chemistry.H"
         #include "rhoEqn.H"
 
         // --- Pressure-velocity PIMPLE corrector loop
@@ -92,10 +88,7 @@ int main(int argc, char *argv[])
 
         rho = thermo.rho();
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
+        runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C b/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C
index a9da394140e253851b1e7d85221100d6467fb9fd..9f2955bc2f8773489e8297ec900c7964e2874b22 100644
--- a/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C
+++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/LTSReactingParcelFoam.C
@@ -36,11 +36,9 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hReactionThermo.H"
 #include "turbulenceModel.H"
 #include "basicReactingMultiphaseCloud.H"
-#include "rhoChemistryModel.H"
-#include "chemistrySolver.H"
+#include "rhoChemistryCombustionModel.H"
 #include "radiationModel.H"
 #include "porousZones.H"
 #include "timeActivatedExplicitSource.H"
@@ -75,7 +73,6 @@ int main(int argc, char *argv[])
 
     while (runTime.run())
     {
-        #include "readChemistryProperties.H"
         #include "readAdditionalSolutionControls.H"
         #include "readTimeControls.H"
 
@@ -85,7 +82,6 @@ int main(int argc, char *argv[])
 
         parcels.evolve();
 
-        #include "chemistry.H"
         #include "timeScales.H"
 
         #include "rhoEqn.H"
@@ -111,10 +107,7 @@ int main(int argc, char *argv[])
             }
         }
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
+        runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options b/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options
index 91ee4a594d0a3ff79918481ebcc7764fe2823dee..36e9c44270ad2859e3d4a7ac6ecfe803157c08b0 100644
--- a/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options
+++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/Make/options
@@ -20,7 +20,8 @@ EXE_INC = \
     -I$(LIB_SRC)/ODE/lnInclude \
     -I$(LIB_SRC)/regionModels/regionModel/lnInclude \
     -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \
-    -I$(LIB_SRC)/sampling/lnInclude
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude
 
 EXE_LIBS = \
     -lfiniteVolume \
@@ -44,4 +45,5 @@ EXE_LIBS = \
     -lODE \
     -lregionModels \
     -lsurfaceFilmModels \
-    -lsampling
+    -lsampling \
+    -lcombustionModels
diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H
index c941691d66ccff733405ec92982e848bb15b0d53..625c940a663b63f83858861cf894e49bb04d0875 100644
--- a/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H
+++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/YEqn.H
@@ -9,6 +9,9 @@ tmp<fv::convectionScheme<scalar> > mvConvection
     )
 );
 
+combustion->correct();
+dQ = combustion->dQ();
+
 if (solveSpecies)
 {
     label inertIndex = -1;
@@ -19,14 +22,15 @@ if (solveSpecies)
         if (Y[i].name() != inertSpecie)
         {
             volScalarField& Yi = Y[i];
+
             solve
             (
                 fvm::ddt(rho, Yi)
               + mvConvection->fvmDiv(phi, Yi)
               - fvm::laplacian(turbulence->muEff(), Yi)
-              ==
+             ==
                 parcels.SYi(i, Yi)
-              + kappa*chemistry.RR(i)().dimensionedInternalField()
+              + combustion->R(Yi)
               + massSource.Su(i),
                 mesh.solver("Yi")
             );
diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H
index 103ead9d78f33787d964777673c78d08e943371c..f1f6173cd611633a7d7115f4f476f1dba583c2e1 100644
--- a/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H
+++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/createFields.H
@@ -1,10 +1,14 @@
-    Info<< "Reading thermophysical properties\n" << endl;
+    Info<< "Creating combustion model\n" << endl;
 
-    autoPtr<rhoChemistryModel> pChemistry
+    autoPtr<combustionModels::rhoChemistryCombustionModel> combustion
     (
-        rhoChemistryModel::New(mesh)
+        combustionModels::rhoChemistryCombustionModel::New
+        (
+            mesh
+        )
     );
-    rhoChemistryModel& chemistry = pChemistry();
+
+    rhoChemistryModel& chemistry = combustion->pChemistry();
 
     hsReactionThermo& thermo = chemistry.thermo();
 
@@ -57,20 +61,6 @@
 
     #include "compressibleCreatePhi.H"
 
-    DimensionedField<scalar, volMesh> kappa
-    (
-        IOobject
-        (
-            "kappa",
-            runTime.timeName(),
-            mesh,
-            IOobject::NO_READ,
-            IOobject::AUTO_WRITE
-        ),
-        mesh,
-        dimensionedScalar("zero", dimless, 0.0)
-    );
-
     dimensionedScalar rhoMax
     (
         mesh.solutionDict().subDict("PIMPLE").lookup("rhoMax")
@@ -93,6 +83,9 @@
         )
     );
 
+    // Set the turbulence into the combustion model
+    combustion->setTurbulence(turbulence());
+
     Info<< "Creating multi-variate interpolation scheme\n" << endl;
     multivariateSurfaceInterpolationScheme<scalar>::fieldTable fields;
 
@@ -102,20 +95,21 @@
     }
     fields.add(hs);
 
-    DimensionedField<scalar, volMesh> chemistrySh
+    volScalarField dQ
     (
         IOobject
         (
-            "chemistry::Sh",
+            "dQ",
             runTime.timeName(),
             mesh,
             IOobject::NO_READ,
-            IOobject::NO_WRITE
+            IOobject::AUTO_WRITE
         ),
         mesh,
-        dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0)
+        dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
     );
 
+
     volScalarField rDeltaT
     (
         IOobject
diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H
index 5954b1217e6cbce2f227c60b9dfa158f7ca54343..55bf1d6dd0cdc850c8bd6b3364d51631f0c1106e 100644
--- a/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H
+++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/hsEqn.H
@@ -9,7 +9,7 @@
       + parcels.Sh(hs)
       + radiation->Shs(thermo)
       + energySource.Su()
-      + chemistrySh
+      + combustion->Sh()
     );
 
     hsEqn.solve();
diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/readChemistryProperties.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/readChemistryProperties.H
deleted file mode 100644
index e742e9fea78c2d196b07e96196b20ea8a2cf53f1..0000000000000000000000000000000000000000
--- a/applications/solvers/lagrangian/LTSReactingParcelFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-// Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H b/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H
index e6d0fa85c4919cb322b30620c2850d408fb0fb8f..05fe8a1c7713453e650d8e0416b2963fe5f5b8ef 100644
--- a/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H
+++ b/applications/solvers/lagrangian/LTSReactingParcelFoam/timeScales.H
@@ -77,7 +77,7 @@ Info<< "Time scales min/max:" << endl;
                 DpDt
               + parcels.hsTrans()/(mesh.V()*runTime.deltaT())
               + energySource.Su()
-              + chemistrySh
+              + combustion->Sh()()
             )
            /rho
         );
diff --git a/applications/solvers/lagrangian/coalChemistryFoam/Make/options b/applications/solvers/lagrangian/coalChemistryFoam/Make/options
index f2f8d1e75874dd9361753b992bad7d1847ff0dc1..e8a871837378ef43f984a402c41889bca9f64204 100644
--- a/applications/solvers/lagrangian/coalChemistryFoam/Make/options
+++ b/applications/solvers/lagrangian/coalChemistryFoam/Make/options
@@ -21,6 +21,7 @@ EXE_INC = \
     -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \
     -I$(LIB_SRC)/ODE/lnInclude \
     -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude \
     -I$(FOAM_SOLVERS)/combustion/reactingFoam
 
 
@@ -47,4 +48,5 @@ EXE_LIBS = \
     -lregionModels \
     -lsurfaceFilmModels \
     -lODE \
-    -lsampling
+    -lsampling \
+    -lcombustionModels
diff --git a/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H b/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H
index be82d6e2b6019af547a5fe2f023be66da02483a7..e9bd1c6581b842fb1ccc9739d4c8370546d8fdc8 100644
--- a/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H
+++ b/applications/solvers/lagrangian/coalChemistryFoam/YEqn.H
@@ -11,6 +11,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection
 
 
 {
+    combustion->correct();
+    dQ = combustion->dQ();
     label inertIndex = -1;
     volScalarField Yt(0.0*Y[0]);
 
@@ -19,16 +21,20 @@ tmp<fv::convectionScheme<scalar> > mvConvection
         if (Y[i].name() != inertSpecie)
         {
             volScalarField& Yi = Y[i];
-            solve
+
+            fvScalarMatrix YiEqn
             (
                 fvm::ddt(rho, Yi)
               + mvConvection->fvmDiv(phi, Yi)
               - fvm::laplacian(turbulence->muEff(), Yi)
               ==
                 coalParcels.SYi(i, Yi)
-              + kappa*chemistry.RR(i)().dimensionedInternalField()
+              + combustion->R(Yi)
             );
 
+            YiEqn.relax();
+            YiEqn.solve(mesh.solver("Yi"));
+
             Yi.max(0.0);
             Yt += Yi;
         }
diff --git a/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C b/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C
index 3d0eabcef8e21afc2ede2401710d3b26a3531ee4..1e6daed0fde4e02f5c160b4716a9d02ff73cea3c 100644
--- a/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C
+++ b/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C
@@ -36,12 +36,10 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hCombustionThermo.H"
 #include "turbulenceModel.H"
 #include "basicThermoCloud.H"
 #include "coalCloud.H"
-#include "psiChemistryModel.H"
-#include "chemistrySolver.H"
+#include "psiChemistryCombustionModel.H"
 #include "timeActivatedExplicitSource.H"
 #include "radiationModel.H"
 #include "SLGThermo.H"
@@ -55,7 +53,6 @@ int main(int argc, char *argv[])
 
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "createClouds.H"
@@ -88,7 +85,6 @@ int main(int argc, char *argv[])
 
         limestoneParcels.evolve();
 
-        #include "chemistry.H"
         #include "rhoEqn.H"
 
         // --- Pressure-velocity PIMPLE corrector loop
@@ -112,10 +108,7 @@ int main(int argc, char *argv[])
 
         rho = thermo.rho();
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
+        runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
diff --git a/applications/solvers/lagrangian/coalChemistryFoam/createFields.H b/applications/solvers/lagrangian/coalChemistryFoam/createFields.H
index 97e409215c08153dca0a360bdc027fffb6581172..4d0a2b7408dc36caa486c9369b8ce7e6f31d582d 100644
--- a/applications/solvers/lagrangian/coalChemistryFoam/createFields.H
+++ b/applications/solvers/lagrangian/coalChemistryFoam/createFields.H
@@ -1,10 +1,14 @@
-    Info<< "Reading thermophysical properties\n" << endl;
+    Info<< "Creating combustion model\n" << endl;
 
-    autoPtr<psiChemistryModel> pChemistry
+    autoPtr<combustionModels::psiChemistryCombustionModel> combustion
     (
-        psiChemistryModel::New(mesh)
+        combustionModels::psiChemistryCombustionModel::New
+        (
+            mesh
+        )
     );
-    psiChemistryModel& chemistry = pChemistry();
+
+    psiChemistryModel& chemistry = combustion->pChemistry();
 
     hsCombustionThermo& thermo = chemistry.thermo();
 
@@ -96,20 +100,6 @@
 
     #include "compressibleCreatePhi.H"
 
-    DimensionedField<scalar, volMesh> kappa
-    (
-        IOobject
-        (
-            "kappa",
-            runTime.timeName(),
-            mesh,
-            IOobject::NO_READ,
-            IOobject::AUTO_WRITE
-        ),
-        mesh,
-        dimensionedScalar("zero", dimless, 0.0)
-    );
-
     Info<< "Creating turbulence model\n" << endl;
     autoPtr<compressible::turbulenceModel> turbulence
     (
@@ -122,6 +112,9 @@
         )
     );
 
+    // Set the turbulence into the combustion model
+    combustion->setTurbulence(turbulence());
+
     Info<< "Creating field DpDt\n" << endl;
     volScalarField DpDt
     (
@@ -138,16 +131,16 @@
         "hs"
     );
 
-    DimensionedField<scalar, volMesh> chemistrySh
+    volScalarField dQ
     (
         IOobject
         (
-            "chemistry::Sh",
+            "dQ",
             runTime.timeName(),
             mesh,
             IOobject::NO_READ,
-            IOobject::NO_WRITE
+            IOobject::AUTO_WRITE
         ),
         mesh,
-        dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0)
+        dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
     );
diff --git a/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H b/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H
index e6901a9c6f255dcf4328c60fa986c45a353deee0..9a4665accdbb10927c30b4d88f230dfb0af7adad 100644
--- a/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H
+++ b/applications/solvers/lagrangian/coalChemistryFoam/hsEqn.H
@@ -6,15 +6,14 @@
       - fvm::laplacian(turbulence->alphaEff(), hs)
      ==
         DpDt
+     +  combustion->Sh()
      +  coalParcels.Sh(hs)
      +  limestoneParcels.Sh(hs)
      +  enthalpySource.Su()
      +  radiation->Shs(thermo)
-     +  chemistrySh
     );
 
     hsEqn.relax();
-
     hsEqn.solve();
 
     thermo.correct();
diff --git a/applications/solvers/lagrangian/coalChemistryFoam/readChemistryProperties.H b/applications/solvers/lagrangian/coalChemistryFoam/readChemistryProperties.H
deleted file mode 100644
index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000
--- a/applications/solvers/lagrangian/coalChemistryFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options
index f2dffe2998bacfbb04d2fd06d7f8f9de0f802905..1abdd721788ff53a8e102167b6e886c7e26e15bb 100644
--- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options
+++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/Make/options
@@ -21,6 +21,7 @@ EXE_INC = \
     -I$(LIB_SRC)/regionModels/regionModel/lnInclude \
     -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \
     -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude \
     -I$(FOAM_SOLVERS)/combustion/reactingFoam
 
 
@@ -46,4 +47,5 @@ EXE_LIBS = \
     -lODE \
     -lregionModels \
     -lsurfaceFilmModels \
-    -lsampling
+    -lsampling \
+    -lcombustionModels
diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H
index 53c6b25d81c1e10fb8f3f0d377ca35d715bf4686..5ef4aaa3a351fa79fd3bfb24ac8144ca112c24c4 100644
--- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H
+++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H
@@ -10,6 +10,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection
     )
 );
 
+combustion->correct();
+dQ = combustion->dQ();
 
 if (solveSpecies)
 {
@@ -21,6 +23,7 @@ if (solveSpecies)
         if (Y[i].name() != inertSpecie)
         {
             volScalarField& Yi = Y[i];
+
             solve
             (
                 fvm::ddt(rho, Yi)
@@ -28,7 +31,7 @@ if (solveSpecies)
               - fvm::laplacian(turbulence->muEff(), Yi)
               ==
                 parcels.SYi(i, Yi)
-              + kappa*chemistry.RR(i)().dimensionedInternalField()
+              + combustion->R(Yi)
               + massSource.Su(i),
                 mesh.solver("Yi")
             );
diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H
index 22d7c1f219e49c8bde15b1fd01bf6e4a20895e4d..ab6b01f9cea220ce72b805249fae37dee8e68c03 100644
--- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H
+++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createFields.H
@@ -1,10 +1,14 @@
-    Info<< "Reading thermophysical properties\n" << endl;
+    Info<< "Creating combustion model\n" << endl;
 
-    autoPtr<rhoChemistryModel> pChemistry
+    autoPtr<combustionModels::rhoChemistryCombustionModel> combustion
     (
-        rhoChemistryModel::New(mesh)
+        combustionModels::rhoChemistryCombustionModel::New
+        (
+            mesh
+        )
     );
-    rhoChemistryModel& chemistry = pChemistry();
+
+    rhoChemistryModel& chemistry = combustion->pChemistry();
 
     hsReactionThermo& thermo = chemistry.thermo();
 
@@ -57,20 +61,6 @@
 
     #include "compressibleCreatePhi.H"
 
-    DimensionedField<scalar, volMesh> kappa
-    (
-        IOobject
-        (
-            "kappa",
-            runTime.timeName(),
-            mesh,
-            IOobject::NO_READ,
-            IOobject::AUTO_WRITE
-        ),
-        mesh,
-        dimensionedScalar("zero", dimless, 0.0)
-    );
-
     Info<< "Creating turbulence model\n" << endl;
     autoPtr<compressible::turbulenceModel> turbulence
     (
@@ -83,6 +73,9 @@
         )
     );
 
+     // Set the turbulence into the combustion model
+    combustion->setTurbulence(turbulence());
+
     Info<< "Creating multi-variate interpolation scheme\n" << endl;
     multivariateSurfaceInterpolationScheme<scalar>::fieldTable fields;
 
@@ -92,16 +85,16 @@
     }
     fields.add(hs);
 
-    DimensionedField<scalar, volMesh> chemistrySh
+    volScalarField dQ
     (
         IOobject
         (
-            "chemistry::Sh",
+            "dQ",
             runTime.timeName(),
             mesh,
             IOobject::NO_READ,
-            IOobject::NO_WRITE
+            IOobject::AUTO_WRITE
         ),
         mesh,
-        dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0)
+        dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
     );
diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H
index 58e0b699433c0f9eb32b548dd512016a003027e6..0e2c61a9ff1b6e8682403b1d2281963f18506042 100644
--- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H
+++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hsEqn.H
@@ -39,7 +39,7 @@
           + parcels.Sh(hs)
           + radiation->Shs(thermo)
           + energySource.Su()
-          + chemistrySh
+          + combustion->Sh()
         );
 
         thermo.correct();
diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C
index 638d83da0c7d8681f62e8727e21ba0b7fc750fe9..e077836709b583922c3ece1d7885c785b213359c 100644
--- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C
+++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C
@@ -40,11 +40,9 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hReactionThermo.H"
 #include "turbulenceModel.H"
 #include "basicReactingMultiphaseCloud.H"
-#include "rhoChemistryModel.H"
-#include "chemistrySolver.H"
+#include "rhoChemistryCombustionModel.H"
 #include "radiationModel.H"
 #include "porousZones.H"
 #include "timeActivatedExplicitSource.H"
@@ -59,7 +57,6 @@ int main(int argc, char *argv[])
 
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "createRadiationModel.H"
@@ -90,7 +87,6 @@ int main(int argc, char *argv[])
 
         parcels.evolve();
 
-        #include "chemistry.H"
         #include "rhoEqn.H"
 
         // --- Pressure-velocity PIMPLE corrector loop
@@ -114,10 +110,7 @@ int main(int argc, char *argv[])
 
         rho = thermo.rho();
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
+        runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/readChemistryProperties.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/readChemistryProperties.H
deleted file mode 100644
index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000
--- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options b/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options
index 6e225cc09231bc0c0d7cd2b39dafd6270885ebf6..3f762b6bd00784de202e89a568afc58bd3425e96 100644
--- a/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options
+++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/Make/options
@@ -20,6 +20,7 @@ EXE_INC = \
     -I$(LIB_SRC)/lagrangian/intermediate/lnInclude \
     -I$(LIB_SRC)/ODE/lnInclude \
     -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude \
     -I$(FOAM_SOLVERS)/combustion/reactingFoam
 
 
@@ -41,4 +42,5 @@ EXE_LIBS = \
     -lsurfaceFilmModels \
     -llagrangianIntermediate \
     -lODE \
-    -lsampling
+    -lsampling \
+    -lcombustionModels
diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H
index db79376614e29b4289c41f54e76c7bdf5c25e9b6..4fad16b57d7c16e55aff80e77583d71d72764eca 100644
--- a/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H
+++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/YEqn.H
@@ -11,6 +11,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection
 
 
 {
+    combustion->correct();
+    dQ = combustion->dQ();
     label inertIndex = -1;
     volScalarField Yt(0.0*Y[0]);
 
@@ -19,6 +21,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection
         if (Y[i].name() != inertSpecie)
         {
             volScalarField& Yi = Y[i];
+
             solve
             (
                 fvm::ddt(rho, Yi)
@@ -27,7 +30,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection
               ==
                 parcels.SYi(i, Yi)
               + surfaceFilm.Srho(i)
-              + kappa*chemistry.RR(i)().dimensionedInternalField(),
+              + combustion->R(Yi),
                 mesh.solver("Yi")
             );
 
diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H
index e2db33f1f7f64960cd07f9898b039970a63c9b76..999515f4309aa2ca8526ee39a3daddaf8ed9d71b 100644
--- a/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H
+++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/createFields.H
@@ -1,10 +1,14 @@
-    Info<< "Reading thermophysical properties\n" << endl;
+    Info<< "Creating combustion model\n" << endl;
 
-    autoPtr<psiChemistryModel> pChemistry
+    autoPtr<combustionModels::psiChemistryCombustionModel> combustion
     (
-        psiChemistryModel::New(mesh)
+        combustionModels::psiChemistryCombustionModel::New
+        (
+            mesh
+        )
     );
-    psiChemistryModel& chemistry = pChemistry();
+
+    psiChemistryModel& chemistry = combustion->pChemistry();
 
     hsCombustionThermo& thermo = chemistry.thermo();
 
@@ -50,21 +54,6 @@
 
     #include "compressibleCreatePhi.H"
 
-    Info<< "Creating field kappa\n" << endl;
-    DimensionedField<scalar, volMesh> kappa
-    (
-        IOobject
-        (
-            "kappa",
-            runTime.timeName(),
-            mesh,
-            IOobject::NO_READ,
-            IOobject::AUTO_WRITE
-        ),
-        mesh,
-        dimensionedScalar("zero", dimless, 0.0)
-    );
-
     Info<< "Creating turbulence model\n" << endl;
     autoPtr<compressible::turbulenceModel> turbulence
     (
@@ -77,6 +66,9 @@
         )
     );
 
+    // Set the turbulence into the combustion model
+    combustion->setTurbulence(turbulence());
+
     Info<< "Creating field DpDt\n" << endl;
     volScalarField DpDt
     (
@@ -131,16 +123,16 @@
         additionalControlsDict.lookup("solvePrimaryRegion")
     );
 
-    DimensionedField<scalar, volMesh> chemistrySh
+    volScalarField dQ
     (
         IOobject
         (
-            "chemistry::Sh",
+            "dQ",
             runTime.timeName(),
             mesh,
             IOobject::NO_READ,
-            IOobject::NO_WRITE
+            IOobject::AUTO_WRITE
         ),
         mesh,
-        dimensionedScalar("chemistrySh", dimEnergy/dimTime/dimVolume, 0.0)
+        dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
     );
diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H
index feb112f652a3f9478af26963b590aa65e2e47de4..79c5e1c5b3cc5a239437601f3bd8e3b57c6224e3 100644
--- a/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H
+++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/hsEqn.H
@@ -9,7 +9,7 @@
       + parcels.Sh(hs)
       + surfaceFilm.Sh()
       + radiation->Shs(thermo)
-      + chemistrySh
+      + combustion->Sh()
     );
 
     hsEqn.relax();
diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C b/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C
index 6ae930c7a72da80de68ec6cfd1aeb3ed5baefcf6..ea8e9e6e5b65aed30d23c2dd521f2f6ca48740c0 100644
--- a/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C
+++ b/applications/solvers/lagrangian/reactingParcelFilmFoam/reactingParcelFilmFoam.C
@@ -31,12 +31,10 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hCombustionThermo.H"
 #include "turbulenceModel.H"
 #include "basicReactingCloud.H"
 #include "surfaceFilmModel.H"
-#include "psiChemistryModel.H"
-#include "chemistrySolver.H"
+#include "psiChemistryCombustionModel.H"
 #include "radiationModel.H"
 #include "SLGThermo.H"
 #include "pimpleControl.H"
@@ -49,7 +47,6 @@ int main(int argc, char *argv[])
 
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "createClouds.H"
@@ -83,7 +80,6 @@ int main(int argc, char *argv[])
 
         if (solvePrimaryRegion)
         {
-            #include "chemistry.H"
             #include "rhoEqn.H"
 
             // --- PIMPLE loop
@@ -107,10 +103,7 @@ int main(int argc, char *argv[])
 
             rho = thermo.rho();
 
-            if (runTime.write())
-            {
-                chemistry.dQ()().write();
-            }
+            runTime.write();
         }
         else
         {
diff --git a/applications/solvers/lagrangian/reactingParcelFilmFoam/readChemistryProperties.H b/applications/solvers/lagrangian/reactingParcelFilmFoam/readChemistryProperties.H
deleted file mode 100644
index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000
--- a/applications/solvers/lagrangian/reactingParcelFilmFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/lagrangian/reactingParcelFoam/Make/options b/applications/solvers/lagrangian/reactingParcelFoam/Make/options
index fc312bb5fa8e3e8c7dc14254607ad907eb4d8c11..e406727104647bc53fd59ccbf6da44a9c5af2722 100644
--- a/applications/solvers/lagrangian/reactingParcelFoam/Make/options
+++ b/applications/solvers/lagrangian/reactingParcelFoam/Make/options
@@ -20,6 +20,7 @@ EXE_INC = \
     -I$(LIB_SRC)/regionModels/regionModel/lnInclude \
     -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \
     -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude \
     -I$(FOAM_SOLVERS)/combustion/reactingFoam
 
 
@@ -45,4 +46,5 @@ EXE_LIBS = \
     -lODE \
     -lregionModels \
     -lsurfaceFilmModels \
-    -lsampling
+    -lsampling \
+    -lcombustionModels
diff --git a/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H b/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H
index a18097332134baaa0b312ecaf281a81694ae73ac..78bbe14bbfe72df41f7c6d17bcf10e152e32e6c6 100644
--- a/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H
+++ b/applications/solvers/lagrangian/reactingParcelFoam/YEqn.H
@@ -11,6 +11,8 @@ tmp<fv::convectionScheme<scalar> > mvConvection
 
 
 {
+    combustion->correct();
+    dQ = combustion->dQ();
     label inertIndex = -1;
     volScalarField Yt(0.0*Y[0]);
 
@@ -19,17 +21,20 @@ tmp<fv::convectionScheme<scalar> > mvConvection
         if (Y[i].name() != inertSpecie)
         {
             volScalarField& Yi = Y[i];
-            solve
+
+            fvScalarMatrix YiEqn
             (
                 fvm::ddt(rho, Yi)
               + mvConvection->fvmDiv(phi, Yi)
               - fvm::laplacian(turbulence->muEff(), Yi)
               ==
                 parcels.SYi(i, Yi)
-              + kappa*chemistry.RR(i)().dimensionedInternalField(),
-                mesh.solver("Yi")
+              + combustion->R(Yi)
             );
 
+            YiEqn.relax();
+            YiEqn.solve(mesh.solver("Yi"));
+
             Yi.max(0.0);
             Yt += Yi;
         }
diff --git a/applications/solvers/lagrangian/reactingParcelFoam/createFields.H b/applications/solvers/lagrangian/reactingParcelFoam/createFields.H
index 089489a014adeaedf43888bf9761475685644044..c318498d94c3efcd27e0c257e306795081ce99fb 100644
--- a/applications/solvers/lagrangian/reactingParcelFoam/createFields.H
+++ b/applications/solvers/lagrangian/reactingParcelFoam/createFields.H
@@ -1,10 +1,14 @@
-    Info<< "Reading thermophysical properties\n" << endl;
+    Info<< "Creating combustion model\n" << endl;
 
-    autoPtr<psiChemistryModel> pChemistry
+    autoPtr<combustionModels::psiChemistryCombustionModel> combustion
     (
-        psiChemistryModel::New(mesh)
+        combustionModels::psiChemistryCombustionModel::New
+        (
+            mesh
+        )
     );
-    psiChemistryModel& chemistry = pChemistry();
+
+    psiChemistryModel& chemistry = combustion->pChemistry();
 
     hsCombustionThermo& thermo = chemistry.thermo();
 
@@ -57,20 +61,6 @@
 
     #include "compressibleCreatePhi.H"
 
-    DimensionedField<scalar, volMesh> kappa
-    (
-        IOobject
-        (
-            "kappa",
-            runTime.timeName(),
-            mesh,
-            IOobject::NO_READ,
-            IOobject::AUTO_WRITE
-        ),
-        mesh,
-        dimensionedScalar("zero", dimless, 0.0)
-    );
-
     Info<< "Creating turbulence model\n" << endl;
     autoPtr<compressible::turbulenceModel> turbulence
     (
@@ -83,6 +73,9 @@
         )
     );
 
+    // Set the turbulence into the combustion model
+    combustion->setTurbulence(turbulence());
+
     Info<< "Creating field DpDt\n" << endl;
     volScalarField DpDt
     (
@@ -98,16 +91,16 @@
     }
     fields.add(hs);
 
-    DimensionedField<scalar, volMesh> chemistrySh
+    volScalarField dQ
     (
         IOobject
         (
-            "chemistry::Sh",
+            "dQ",
             runTime.timeName(),
             mesh,
             IOobject::NO_READ,
-            IOobject::NO_WRITE
+            IOobject::AUTO_WRITE
         ),
         mesh,
-        dimensionedScalar("chemistry::Sh", dimEnergy/dimTime/dimVolume, 0.0)
-    );
+        dimensionedScalar("dQ", dimEnergy/dimTime, 0.0)
+    );
\ No newline at end of file
diff --git a/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H b/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H
index 7821d340d4bc6b1f955b94dcb770fd9454acdf95..f7499813c7f63fcfdbe026d28cfc4485c3cff0df 100644
--- a/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H
+++ b/applications/solvers/lagrangian/reactingParcelFoam/hsEqn.H
@@ -8,7 +8,7 @@
         DpDt
      +  parcels.Sh(hs)
      +  radiation->Shs(thermo)
-     +  chemistrySh
+     +  combustion->Sh()
     );
 
     hEqn.relax();
diff --git a/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C b/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C
index ae2a06a363b2ff893a0faef9c3b73c3270060535..0d00af9c2a89c7c8811bb8ca100d3cbe8d21997f 100644
--- a/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C
+++ b/applications/solvers/lagrangian/reactingParcelFoam/reactingParcelFoam.C
@@ -31,11 +31,9 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hCombustionThermo.H"
 #include "turbulenceModel.H"
 #include "basicReactingCloud.H"
-#include "psiChemistryModel.H"
-#include "chemistrySolver.H"
+#include "psiChemistryCombustionModel.H"
 #include "radiationModel.H"
 #include "SLGThermo.H"
 #include "pimpleControl.H"
@@ -48,7 +46,6 @@ int main(int argc, char *argv[])
 
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "createClouds.H"
@@ -76,7 +73,6 @@ int main(int argc, char *argv[])
 
         parcels.evolve();
 
-        #include "chemistry.H"
         #include "rhoEqn.H"
 
         // --- Pressure-velocity PIMPLE corrector loop
@@ -100,10 +96,7 @@ int main(int argc, char *argv[])
 
         rho = thermo.rho();
 
-        if (runTime.write())
-        {
-            chemistry.dQ()().write();
-        }
+        runTime.write();
 
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
diff --git a/applications/solvers/lagrangian/reactingParcelFoam/readChemistryProperties.H b/applications/solvers/lagrangian/reactingParcelFoam/readChemistryProperties.H
deleted file mode 100644
index f0bcf7597fcf71f1e9b8ee2dbc879200a85fa2cc..0000000000000000000000000000000000000000
--- a/applications/solvers/lagrangian/reactingParcelFoam/readChemistryProperties.H
+++ /dev/null
@@ -1,23 +0,0 @@
-Info<< "Reading chemistry properties\n" << endl;
-
-IOdictionary chemistryProperties
-(
-    IOobject
-    (
-        "chemistryProperties",
-        runTime.constant(),
-        mesh,
-        IOobject::MUST_READ_IF_MODIFIED,
-        IOobject::NO_WRITE,
-        false
-    )
-);
-
-Switch turbulentReaction(chemistryProperties.lookup("turbulentReaction"));
-
-dimensionedScalar Cmix("Cmix", dimless, 1.0);
-
-if (turbulentReaction)
-{
-    chemistryProperties.lookup("Cmix") >> Cmix;
-}
diff --git a/applications/solvers/lagrangian/sprayFoam/Make/options b/applications/solvers/lagrangian/sprayFoam/Make/options
index ff504df32f0445a26d5f9e7fae166313250341e8..f4c66f06f918d426c58214f7d079691de242a24f 100644
--- a/applications/solvers/lagrangian/sprayFoam/Make/options
+++ b/applications/solvers/lagrangian/sprayFoam/Make/options
@@ -21,6 +21,7 @@ EXE_INC = \
     -I$(LIB_SRC)/regionModels/regionModel/lnInclude \
     -I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \
     -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/combustionModels/lnInclude \
     -I$(FOAM_SOLVERS)/lagrangian/reactingParcelFoam
 
 
@@ -47,4 +48,5 @@ EXE_LIBS = \
     -lODE \
     -lregionModels \
     -lsurfaceFilmModels \
-    -lsampling
+    -lsampling \
+    -lcombustionModels
diff --git a/applications/solvers/lagrangian/sprayFoam/chemistry.H b/applications/solvers/lagrangian/sprayFoam/chemistry.H
deleted file mode 100644
index 99f418af6f10ac69b44d08fc2271e2dd79c73fc4..0000000000000000000000000000000000000000
--- a/applications/solvers/lagrangian/sprayFoam/chemistry.H
+++ /dev/null
@@ -1,44 +0,0 @@
-if (chemistry.chemistry())
-{
-    Info<< "Solving chemistry" << endl;
-
-    chemistry.solve
-    (
-        runTime.value() - runTime.deltaTValue(),
-        runTime.deltaTValue()
-    );
-
-    // turbulent time scale
-    if (turbulentReaction)
-    {
-        tmp<volScalarField> tepsilon(turbulence->epsilon());
-        const volScalarField& epsilon = tepsilon();
-        tmp<volScalarField> tmuEff(turbulence->muEff());
-        const volScalarField& muEff = tmuEff();
-        tmp<volScalarField> ttc(chemistry.tc());
-        const volScalarField& tc = ttc();
-
-        forAll(epsilon, i)
-        {
-            if (epsilon[i] > 0)
-            {
-                // Chalmers PaSR model
-                scalar tk = Cmix.value()*Foam::sqrt(muEff[i]/rho[i]/epsilon[i]);
-                kappa[i] =
-                    (runTime.deltaTValue() + tc[i])
-                   /(runTime.deltaTValue() + tc[i] + tk);
-            }
-            else
-            {
-                // Return to laminar combustion
-                kappa[i] = 1.0;
-            }
-        }
-    }
-    else
-    {
-        kappa = 1.0;
-    }
-
-    chemistrySh = kappa*chemistry.Sh()();
-}
diff --git a/applications/solvers/lagrangian/sprayFoam/sprayFoam.C b/applications/solvers/lagrangian/sprayFoam/sprayFoam.C
index 5252fd3cf3905f471c46f62b1a22d6f55ef0f21d..d1f70654eacac05e0fa6e36e40ff61484e72b518 100644
--- a/applications/solvers/lagrangian/sprayFoam/sprayFoam.C
+++ b/applications/solvers/lagrangian/sprayFoam/sprayFoam.C
@@ -31,11 +31,9 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "hCombustionThermo.H"
 #include "turbulenceModel.H"
 #include "basicSprayCloud.H"
-#include "psiChemistryModel.H"
-#include "chemistrySolver.H"
+#include "psiChemistryCombustionModel.H"
 #include "radiationModel.H"
 #include "SLGThermo.H"
 #include "pimpleControl.H"
@@ -48,7 +46,6 @@ int main(int argc, char *argv[])
 
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readChemistryProperties.H"
     #include "readGravitationalAcceleration.H"
     #include "createFields.H"
     #include "createClouds.H"
@@ -76,7 +73,6 @@ int main(int argc, char *argv[])
 
         parcels.evolve();
 
-        #include "chemistry.H"
         #include "rhoEqn.H"
 
         // --- Pressure-velocity PIMPLE corrector loop
diff --git a/src/combustionModels/FSD/FSD.C b/src/combustionModels/FSD/FSD.C
new file mode 100644
index 0000000000000000000000000000000000000000..699111171b636952d25dd8f1626e628c39aeb773
--- /dev/null
+++ b/src/combustionModels/FSD/FSD.C
@@ -0,0 +1,362 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "FSD.H"
+#include "addToRunTimeSelectionTable.H"
+#include "LESModel.H"
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CombThermoType, class ThermoType>
+FSD<CombThermoType, ThermoType>::FSD
+(
+    const word& modelType, const fvMesh& mesh
+)
+:
+    singleStepCombustion<CombThermoType, ThermoType>(modelType, mesh),
+    reactionRateFlameArea_
+    (
+        reactionRateFlameArea::New
+        (
+            this->coeffs(),
+            this->mesh(),
+            *this
+        )
+    ),
+    ft_
+    (
+        IOobject
+        (
+            "ft",
+            this->mesh().time().timeName(),
+            this->mesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        this->mesh(),
+        dimensionedScalar("zero", dimless, 0.0)
+    ),
+    YFuelFuelStream_
+    (
+        dimensionedScalar("YFuelStream", dimless, 1.0)
+    ),
+    YO2OxiStream_
+    (
+        dimensionedScalar("YOxiStream", dimless, 0.23)
+    ),
+    Cv_(readScalar(this->coeffs().lookup("Cv"))),
+    C_(5.0),
+    ftMin_(0.0),
+    ftMax_(1.0),
+    ftDim_(300),
+    ftVarMin_(readScalar(this->coeffs().lookup("ftVarMin")))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
+
+template<class CombThermoType, class ThermoType>
+FSD<CombThermoType, ThermoType>::~FSD()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+template<class CombThermoType, class ThermoType>
+void FSD<CombThermoType, ThermoType>::calculateSourceNorm()
+{
+    this->singleMixture_.fresCorrect();
+
+    const label fuelI = this->singleMixture_.fuelIndex();
+
+    const volScalarField& YFuel = this->thermo_->composition().Y()[fuelI];
+
+    const volScalarField& YO2 = this->thermo_->composition().Y("O2");
+
+    const dimensionedScalar s = this->singleMixture_.s();
+
+    ft_ =
+        (s*YFuel - (YO2 - YO2OxiStream_))/(s*YFuelFuelStream_ + YO2OxiStream_);
+
+
+    volVectorField nft = fvc::grad(ft_);
+
+    volScalarField mgft = mag(nft);
+
+    surfaceVectorField SfHat = this->mesh().Sf()/this->mesh().magSf();
+
+    volScalarField cAux = scalar(1) - ft_;
+
+    dimensionedScalar dMgft = 1.0e-3*
+        (ft_*cAux*mgft)().weightedAverage(this->mesh().V())
+       /((ft_*cAux)().weightedAverage(this->mesh().V()) + SMALL)
+      + dimensionedScalar("ddMgft", mgft.dimensions(), SMALL);
+
+    mgft += dMgft;
+
+    nft /= mgft;
+
+    const volVectorField& U = YO2.db().lookupObject<volVectorField>("U");
+
+    const volScalarField sigma =
+        (nft & nft)*fvc::div(U) - (nft & fvc::grad(U) & nft);
+
+    reactionRateFlameArea_->correct(sigma);
+
+    const volScalarField& omegaFuel = reactionRateFlameArea_->omega();
+
+
+    const scalar ftStoich =
+        YO2OxiStream_.value()
+       /(
+            s.value()*YFuelFuelStream_.value() + YO2OxiStream_.value()
+        );
+
+    tmp<volScalarField> tPc
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "Pc",
+                U.time().timeName(),
+                U.db(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            U.mesh(),
+            dimensionedScalar("Pc", dimless, 0)
+        )
+    );
+
+    volScalarField& pc = tPc();
+
+    tmp<volScalarField> tomegaFuel
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "omegaFuelBar",
+                U.time().timeName(),
+                U.db(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            U.mesh(),
+            dimensionedScalar
+            (
+                "omegaFuelBar",
+                omegaFuel.dimensions(),
+                0
+            )
+        )
+    );
+
+    volScalarField& omegaFuelBar = tomegaFuel();
+
+    // Calculation of the mixture fraction variance (ftVar)
+    const compressible::LESModel& lesModel =
+        YO2.db().lookupObject<compressible::LESModel>("LESProperties");
+
+    const volScalarField& delta = lesModel.delta();
+    const volScalarField ftVar = Cv_*sqr(delta)*sqr(mgft);
+
+    // Thickened flame (average flame thickness for counterflow configuration
+    // is 1.5 mm)
+
+    volScalarField  deltaF =
+        lesModel.delta()/dimensionedScalar("flame",dimLength, 1.5e-3);
+
+    // Linear correlation between delta and flame thickness
+    volScalarField omegaF = max(deltaF*(4.0/3.0) + (2.0/3.0), 1.0);
+
+    scalar deltaFt = 1.0/ftDim_;
+
+    forAll(ft_, cellI)
+    {
+        if(ft_[cellI] > ftMin_ && ft_[cellI] < ftMax_)
+        {
+            scalar ftCell = ft_[cellI];
+
+            if(ftVar[cellI] > ftVarMin_) //sub-grid beta pdf of ft_
+            {
+                scalar ftVarc = ftVar[cellI];
+                scalar a =
+                    max(ftCell*(ftCell*(1.0 - ftCell)/ftVarc - 1.0), 0.0);
+                scalar b = max(a/ftCell - a, 0.0);
+
+                for(int i=1; i<ftDim_; i++)
+                {
+                    scalar ft = i*deltaFt;
+                    pc[cellI] += pow(ft, a-1.0)*pow(1.0 - ft, b - 1.0)*deltaFt;
+                }
+
+                for(int i=1; i<ftDim_; i++)
+                {
+                    scalar ft = i*deltaFt;
+                    omegaFuelBar[cellI] +=
+                        omegaFuel[cellI]/omegaF[cellI]
+                       *exp
+                       (
+                        -sqr(ft - ftStoich)
+                        /(2.0*sqr(0.01*omegaF[cellI]))
+                       )
+                       *pow(ft, a - 1.0)
+                       *pow(1.0 - ft, b - 1.0)
+                       *deltaFt;
+                }
+                omegaFuelBar[cellI] /= max(pc[cellI], 1e-4);
+            }
+            else
+            {
+                omegaFuelBar[cellI] =
+                    (omegaFuel[cellI]/omegaF[cellI])
+                   *exp
+                   (
+                    -sqr(ftCell - ftStoich)/(2.0*sqr(0.01*omegaF[cellI]))
+                   );
+            }
+
+        }
+        else
+        {
+                omegaFuelBar[cellI] = 0.0;
+        }
+    }
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+//  Combustion progress variable (c).
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+    List<label> productsIndex(2, -1);
+    {
+        label i = 0;
+        forAll (this->singleMixture_.specieProd(), specieI)
+        {
+            if (this->singleMixture_.specieProd()[specieI] < 0)
+            {
+                productsIndex[i] = specieI;
+                i++;
+            }
+        }
+    }
+
+
+    // Flamelet probability of the progress c based on IFC (reuse pc)
+    scalar YprodTotal = 0;
+    forAll (productsIndex, j)
+    {
+        YprodTotal += this->singleMixture_.Yprod0()[productsIndex[j]];
+    }
+
+    forAll(ft_, cellI)
+    {
+        if(ft_[cellI] < ftStoich)
+        {
+            pc[cellI] = ft_[cellI]*(YprodTotal/ftStoich);
+        }
+        else
+        {
+            pc[cellI] = (1.0 - ft_[cellI])*(YprodTotal/(1.0 - ftStoich));
+        }
+    }
+
+    tmp<volScalarField> tproducts
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "products",
+                U.time().timeName(),
+                U.db(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            U.mesh(),
+            dimensionedScalar("products", dimless, 0)
+        )
+    );
+
+    volScalarField& products = tproducts();
+
+    forAll (productsIndex, j)
+    {
+        label specieI = productsIndex[j];
+        const volScalarField& Yp = this->thermo_->composition().Y()[specieI];
+        products += Yp;
+    }
+
+    volScalarField c = max(scalar(1.0) - products/max(pc, 1e-5), 0.0);
+
+    pc = min(C_*c, scalar(1.0));
+
+    const volScalarField fres = this->singleMixture_.fres(fuelI);
+
+    this->wFuel_ == mgft*pc*omegaFuelBar;
+}
+
+
+template<class CombThermoType, class ThermoType>
+void FSD<CombThermoType, ThermoType>::correct()
+{
+    this->wFuel_ ==
+        dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0);
+
+    if (this->active())
+    {
+        calculateSourceNorm();
+    }
+}
+
+
+template<class CombThermoType, class ThermoType>
+bool FSD<CombThermoType, ThermoType>::read()
+{
+    if (singleStepCombustion<CombThermoType, ThermoType>::read())
+    {
+        this->coeffs().lookup("Cv") >> Cv_ ;
+        this->coeffs().lookup("ftVarMin") >> ftVarMin_;
+        reactionRateFlameArea_->read(this->coeffs());
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace combustionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/FSD/FSD.H b/src/combustionModels/FSD/FSD.H
new file mode 100644
index 0000000000000000000000000000000000000000..f727790e62de229c9b52dd0c2cf741b5e3b78ef1
--- /dev/null
+++ b/src/combustionModels/FSD/FSD.H
@@ -0,0 +1,173 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::combustionModels::FSD
+
+Description
+
+    Flame Surface Dennsity (FDS) combustion model.
+
+    The fuel source term is given by mgft*pc*omegaFuelBar.
+
+    where:
+          mgft: filtered flame area.
+          pc:   probability of the combustion progress.
+          omegaFuelBar: filtered consumption speed per unit of flame area.
+
+    pc is considered from the IFC solution.
+    omegaFuelBar is calculated solving a relaxation equation which tends to
+    omegaEq. This omegaEq is obtained from the flamelet solution for
+    different strain rates and fit using a expential distribution.
+
+    The spacial distribution of the consumption speed (omega) is obtained also
+    from a strained flamelet solution and it is assumed to have a guassian
+    distribution.
+
+    If the grid resolution is not enough to resolve the flame, the consumption
+    speed distribution is linearly thickened conserving the overall heat
+    release.
+
+    If the turbulent fluctuation of the mixture fraction at the sub-grid level
+    is large (>1E-04) then a beta pdf is used for filtering.
+
+    At the moment the flame area combustion model is only fit to work in a LES
+    frame work. In RAS the subgrid fluctiuation has to be solved by an extra
+    transport equation.
+
+SourceFiles
+    FSD.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef FSD_H
+#define FSD_H
+
+#include "singleStepCombustion.H"
+#include "reactionRateFlameArea.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                          Class FSD Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CombThermoType, class ThermoType>
+class FSD
+:
+    public singleStepCombustion <CombThermoType, ThermoType>
+{
+    // Private data
+
+        //- Auto pointer to consumption speed per unit of flame area model
+        autoPtr<reactionRateFlameArea> reactionRateFlameArea_;
+
+        //- Mixture fraction
+        volScalarField ft_;
+
+        //- Fuel mass concentration on the fuel stream
+        dimensionedScalar YFuelFuelStream_;
+
+        //- Oxygen mass concentration on the oxydizer stream
+        dimensionedScalar YO2OxiStream_;
+
+        //- Similarity constant for the sub-grid ft fluctuations
+        scalar Cv_;
+
+        //- Model constant
+        scalar C_;
+
+        //- Lower flammability limit
+        scalar ftMin_;
+
+        //- Upper flammability limit
+        scalar ftMax_;
+
+        //- Dimension of the ft space. Used to integrate the beta-pdf
+        scalar ftDim_;
+
+        //- Minimum mixture freaction variance to calculate pdf
+        scalar ftVarMin_;
+
+
+    // Private Member Functions
+
+        //- Calculate the normalised fuel source term
+        void calculateSourceNorm();
+
+        //- Disallow copy construct
+        FSD(const FSD&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const FSD&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("FSD");
+
+
+    // Constructors
+
+        //- Construct from components
+        FSD(const word& modelType, const fvMesh& mesh);
+
+
+    // Destructor
+        virtual ~FSD();
+
+
+    // Evolution
+
+        //- Correct combustion rate
+        virtual void correct();
+
+
+    // I-O
+
+        //- Update properties
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace combustionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "FSD.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/FSD/FSDs.C b/src/combustionModels/FSD/FSDs.C
new file mode 100644
index 0000000000000000000000000000000000000000..1d8527216914816be38b646e33b1277a99d81c06
--- /dev/null
+++ b/src/combustionModels/FSD/FSDs.C
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "makeCombustionTypes.H"
+
+#include "thermoPhysicsTypes.H"
+#include "psiCombustionModel.H"
+#include "FSD.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+    makeCombustionTypesThermo
+    (
+        FSD,
+        psiCombustionModel,
+        gasThermoPhysics
+    );
+
+}
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C
new file mode 100644
index 0000000000000000000000000000000000000000..a8d9903b6eb8885139be6c927dbe835227a86035
--- /dev/null
+++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C
@@ -0,0 +1,137 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "consumptionSpeed.H"
+
+/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */
+
+namespace Foam
+{
+    defineTypeNameAndDebug(consumptionSpeed, 0);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::consumptionSpeed::consumptionSpeed
+(
+    const dictionary& dict
+)
+:   omega0_(readScalar(dict.lookup("omega0"))),
+    eta_(readScalar(dict.lookup("eta"))),
+    sigmaExt_(readScalar(dict.lookup("sigmaExt"))),
+    omegaMin_(readScalar(dict.lookup("omegaMin")))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::consumptionSpeed::~consumptionSpeed()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+Foam::scalar Foam::consumptionSpeed::omega0Sigma
+(
+    scalar sigma,
+    scalar a
+) const
+{
+        scalar omega0 = 0.0;
+        if (sigma < sigmaExt_)
+        {
+            omega0 =
+            max
+            (
+                a*omega0_*(1.0 - exp(eta_*max(sigma, 0.0))),
+                omegaMin_
+            ) ;
+        }
+        return omega0;
+}
+
+
+Foam::tmp<Foam::volScalarField> Foam::consumptionSpeed::omega0Sigma
+(
+    const volScalarField& sigma
+)
+{
+    tmp<volScalarField> tomega0
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "omega0",
+                sigma.time().timeName(),
+                sigma.db(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            sigma.mesh(),
+            dimensionedScalar
+            (
+                "omega0",
+                dimensionSet(1, -2, -1, 0, 0, 0, 0),
+                0
+            )
+        )
+    );
+
+    volScalarField& omega0 = tomega0();
+
+    forAll(omega0, celli)
+    {
+        omega0[celli] = omega0Sigma(sigma[celli], 1.0);
+    }
+
+    forAll(omega0.boundaryField(), patchi)
+    {
+        forAll(omega0.boundaryField()[patchi], facei)
+        {
+            omega0.boundaryField()[patchi][facei] =
+                omega0Sigma
+                (
+                    sigma.boundaryField()[patchi][facei],
+                    1.0
+                );
+        }
+    }
+
+    return tomega0;
+}
+
+
+void  Foam::consumptionSpeed::read(const dictionary& dict)
+{
+    dict.lookup("omega0") >> omega0_ ;
+    dict.lookup("eta") >> eta_ ;
+    dict.lookup("sigmaExt") >> sigmaExt_;
+    dict.lookup("omegaMin") >> omegaMin_;
+}
+
+// ************************************************************************* //
diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.H b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.H
new file mode 100644
index 0000000000000000000000000000000000000000..80c0dc9a486c71bce9bf63fe673e1ca8271fa4d6
--- /dev/null
+++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.H
@@ -0,0 +1,139 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::reactionRateFlameAreaModels::consumptionSpeed
+
+Description
+    Correlation function for laminar consumption speed obtained from flamelet
+    solution at increasing strain rates.
+
+SourceFiles
+    consumptionSpeed.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef consumptionSpeed_H
+#define consumptionSpeed_H
+
+#include "IOdictionary.H"
+#include "volFields.H"
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                           Class consumptionSpeed Declaration
+\*---------------------------------------------------------------------------*/
+
+class consumptionSpeed
+{
+    // Private Data
+
+
+        //- Maximum consumption speed
+        scalar omega0_;
+
+        //- Exponential factor
+        scalar eta_;
+
+        //- Extinction strain
+        scalar sigmaExt_;
+
+        //- Minimum consumption speed
+        scalar omegaMin_;
+
+
+    // Private member functions
+
+        //- Return consumption rate
+        scalar omega0Sigma(scalar sigma, scalar a) const;
+
+        //- Disallow copy construct
+        consumptionSpeed(const consumptionSpeed&);
+
+         //- Disallow default bitwise assignment
+        void operator=(const consumptionSpeed&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("consumptionSpeed");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        consumptionSpeed(const dictionary& dict);
+
+
+    //- Destructor
+        virtual ~consumptionSpeed();
+
+
+    // Member functions
+
+        //- Return speed consumption rate temp
+        tmp<volScalarField> omega0Sigma(const volScalarField& sigma);
+
+
+        // Access functions
+
+            scalar omega0() const
+            {
+                return omega0_;
+            }
+
+            scalar eta() const
+            {
+                return eta_;
+            }
+
+            scalar sigmaExt() const
+            {
+                return sigmaExt_;
+            }
+
+            scalar omegaMin() const
+            {
+                return omegaMin_;
+            }
+
+
+    // I-O
+
+        //- Update properties
+        void read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C
new file mode 100644
index 0000000000000000000000000000000000000000..f7adc032ab067a6319fced1107349d47532f18d3
--- /dev/null
+++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "reactionRateFlameArea.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(reactionRateFlameArea, 0);
+    defineRunTimeSelectionTable(reactionRateFlameArea, dictionary);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::reactionRateFlameArea::reactionRateFlameArea
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const combustionModel& combModel
+)
+:
+    coeffDict_(dictionary::null),
+    mesh_(mesh),
+    combModel_(combModel),
+    fuel_(dict.lookup("fuel")),
+    omega_
+    (
+        IOobject
+        (
+            "omega",
+            mesh_.time().timeName(),
+            mesh_,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh_
+    )
+{
+}
+
+
+Foam::reactionRateFlameArea::reactionRateFlameArea
+(
+    const word& modelType,
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const combustionModel& combModel
+)
+:
+    coeffDict_(dict.subDict(modelType + "Coeffs")),
+    mesh_(mesh),
+    combModel_(combModel),
+    fuel_(dict.lookup("fuel")),
+    omega_
+    (
+        IOobject
+        (
+            "omega",
+            mesh_.time().timeName(),
+            mesh_,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh_
+    )
+{
+}
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::reactionRateFlameArea::~reactionRateFlameArea()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+bool Foam::reactionRateFlameArea::read(const dictionary& dict)
+{
+    dict.lookup("fuel") >> fuel_;
+    return true;
+
+}
+
+// ************************************************************************* //
diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.H b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.H
new file mode 100644
index 0000000000000000000000000000000000000000..6353f7241dc3c38d6154476d1151a0002f8928e5
--- /dev/null
+++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.H
@@ -0,0 +1,176 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+
+Class
+    Foam::reactionRateFlameArea
+
+Description
+    Abstract class for reaction rate per flame area unit
+
+SourceFiles
+    reactionRateFlameArea.C
+    reactionRateFlameAreaNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef reactionRateFlameArea_H
+#define reactionRateFlameArea_H
+
+#include "runTimeSelectionTables.H"
+#include "dictionary.H"
+#include "autoPtr.H"
+#include "volFields.H"
+#include "combustionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+class fvMesh;
+
+/*---------------------------------------------------------------------------*\
+                           Class reactionRateFlameArea Declaration
+\*---------------------------------------------------------------------------*/
+
+class reactionRateFlameArea
+{
+
+protected:
+
+    // Protected data
+
+        //- Dictionary
+        dictionary coeffDict_;
+
+        //- Mesh reference
+        const fvMesh& mesh_;
+
+        //- Combstion model owner
+        const combustionModel& combModel_;
+
+        //- Fuel name
+        word fuel_;
+
+        //- Fuel consumption rate per unit of flame area
+        volScalarField omega_;
+
+
+private:
+
+    // Private member functions
+
+         //- Disallow copy construct
+        reactionRateFlameArea(const reactionRateFlameArea&);
+
+         //- Disallow default bitwise assignment
+        void operator=(const reactionRateFlameArea&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("reactionRateFlameArea");
+
+
+    // Declare run-time constructor selection table
+
+        declareRunTimeSelectionTable
+        (
+            autoPtr,
+            reactionRateFlameArea,
+            dictionary,
+            (
+                const word modelType,
+                const dictionary& dict,
+                const fvMesh& mesh,
+                const combustionModel& combModel
+            ),
+            (modelType, dict, mesh, combModel)
+        );
+
+
+    // Constructors
+
+        //- Construct from dictionary and hsCombustionThermo
+        reactionRateFlameArea
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const combustionModel& combModel
+        );
+
+        //- Construct from components
+        reactionRateFlameArea
+        (
+            const word& modelType,
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const combustionModel& combModel
+        );
+
+
+    // Selector
+
+        static autoPtr<reactionRateFlameArea> New
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const combustionModel& combModel
+        );
+
+
+    // Destructor
+
+        virtual ~reactionRateFlameArea();
+
+
+    // Member functions
+
+        //- Access functions
+
+            //- Return omega
+            const volScalarField& omega() const
+            {
+                return omega_;
+            }
+
+
+        //- Correct omega
+        virtual void correct(const volScalarField& sigma) = 0;
+
+        //- Update from dictionary
+        virtual bool read(const dictionary& dictProperties);
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..bd8e28062b241c4736d9f121bcab20d76c5ec8a5
--- /dev/null
+++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C
@@ -0,0 +1,69 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "reactionRateFlameArea.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::reactionRateFlameArea> Foam::reactionRateFlameArea::New
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const combustionModel& combModel
+)
+{
+    word reactionRateFlameAreaType
+    (
+        dict.lookup("reactionRateFlameArea")
+    );
+
+    Info<< "Selecting reaction rate flame area correlation "
+        << reactionRateFlameAreaType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(reactionRateFlameAreaType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalIOErrorIn
+        (
+            "reactionRateFlameArea::New(const hsCombustionThermo&)",
+            dict
+        )   << "Unknown reactionRateFlameArea type "
+            << reactionRateFlameAreaType << endl << endl
+            << "Valid reaction rate flame area types are :" << endl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalIOError);
+    }
+
+    const label tempOpen = reactionRateFlameAreaType.find('<');
+
+    const word className = reactionRateFlameAreaType(0, tempOpen);
+
+    return autoPtr<reactionRateFlameArea>
+        (cstrIter()(className, dict, mesh, combModel));
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C
new file mode 100644
index 0000000000000000000000000000000000000000..9f8415385fa6380037ac1c6b0ac91a0d1b8d5bf9
--- /dev/null
+++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C
@@ -0,0 +1,155 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "relaxation.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvm.H"
+#include "LESModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace reactionRateFlameAreaModels
+{
+    defineTypeNameAndDebug(relaxation, 0);
+    addToRunTimeSelectionTable
+    (
+        reactionRateFlameArea,
+        relaxation,
+        dictionary
+    );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::reactionRateFlameAreaModels::relaxation::relaxation
+(
+    const word modelType,
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const combustionModel& combModel
+)
+:
+    reactionRateFlameArea(modelType, dict, mesh, combModel),
+    correlation_(dict.subDict(typeName + "Coeffs").subDict(fuel_)),
+    C_(readScalar(dict.subDict(typeName + "Coeffs").lookup("C"))),
+    alpha_(readScalar(dict.subDict(typeName + "Coeffs").lookup("alpha")))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::reactionRateFlameAreaModels::relaxation::~relaxation()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void Foam::reactionRateFlameAreaModels::relaxation::correct
+(
+    const volScalarField& sigma
+)
+{
+
+    dimensionedScalar omega0
+    (
+        "omega0",
+        dimensionSet(1, -2, -1, 0, 0, 0, 0),
+        correlation_.omega0()
+    );
+
+    dimensionedScalar sigmaExt
+    (
+        "sigmaExt",
+        dimensionSet(0, 0, -1, 0, 0, 0, 0),
+        correlation_.sigmaExt()
+    );
+
+    dimensionedScalar omegaMin
+    (
+        "omegaMin",
+        omega0.dimensions(),
+        1e-4
+    );
+
+    const compressible::LESModel& lesModel =
+        omega_.db().lookupObject<compressible::LESModel>("LESProperties");
+
+    // Total strain : resolved and sub-grid (just LES for now)
+    const volScalarField sigmaTotal =
+        sigma + alpha_*lesModel.epsilon()/(lesModel.k() + lesModel.kMin());
+
+    const volScalarField omegaInf = correlation_.omega0Sigma(sigmaTotal);
+
+    dimensionedScalar sigma0("sigma0", sigma.dimensions(), 0.0);
+
+    const volScalarField tau = C_*mag(sigmaTotal);
+
+    volScalarField Rc =
+        (tau*omegaInf*(omega0 - omegaInf) + sqr(omegaMin)*sigmaExt)
+       /(sqr(omega0 - omegaInf) + sqr(omegaMin));
+
+    const volScalarField rho(combModel_.rho());
+    const surfaceScalarField phi(combModel_.phi());
+
+    solve
+    (
+         fvm::ddt(rho, omega_)
+       + fvm::div(phi, omega_, "div(phi,omega)")
+      ==
+         rho*Rc*omega0
+       - fvm::SuSp(rho*(tau + Rc), omega_)
+    );
+
+    omega_.min(omega0);
+    omega_.max(0.0);
+}
+
+
+bool  Foam::reactionRateFlameAreaModels::relaxation::read
+(
+    const dictionary& dict
+)
+{
+    if (reactionRateFlameArea::read(dict))
+    {
+        coeffDict_ = dict.subDict(typeName + "Coeffs");
+        coeffDict_.lookup("C") >> C_;
+        coeffDict_.lookup("alpha") >> alpha_;
+        correlation_.read
+        (
+            coeffDict_.subDict(fuel_)
+        );
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+// ************************************************************************* //
diff --git a/src/combustionModels/noCombustion/noCombustion.H b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.H
similarity index 55%
rename from src/combustionModels/noCombustion/noCombustion.H
rename to src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.H
index d36f4c11e342657f43019015c7c42a30fa104121..3e0aea5b8b658e786bf3630a3944dcfd1086c449 100644
--- a/src/combustionModels/noCombustion/noCombustion.H
+++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -21,72 +21,97 @@ License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
 Class
-    Foam::combustionModel::noCombustion
+    Foam::reactionRateFlameAreaModels::relaxation
 
 Description
-    Dummy combustion model for 'none' option
+    Consumption rate per unit of flame area obtained from a relaxation equation
 
 SourceFiles
-    noCombustion.C
+    relaxation.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef noCombustion_H
-#define noCombustion_H
+#ifndef relaxation_H
+#define relaxation_H
 
-#include "combustionModel.H"
+#include "reactionRateFlameArea.H"
+#include "consumptionSpeed.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
-namespace combustionModels
+namespace reactionRateFlameAreaModels
 {
 
 /*---------------------------------------------------------------------------*\
-                      Class noCombustion Declaration
+                           Class relaxation Declaration
 \*---------------------------------------------------------------------------*/
 
-class noCombustion
+class relaxation
 :
-    public combustionModel
+    public reactionRateFlameArea
 {
-    // Private Member Functions
+    // Private Data
+
+        //- Correlation
+        consumptionSpeed correlation_;
+
+        //- Proportionality constant for time scale in the relaxation Eq.
+        scalar C_;
+
+        //- Proportionality constant for sub-grid strain
+        scalar alpha_;
+
+
+     // Private Member Functions
 
         //- Disallow copy construct
-        noCombustion(const noCombustion&);
+        relaxation(const relaxation&);
 
         //- Disallow default bitwise assignment
-        void operator=(const noCombustion&);
+        void operator=(const relaxation&);
 
 
 public:
 
     //- Runtime type information
-    TypeName("none");
+    TypeName("relaxation");
 
 
     // Constructors
 
-        //- Construct from components
-        noCombustion
+        //- Construct from dictionary and hsCombustionThermo
+        relaxation
         (
-            const dictionary& combustionProperties,
-            hsCombustionThermo& thermo,
-            const compressible::turbulenceModel& turbulence,
-            const surfaceScalarField& phi,
-            const volScalarField& rho
+            const word modelType,
+            const dictionary& dictCoeffs,
+            const fvMesh& mesh,
+            const combustionModel& combModel
         );
 
 
-    //- Destructor
-    virtual ~noCombustion();
+    // Destructor
+
+        virtual ~relaxation();
+
+
+    // Member functions
+
+        //- Correct omega
+        virtual void correct(const volScalarField& sigma);
+
+
+    // I-O
+
+        //- Update properties from given dictionary
+        virtual bool read(const dictionary& dictProperties);
 };
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-} // End namespace combustionModels
+} // End reactionRateFlameAreaModels
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/Make/files b/src/combustionModels/Make/files
index 86696b0709373fbb8bb6c63f090564f55b85d740..3bb286c7d6bb55525cdd676413d9b87ff6c3c7ec 100644
--- a/src/combustionModels/Make/files
+++ b/src/combustionModels/Make/files
@@ -1,9 +1,27 @@
 combustionModel/combustionModel.C
-combustionModel/combustionModelNew.C
 
-infinitelyFastChemistry/infinitelyFastChemistry.C
+psiCombustionModel/psiCombustionModel.C
+psiCombustionModel/psiCombustionModelNew.C
 
-noCombustion/noCombustion.C
+rhoCombustionModel/rhoCombustionModel.C
+rhoCombustionModel/rhoCombustionModelNew.C
+
+infinitelyFastChemistry/infinitelyFastChemistrys.C
+
+psiChemistryCombustionModel/psiChemistryCombustionModel.C
+psiChemistryCombustionModel/psiChemistryCombustionModelNew.C
+
+rhoChemistryCombustionModel/rhoChemistryCombustionModel.C
+rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C
+
+PaSR/PaSRs.C
+
+FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C
+FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C
+FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C
+FSD/reactionRateFlameAreaModels/relaxation/relaxation.C
+
+FSD/FSDs.C
 
 LIB = $(FOAM_LIBBIN)/libcombustionModels
 
diff --git a/src/combustionModels/Make/options b/src/combustionModels/Make/options
index 314c820f246e9647033b316e36cbdec038a85a08..77f96e3a4a6ae84658800f7543df20b954f4a8f1 100644
--- a/src/combustionModels/Make/options
+++ b/src/combustionModels/Make/options
@@ -2,8 +2,14 @@ EXE_INC = \
     -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
     -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
     -I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \
     -I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \
+    -I$(LIB_SRC)/turbulenceModels/ \
+    -I$(LIB_SRC)/turbulenceModels/LES/LESdeltas/lnInclude \
+    -I$(LIB_SRC)/turbulenceModels/LES/LESfilters/lnInclude \
+    -I$(LIB_SRC)/turbulenceModels/compressible/LES/lnInclude \
     -I$(LIB_SRC)/finiteVolume/lnInclude
 
 LIB_LIBS = \
-    -lfiniteVolume
+    -lfiniteVolume \
+    -lchemistryModel
diff --git a/src/combustionModels/PaSR/PaSR.C b/src/combustionModels/PaSR/PaSR.C
new file mode 100644
index 0000000000000000000000000000000000000000..a33b778bab3cb62d68f5f57f7fdf1cff2b9effc4
--- /dev/null
+++ b/src/combustionModels/PaSR/PaSR.C
@@ -0,0 +1,253 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "PaSR.H"
+#include "fvmSup.H"
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CombThermoType>
+Foam::combustionModels::PaSR<CombThermoType>::PaSR
+(
+    const word& modelType,
+    const fvMesh& mesh
+)
+:
+    CombThermoType(modelType, mesh),
+    Cmix_(this->coeffs().lookup("Cmix")),
+    turbulentReaction_(this->coeffs().lookup("turbulentReaction")),
+    kappa_
+    (
+        IOobject
+        (
+            "kappa",
+            mesh.time().timeName(),
+            mesh,
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE,
+            false
+        ),
+        mesh,
+        dimensionedScalar("kappa", dimless, 0.0)
+    ),
+    useReactionRate_(this->coeffs().lookupOrDefault("useReactionRate", false))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
+
+template<class CombThermoType>
+Foam::combustionModels::PaSR<CombThermoType>::~PaSR()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+
+template<class CombThermoType>
+Foam::tmp<Foam::volScalarField>
+Foam::combustionModels::PaSR<CombThermoType>::tc() const
+{
+    return this->pChemistry_->tc();
+}
+
+
+template<class CombThermoType>
+void Foam::combustionModels::PaSR<CombThermoType>::correct()
+{
+    if (this->active())
+    {
+        if (!useReactionRate_)
+        {
+            this->pChemistry_->solve
+            (
+                this->mesh().time().value()-this->mesh().time().deltaTValue(),
+                this->mesh().time().deltaTValue()
+            );
+        }
+        else
+        {
+            this->pChemistry_->calculate();
+        }
+
+        if (turbulentReaction_)
+        {
+            tmp<volScalarField> tepsilon(this->turbulence().epsilon());
+            const volScalarField& epsilon = tepsilon();
+            tmp<volScalarField> tmuEff(this->turbulence().muEff());
+            const volScalarField& muEff = tmuEff();
+            tmp<volScalarField> ttc(tc());
+            const volScalarField& tc = ttc();
+            forAll(epsilon, i)
+            {
+                if (epsilon[i] > 0)
+                {
+                    const dimensionedScalar e0
+                    (
+                        "e0",
+                        sqr(dimLength)/pow3(dimTime), SMALL
+                    );
+
+                    scalar tk =
+                        Cmix_.value()
+                       *Foam::sqrt
+                       (
+                            muEff[i]/this->rho()()[i]/(epsilon[i] + e0.value())
+                       );
+
+                    // Chalmers PaSR model
+                    if (!useReactionRate_)
+                    {
+                        kappa_[i] =
+                            ( this->mesh().time().deltaTValue() + tc[i])
+                        /( this->mesh().time().deltaTValue() + tc[i] + tk);
+                    }
+                    else
+                    {
+                        kappa_[i] = tc[i]/(tc[i] + tk);
+                    }
+                }
+                else
+                {
+                    // Return to laminar combustion
+                    kappa_[i] = 1.0;
+                }
+            }
+        }
+        else
+        {
+            kappa_ = 1.0;
+        }
+    }
+}
+
+
+template<class CombThermoType>
+Foam::tmp<Foam::fvScalarMatrix>
+Foam::combustionModels::PaSR<CombThermoType>::R(const volScalarField& Y) const
+{
+
+    tmp<fvScalarMatrix> tSu
+    (
+        new fvScalarMatrix(Y, dimMass/dimTime)
+    );
+
+    fvScalarMatrix& Su = tSu();
+
+    if (this->active())
+    {
+        const label specieI = this->thermo().composition().species()[Y.name()];
+
+        Su += kappa_*this->pChemistry_->RR(specieI);
+    }
+
+    return tSu;
+}
+
+
+template<class CombThermoType>
+Foam::tmp<Foam::volScalarField>
+Foam::combustionModels::PaSR<CombThermoType>::dQ() const
+{
+    tmp<volScalarField> tdQ
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "dQ",
+                this->mesh().time().timeName(),
+                this->mesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            this->mesh(),
+            dimensionedScalar("dQ", dimEnergy/dimTime, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+
+    if (this->active())
+    {
+        volScalarField& dQ = tdQ();
+        dQ = kappa_*this->pChemistry_->dQ();
+    }
+
+    return tdQ;
+}
+
+
+template<class CombThermoType>
+Foam::tmp<Foam::volScalarField>
+Foam::combustionModels::PaSR<CombThermoType>::Sh() const
+{
+    tmp<volScalarField> tSh
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "Sh",
+                this->mesh().time().timeName(),
+                this->mesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            this->mesh(),
+            dimensionedScalar("zero", dimEnergy/dimTime/dimVolume, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+
+    if (this->active())
+    {
+        scalarField& Sh = tSh();
+        Sh = kappa_*this->pChemistry_->Sh();
+    }
+
+    return tSh;
+}
+
+
+template<class CombThermoType>
+bool Foam::combustionModels::PaSR<CombThermoType>::read()
+{
+    if (CombThermoType::read())
+    {
+        this->coeffs().lookup("Cmix") >> Cmix_;
+        this->coeffs().lookup("turbulentReaction") >> turbulentReaction_;
+        this->coeffs().lookup("useReactionRate") >> useReactionRate_;
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/PaSR/PaSR.H b/src/combustionModels/PaSR/PaSR.H
new file mode 100644
index 0000000000000000000000000000000000000000..4250c63a6a64283f48e6e89a2b48ef0e8a07ddd2
--- /dev/null
+++ b/src/combustionModels/PaSR/PaSR.H
@@ -0,0 +1,140 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::combustionModels::PaSR
+
+Description
+    Simple infinitely fast chemistry combustion model based on the principle
+    mixed is burnt. Additional parameter C is used to distribute the heat
+    release rate.in time
+
+SourceFiles
+    PaSR.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef PaSR_H
+#define PaSR_H
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                            Class PaSR Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CombThermoType>
+class PaSR
+:
+    public CombThermoType
+{
+    // Private data
+
+        //- Mixing constant
+        dimensionedScalar Cmix_;
+
+        //- Turbulent reaction switch
+        Switch turbulentReaction_;
+
+        //- Mixing parameter
+        volScalarField kappa_;
+
+        //- Use reaction rate
+        bool useReactionRate_;
+
+
+    // Private Member Functions
+
+        //- Return the chemical time scale
+        tmp<volScalarField> tc() const;
+
+        //- Disallow copy construct
+        PaSR(const PaSR&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const PaSR&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("PaSR");
+
+
+    // Constructors
+
+        //- Construct from components
+        PaSR
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        );
+
+
+    //- Destructor
+    virtual ~PaSR();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct combustion rate
+            virtual void correct();
+
+            //- Fuel consumption rate matrix.
+            virtual tmp<fvScalarMatrix> R(const volScalarField& Y) const;
+
+            //- Heat release rate calculated from fuel consumption rate matrix
+            virtual tmp<volScalarField> dQ() const;
+
+            //-  Return source for enthalpy equation [kg/m/s3]
+            virtual tmp<volScalarField> Sh() const;
+
+    // I-O
+
+            //- Update properties from given dictionary
+            virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace combustionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "PaSR.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/PaSR/PaSRs.C b/src/combustionModels/PaSR/PaSRs.C
new file mode 100644
index 0000000000000000000000000000000000000000..650ef9867609ad767bd76b06064644f1b6724219
--- /dev/null
+++ b/src/combustionModels/PaSR/PaSRs.C
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "makeCombustionTypes.H"
+
+#include "psiChemistryCombustionModel.H"
+#include "rhoChemistryCombustionModel.H"
+#include "PaSR.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+    makeCombustionTypes
+    (
+        PaSR,
+        psiChemistryCombustionModel
+    );
+
+    makeCombustionTypes
+    (
+        PaSR,
+        rhoChemistryCombustionModel
+    );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/combustionModel/combustionModel.C b/src/combustionModels/combustionModel/combustionModel.C
index bfccadf733d45683dcc470ebb53779bc3458452d..b87503a92478599737fc1a6c5fb610bf6100c150 100644
--- a/src/combustionModels/combustionModel/combustionModel.C
+++ b/src/combustionModels/combustionModel/combustionModel.C
@@ -1,153 +1,111 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-License
-
-    OpenFOAM 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.
-
-    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-\*---------------------------------------------------------------------------*/
-
-#include "combustionModel.H"
-#include "surfaceFields.H"
-#include "fvScalarMatrix.H"
-
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
-
-namespace Foam
-{
-    defineTypeNameAndDebug(combustionModel, 0);
-    defineRunTimeSelectionTable(combustionModel, dictionary);
-};
-
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-Foam::combustionModel::combustionModel
-(
-    const dictionary& combustionProps,
-    hsCombustionThermo& thermo,
-    const compressible::turbulenceModel& turbulence,
-    const surfaceScalarField& phi,
-    const volScalarField& rho
-)
-:
-    coeffs_(dictionary::null),
-    thermo_(thermo),
-    turbulence_(turbulence),
-    mesh_(phi.mesh()),
-    phi_(phi),
-    rho_(rho)
-{}
-
-
-Foam::combustionModel::combustionModel
-(
-    const word& modelType,
-    const dictionary& combustionProps,
-    hsCombustionThermo& thermo,
-    const compressible::turbulenceModel& turbulence,
-    const surfaceScalarField& phi,
-    const volScalarField& rho
-)
-:
-    coeffs_(combustionProps.subDict(modelType + "Coeffs")),
-    thermo_(thermo),
-    turbulence_(turbulence),
-    mesh_(phi.mesh()),
-    phi_(phi),
-    rho_(rho)
-{}
-
-
-// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
-
-Foam::combustionModel::~combustionModel()
-{}
-
-
-// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
-
-void Foam::combustionModel::correct()
-{
-    // do nothing
-}
-
-
-Foam::tmp<Foam::fvScalarMatrix> Foam::combustionModel::R
-(
-    volScalarField& Y
-) const
-{
-    return tmp<fvScalarMatrix>
-    (
-        new fvScalarMatrix(Y, dimMass/dimTime*Y.dimensions())
-    );
-}
-
-
-Foam::tmp<Foam::volScalarField> Foam::combustionModel::dQ() const
-{
-    return tmp<Foam::volScalarField>
-    (
-        new volScalarField
-        (
-            IOobject
-            (
-                "dQ",
-                mesh_.time().timeName(),
-                mesh_,
-                IOobject::NO_READ,
-                IOobject::NO_WRITE
-            ),
-            mesh_,
-            dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0)
-        )
-    );
-}
-
-
-Foam::tmp<Foam::volScalarField> Foam::combustionModel::wFuelNorm() const
-{
-    return tmp<Foam::volScalarField>
-    (
-        new volScalarField
-        (
-            IOobject
-            (
-                "wFuelNorm",
-                mesh_.time().timeName(),
-                mesh_,
-                IOobject::NO_READ,
-                IOobject::NO_WRITE
-            ),
-            mesh_,
-            dimensionedScalar("zero", dimMass/dimTime/pow3(dimLength), 0.0)
-        )
-    );
-}
-
-
-bool Foam::combustionModel::read(const dictionary& combustionProps)
-{
-    coeffs_ = combustionProps.subDict(type() + "Coeffs");
-
-    return true;
-}
-
-
-// ************************************************************************* //
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "combustionModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(combustionModel, 0);
+}
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::combustionModel::combustionModel
+(
+    const word& modelType,
+    const fvMesh& mesh
+)
+:
+    IOdictionary
+    (
+        IOobject
+        (
+            "combustionProperties",
+            mesh.time().constant(),
+            mesh,
+            IOobject::MUST_READ_IF_MODIFIED,
+            IOobject::NO_WRITE
+        )
+    ),
+    turbulencePtr_(),
+    mesh_(mesh),
+    active_(lookupOrDefault<Switch>("active", true)),
+    coeffs_(subDict(modelType + "Coeffs")),
+    modelType_(modelType)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
+
+Foam::combustionModel::~combustionModel()
+{
+    if (turbulencePtr_)
+    {
+        turbulencePtr_ = 0;
+    }
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+
+bool Foam::combustionModel::read()
+{
+    if (regIOobject::read())
+    {
+        this->lookup("active") >> active_;
+        coeffs_ = subDict(modelType_ + "Coeffs");
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+Foam::tmp<Foam::volScalarField> Foam::combustionModel::Sh() const
+{
+    return tmp<Foam::volScalarField>
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "Sh",
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_,
+            dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0)
+        )
+    );
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/combustionModel/combustionModel.H b/src/combustionModels/combustionModel/combustionModel.H
index 28ccb85b1b82027eeb2299512b72eac101447336..7b997fce70dd06a89b61e9b89b674d213682eeae 100644
--- a/src/combustionModels/combustionModel/combustionModel.H
+++ b/src/combustionModels/combustionModel/combustionModel.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -24,8 +24,7 @@ Class
     Foam::combustionModel
 
 Description
-    Base class for all non-premixed combustion models based on single step
-    chemistry
+    Base class for combustion models
 
 SourceFiles
     combustionModel.C
@@ -36,9 +35,7 @@ SourceFiles
 #define combustionModel_H
 
 #include "IOdictionary.H"
-#include "hsCombustionThermo.H"
 #include "turbulenceModel.H"
-#include "runTimeSelectionTables.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -50,29 +47,28 @@ namespace Foam
 \*---------------------------------------------------------------------------*/
 
 class combustionModel
+:
+    public IOdictionary
 {
 
 protected:
 
     // Protected data
 
-        //- Dictionary of coefficients for the particular model
-        dictionary coeffs_;
-
-        //- Reference to the thermodynamics
-        hsCombustionThermo& thermo_;
-
         //- Reference to the turbulence model
-        const compressible::turbulenceModel& turbulence_;
+        compressible::turbulenceModel* turbulencePtr_;
 
         //- Reference to the mesh database
         const fvMesh& mesh_;
 
-        //- Reference to mass-flux field
-        const surfaceScalarField& phi_;
+        //- Active
+        Switch active_;
 
-        //- Reference to the density field
-        const volScalarField& rho_;
+        //- Dictionary of the model
+        dictionary coeffs_;
+
+        //- Model name
+        const word modelType_;
 
 
 private:
@@ -92,101 +88,66 @@ public:
     TypeName("combustionModel");
 
 
-    // Declare run-time constructor selection table
+    // Constructors
 
-        declareRunTimeSelectionTable
-        (
-            autoPtr,
-            combustionModel,
-            dictionary,
-            (
-                const dictionary& combustionProperties,
-                hsCombustionThermo& thermo,
-                const compressible::turbulenceModel& turbulence,
-                const surfaceScalarField& phi,
-                const volScalarField& rho
-            ),
-            (
-                combustionProperties,
-                thermo,
-                turbulence,
-                phi,
-                rho
-            )
-        );
 
+        //- Construct from components
+        combustionModel(const word& modelType, const fvMesh& mesh);
 
-    // Selectors
 
-        //- Return a reference to the selected combustion model
-        static autoPtr<combustionModel> New
-        (
-            const dictionary& combustionProperties,
-            hsCombustionThermo& thermo,
-            const compressible::turbulenceModel& turbulence,
-            const surfaceScalarField& phi,
-            const volScalarField& rho
-        );
+    //- Destructor
+    virtual ~combustionModel();
+
 
+    // Member Functions
 
-    // Constructors
+        // Access
 
-        //- Construct null from components
-        combustionModel
-        (
-            const dictionary& combustionProps,
-            hsCombustionThermo& thermo,
-            const compressible::turbulenceModel& turbulence,
-            const surfaceScalarField& phi,
-            const volScalarField& rho
-        );
 
-        //- Construct from components
-        combustionModel
-        (
-            const word& modelType,
-            const dictionary& combustionProperties,
-            hsCombustionThermo& thermo,
-            const compressible::turbulenceModel& turbulence,
-            const surfaceScalarField& phi,
-            const volScalarField& rho
-        );
+            //- Return const access to the mesh database
+            inline const fvMesh& mesh() const;
 
+            //- Return const access to phi
+            inline const surfaceScalarField& phi() const;
 
-    //- Destructor
-    virtual ~combustionModel();
+            //- Return const access to rho
+            virtual tmp<volScalarField> rho() const = 0;
 
+            //- Return access to turbulence
+            inline const compressible::turbulenceModel& turbulence() const;
 
-    // Member Functions
+            //- Set turbulence
+            inline void setTurbulence
+            (
+                compressible::turbulenceModel& turbModel
+            );
 
-        // Access functions
+            //- Is combustion active?
+            inline const Switch& active() const;
 
-            //- Access combustion dictionary
-            const dictionary coeffs() const
-            {
-                return coeffs_;
-            }
+            //- Return const dictionary of the model
+            inline const dictionary& coeffs() const;
 
 
     // Evolution
 
         //- Correct combustion rate
-        virtual void correct();
+        virtual void correct() = 0;
 
         //- Fuel consumption rate matrix, i.e. source term for fuel equation
-        virtual tmp<fvScalarMatrix> R(volScalarField& Y) const;
+        virtual tmp<fvScalarMatrix> R(const volScalarField& Y) const = 0;
 
         //- Heat release rate calculated from fuel consumption rate matrix
-        virtual tmp<volScalarField> dQ() const;
+        virtual tmp<volScalarField> dQ() const = 0;
 
-        //- Return normalised consumption rate of (fu - fres)
-        virtual tmp<Foam::volScalarField> wFuelNorm() const;
+        //-  Return source for enthalpy equation [kg/m/s3]
+        virtual tmp<volScalarField> Sh() const;
 
 
     // I-O
 
         //- Update properties from given dictionary
-        virtual bool read(const dictionary& combustionProps);
+        virtual bool read();
 };
 
 
@@ -196,6 +157,10 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+#include "combustionModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #endif
 
 // ************************************************************************* //
diff --git a/src/combustionModels/combustionModel/combustionModelI.H b/src/combustionModels/combustionModel/combustionModelI.H
new file mode 100644
index 0000000000000000000000000000000000000000..208ed6d2ee61470b46b91ad5709a449dad62f551
--- /dev/null
+++ b/src/combustionModels/combustionModel/combustionModelI.H
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline const Foam::fvMesh& Foam::combustionModel::mesh() const
+{
+    return mesh_;
+}
+
+
+inline const Foam::surfaceScalarField& Foam::combustionModel::phi() const
+{
+    if (turbulencePtr_)
+    {
+        return turbulencePtr_->phi();
+    }
+    else
+    {
+        FatalErrorIn
+        (
+            "const Foam::compressible::turbulenceModel& "
+            "Foam::combustionModel::turbulence() const "
+        )   << "turbulencePtr_ is empty. Please use "
+            << "combustionModel::setTurbulence "
+            << "(compressible::turbulenceModel& )"
+            << abort(FatalError);
+
+        return turbulencePtr_->phi();
+    }
+}
+
+
+inline const Foam::compressible::turbulenceModel&
+Foam::combustionModel::turbulence() const
+{
+    if (turbulencePtr_)
+    {
+        return *turbulencePtr_;
+    }
+    else
+    {
+        FatalErrorIn
+        (
+            "const Foam::compressible::turbulenceModel& "
+            "Foam::combustionModel::turbulence() const "
+        )   << "turbulencePtr_ is empty. Please use "
+            << "combustionModel::setTurbulence "
+            << "(compressible::turbulenceModel& )"
+            << abort(FatalError);
+
+        return *turbulencePtr_;
+    }
+}
+
+
+inline const Foam::Switch& Foam::combustionModel::active() const
+{
+    return active_;
+}
+
+
+inline void Foam::combustionModel::setTurbulence
+(
+    compressible::turbulenceModel& turbModel
+)
+{
+    turbulencePtr_ = &turbModel;
+}
+
+
+inline const Foam::dictionary& Foam::combustionModel::coeffs() const
+{
+    return coeffs_;
+}
+
+// ************************************************************************* //
diff --git a/src/combustionModels/combustionModel/makeCombustionTypes.H b/src/combustionModels/combustionModel/makeCombustionTypes.H
new file mode 100644
index 0000000000000000000000000000000000000000..f3d2ee8e24028bb0fb21e8bec72926438a5ee6fe
--- /dev/null
+++ b/src/combustionModels/combustionModel/makeCombustionTypes.H
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef makeCombustionTypes_H
+#define makeCombustionTypes_H
+
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#define makeCombustionTypesThermo(CombModel, Comb, Thermo)                    \
+                                                                              \
+    typedef CombModel<Comb, Thermo> CombModel##Comb##Thermo;                  \
+                                                                              \
+                                                                              \
+    defineTemplateTypeNameAndDebugWithName                                    \
+    (                                                                         \
+        CombModel##Comb##Thermo,                                              \
+        #CombModel"<"#Comb","#Thermo">",                                      \
+        0                                                                     \
+    );                                                                        \
+                                                                              \
+                                                                              \
+    addToRunTimeSelectionTable                                                \
+    (                                                                         \
+        Comb,                                                                 \
+        CombModel##Comb##Thermo,                                              \
+        dictionary                                                            \
+    );
+
+#define makeCombustionTypes(CombModel, CombThermoType)                        \
+                                                                              \
+    typedef CombModel<CombThermoType>                                         \
+        CombModel##CombThermoType;                                            \
+                                                                              \
+    defineTemplateTypeNameAndDebugWithName                                    \
+    (                                                                         \
+        CombModel##CombThermoType,                                            \
+        #CombModel"<"#CombThermoType">",                                      \
+        0                                                                     \
+    );                                                                        \
+                                                                              \
+    addToRunTimeSelectionTable                                                \
+    (                                                                         \
+        CombThermoType,                                                       \
+        CombModel##CombThermoType,                                            \
+        dictionary                                                            \
+    );
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C
index 2748e31efa20ff9758d44b584726b4b95427d371..16c32e9e56f50f5e14c66bcda0985f4edf71658b 100644
--- a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C
+++ b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -23,131 +23,80 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "infinitelyFastChemistry.H"
-#include "addToRunTimeSelectionTable.H"
-#include "fvmSup.H"
-
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 namespace Foam
 {
 namespace combustionModels
 {
-    defineTypeNameAndDebug(infinitelyFastChemistry, 0);
-    addToRunTimeSelectionTable
-    (
-        combustionModel,
-        infinitelyFastChemistry,
-        dictionary
-    );
-};
-};
-
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-Foam::combustionModels::infinitelyFastChemistry::infinitelyFastChemistry
+template<class CombThermoType, class ThermoType>
+infinitelyFastChemistry<CombThermoType, ThermoType>::infinitelyFastChemistry
 (
-    const dictionary& combustionProps,
-    hsCombustionThermo& thermo,
-    const compressible::turbulenceModel& turbulence,
-    const surfaceScalarField& phi,
-    const volScalarField& rho
+    const word& modelType, const fvMesh& mesh
 )
 :
-    combustionModel(typeName, combustionProps, thermo, turbulence, phi, rho),
-    C_(readScalar(coeffs_.lookup("C"))),
-    singleMixture_
-    (
-        dynamic_cast<singleStepReactingMixture<gasThermoPhysics>&>(thermo)
-    ),
-    wFuelNorm_
-    (
-        IOobject
-        (
-            "wFuelNorm",
-            mesh_.time().timeName(),
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh_,
-        dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0)
-    )
+    singleStepCombustion<CombThermoType, ThermoType>(modelType, mesh),
+    C_(readScalar(this->coeffs().lookup("C")))
 {}
 
 
 // * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
 
-Foam::combustionModels::infinitelyFastChemistry::~infinitelyFastChemistry()
+template<class CombThermoType, class ThermoType>
+infinitelyFastChemistry<CombThermoType, ThermoType>::~infinitelyFastChemistry()
 {}
 
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-void Foam::combustionModels::infinitelyFastChemistry::correct()
+template<class CombThermoType, class ThermoType>
+void infinitelyFastChemistry<CombThermoType, ThermoType>::correct()
 {
-    singleMixture_.fresCorrect();
-
-    const label fuelI = singleMixture_.fuelIndex();
+    this->wFuel_ ==
+        dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0);
 
-    const volScalarField& YFuel = thermo_.composition().Y()[fuelI];
-
-    const dimensionedScalar s = singleMixture_.s();
-
-    if (thermo_.composition().contains("O2"))
+    if (this->active())
     {
-        const volScalarField& YO2 = thermo_.composition().Y("O2");
-        wFuelNorm_ == rho_/(mesh_.time().deltaT()*C_)*min(YFuel, YO2/s.value());
-    }
-}
-
-
-Foam::tmp<Foam::fvScalarMatrix>
-Foam::combustionModels::infinitelyFastChemistry::R(volScalarField& Y) const
-{
-    const label specieI = thermo_.composition().species()[Y.name()];
-
-    const label fNorm = singleMixture_.specieProd()[specieI];
-
-    const volScalarField fres(singleMixture_.fres(specieI));
+        this->singleMixture_.fresCorrect();
 
-    const volScalarField wSpecie
-    (
-        wFuelNorm_*singleMixture_.specieStoichCoeffs()[specieI]
-      / max(fNorm*(Y - fres), scalar(0.001))
-    );
+        const label fuelI = this->singleMixture_.fuelIndex();
 
-    return -fNorm*wSpecie*fres + fNorm*fvm::Sp(wSpecie, Y);
-}
+        const volScalarField& YFuel = this->thermo_->composition().Y()[fuelI];
 
+        const dimensionedScalar s = this->singleMixture_.s();
 
-Foam::tmp<Foam::volScalarField>
-Foam::combustionModels::infinitelyFastChemistry::dQ() const
-{
-    const label fuelI = singleMixture_.fuelIndex();
-    volScalarField& YFuel = thermo_.composition().Y(fuelI);
+        if (this->thermo_->composition().contains("O2"))
+        {
+            const volScalarField& YO2 = this->thermo_->composition().Y("O2");
 
-    return -singleMixture_.qFuel()*(R(YFuel) & YFuel);
+            this->wFuel_ ==
+                 this->rho()/(this->mesh().time().deltaT()*C_)
+                *min(YFuel, YO2/s.value());
+        }
+    }
 }
 
 
-Foam::tmp<Foam::volScalarField>
-Foam::combustionModels::infinitelyFastChemistry::wFuelNorm() const
+template<class CombThermoType, class ThermoType>
+bool infinitelyFastChemistry<CombThermoType, ThermoType>::read()
 {
-    return wFuelNorm_;
+    if (singleStepCombustion<CombThermoType, ThermoType>::read())
+    {
+        this->coeffs().lookup("C") >> C_ ;
+        return true;
+    }
+    else
+    {
+        return false;
+    }
 }
 
 
-bool Foam::combustionModels::infinitelyFastChemistry::read
-(
-    const dictionary& combustionProps
-)
-{
-    combustionModel::read(combustionProps);
-    coeffs_.lookup("C") >> C_ ;
-
-    return true;
-}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+} // End namespace combustionModels
+} // End namespace Foam
 
-// ************************************************************************* //
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H
index 304dba46a3bbae9c610588fd9890cb648cee7bf2..3293089a621c2a37b8ef6b1b60c24d2e6a3ad0ea 100644
--- a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H
+++ b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -35,10 +35,7 @@ SourceFiles
 
 #ifndef infinitelyFastChemistry_H
 #define infinitelyFastChemistry_H
-
-#include "combustionModel.H"
-#include "singleStepReactingMixture.H"
-#include "thermoPhysicsTypes.H"
+#include "singleStepCombustion.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -51,21 +48,16 @@ namespace combustionModels
                   Class infinitelyFastChemistry Declaration
 \*---------------------------------------------------------------------------*/
 
+template<class CombThermoType, class ThermoType>
 class infinitelyFastChemistry
 :
-    public combustionModel
+    public singleStepCombustion <CombThermoType, ThermoType>
 {
     // Private data
 
         //- Model constant
         scalar C_;
 
-        //- Reference to singleStepReactingMixture mixture
-        singleStepReactingMixture<gasThermoPhysics>& singleMixture_;
-
-        //- Normalised consumption rate of (fu - fres)
-        volScalarField wFuelNorm_;
-
 
     // Private Member Functions
 
@@ -87,11 +79,7 @@ public:
         //- Construct from components
         infinitelyFastChemistry
         (
-            const dictionary& combustionProps,
-            hsCombustionThermo& thermo,
-            const compressible::turbulenceModel& turbulence,
-            const surfaceScalarField& phi,
-            const volScalarField& rho
+            const word& modelType, const fvMesh& mesh
         );
 
 
@@ -106,20 +94,11 @@ public:
             //- Correct combustion rate
             virtual void correct();
 
-            //- Fuel consumption rate matrix, i.e. source term for fuel equation
-            virtual tmp<fvScalarMatrix> R(volScalarField& Y) const;
-
-            //- Heat release rate calculated from fuel consumption rate matrix
-            virtual tmp<volScalarField> dQ() const;
-
-            //- Return normalised consumption rate of (fu - fres)
-            virtual tmp<volScalarField> wFuelNorm() const;
-
 
     // I-O
 
-            //- Update properties from given dictionary
-            virtual bool read(const dictionary& combustionProperties);
+            //- Update properties
+            virtual bool read();
 };
 
 
@@ -128,6 +107,13 @@ public:
 } // End namespace combustionModels
 } // End namespace Foam
 
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "infinitelyFastChemistry.C"
+#endif
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
diff --git a/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistrys.C b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistrys.C
new file mode 100644
index 0000000000000000000000000000000000000000..29315599f40643fa83c33ee35b8bd6b79103985e
--- /dev/null
+++ b/src/combustionModels/infinitelyFastChemistry/infinitelyFastChemistrys.C
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "makeCombustionTypes.H"
+
+#include "thermoPhysicsTypes.H"
+#include "psiCombustionModel.H"
+#include "rhoCombustionModel.H"
+#include "infinitelyFastChemistry.H"
+#include "singleStepCombustion.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+    makeCombustionTypesThermo
+    (
+        infinitelyFastChemistry,
+        psiCombustionModel,
+        gasThermoPhysics
+    );
+
+    makeCombustionTypesThermo
+    (
+        infinitelyFastChemistry,
+        psiCombustionModel,
+        constGasThermoPhysics
+    );
+
+    makeCombustionTypesThermo
+    (
+        infinitelyFastChemistry,
+        rhoCombustionModel,
+        gasThermoPhysics
+    );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.C b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..426d370b8f3ae599cd2b1e68e7739f5f0c73bb0b
--- /dev/null
+++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.C
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "psiChemistryCombustionModel.H"
+
+/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */
+
+namespace Foam
+{
+namespace combustionModels
+{
+    defineTypeNameAndDebug(psiChemistryCombustionModel, 0);
+    defineRunTimeSelectionTable(psiChemistryCombustionModel, dictionary);
+
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+psiChemistryCombustionModel::psiChemistryCombustionModel
+(
+    const word& modelType,
+    const fvMesh& mesh
+)
+:
+    combustionModel(modelType, mesh),
+    pChemistry_(psiChemistryModel::New(mesh))
+{}
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+psiChemistryCombustionModel::~psiChemistryCombustionModel()
+{}
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+
+bool psiChemistryCombustionModel::read()
+{
+    if (combustionModel::read())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace combustionModels
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.H b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..e345904f1cdf4793242bbf3e41c313db6811c5c0
--- /dev/null
+++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModel.H
@@ -0,0 +1,160 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::psiChemistryCombustionModel
+
+Description
+    Combustion models for compressibility-based thermodynamics
+
+SourceFiles
+    psiChemistryCombustionModelI.H
+    psiChemistryCombustionModel.C
+    psiChemistryCombustionModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef psiChemistryCombustionModel_H
+#define psiChemistryCombustionModel_H
+
+#include "combustionModel.H"
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "psiChemistryModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                     class psiChemistryCombustionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class psiChemistryCombustionModel
+:
+    public combustionModel
+{
+
+    // Private Member Functions
+
+        //- Construct as copy (not implemented)
+        psiChemistryCombustionModel(const psiChemistryCombustionModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const psiChemistryCombustionModel&);
+
+
+protected:
+
+    // Protected data
+
+        //- Auto pointer to psiChemistry
+        autoPtr<psiChemistryModel> pChemistry_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("psiChemistryCombustionModel");
+
+
+    //- Declare run-time constructor selection tables
+    declareRunTimeSelectionTable
+    (
+        autoPtr,
+        psiChemistryCombustionModel,
+        dictionary,
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        ),
+        (modelType, mesh)
+    );
+
+
+    // Constructors
+
+
+        //- Construct from components and thermo
+        psiChemistryCombustionModel
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        );
+
+
+
+    //- Selector
+    static autoPtr<psiChemistryCombustionModel> New
+    (
+        const fvMesh& mesh
+    );
+
+
+    //- Destructor
+    virtual ~psiChemistryCombustionModel();
+
+
+    // Member Functions
+
+
+        //- Return access to the thermo package
+        inline psiChemistryModel& pChemistry();
+
+        //- Return const access to the thermo package
+        inline const psiChemistryModel& pChemistry() const;
+
+        //- Return const access to rho
+        inline tmp<volScalarField> rho() const;
+
+        //- Return const access to rho
+        inline const hsCombustionThermo& thermo() const;
+
+        //- Return non const access to rho
+        inline hsCombustionThermo& thermo();
+
+
+    // I-O
+
+        //- Update properties from given dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace combustionModels
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "psiChemistryCombustionModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelI.H b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelI.H
new file mode 100644
index 0000000000000000000000000000000000000000..1a54dab2d26bb52ec7c227331df8850741a55ff0
--- /dev/null
+++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelI.H
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline Foam::psiChemistryModel&
+Foam::combustionModels::psiChemistryCombustionModel::pChemistry()
+{
+    return pChemistry_();
+}
+
+inline const Foam::psiChemistryModel&
+Foam::combustionModels::psiChemistryCombustionModel::
+pChemistry() const
+{
+    return pChemistry_();
+}
+
+inline Foam::tmp<Foam::volScalarField>
+Foam::combustionModels::psiChemistryCombustionModel::rho() const
+{
+    return pChemistry_->thermo().rho();
+}
+
+inline const Foam::hsCombustionThermo&
+Foam::combustionModels::psiChemistryCombustionModel::thermo() const
+{
+    return pChemistry_->thermo();
+}
+
+inline Foam::hsCombustionThermo&
+Foam::combustionModels::psiChemistryCombustionModel::thermo()
+{
+    return pChemistry_->thermo();
+}
+
+// ************************************************************************* //
diff --git a/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelNew.C b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..64c60228d126d82d373e905a86fd1d48a5c84d52
--- /dev/null
+++ b/src/combustionModels/psiChemistryCombustionModel/psiChemistryCombustionModelNew.C
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "psiChemistryCombustionModel.H"
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::combustionModels::psiChemistryCombustionModel>
+Foam::combustionModels::psiChemistryCombustionModel::New
+(
+    const fvMesh& mesh
+)
+{
+    const word combModelName
+    (
+        IOdictionary
+        (
+            IOobject
+            (
+                "combustionProperties",
+                mesh.time().constant(),
+                mesh,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            )
+        ).lookup("combustionModel")
+    );
+
+    Info<< "Selecting combustion model " << combModelName << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(combModelName);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "psiChemistryCombustionModel::New"
+        )   << "Unknown psiChemistryCombustionModel type "
+            << combModelName << endl << endl
+            << "Valid  combustionModels are : " << endl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    const label tempOpen = combModelName.find('<');
+
+    const word className = combModelName(0, tempOpen);
+
+    return autoPtr<psiChemistryCombustionModel>
+        (cstrIter()(className, mesh));
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModel.C b/src/combustionModels/psiCombustionModel/psiCombustionModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..76d52e45413158a337f54f0302cf0d2666af78df
--- /dev/null
+++ b/src/combustionModels/psiCombustionModel/psiCombustionModel.C
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "psiCombustionModel.H"
+
+/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */
+
+namespace Foam
+{
+namespace combustionModels
+{
+    defineTypeNameAndDebug(psiCombustionModel, 0);
+    defineRunTimeSelectionTable(psiCombustionModel, dictionary);
+}
+}
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+
+Foam::combustionModels::psiCombustionModel::psiCombustionModel
+(
+    const word& modelType,
+    const fvMesh& mesh
+)
+:
+    combustionModel(modelType, mesh),
+    thermo_(hsCombustionThermo::New(mesh))
+{}
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::combustionModels::psiCombustionModel::~psiCombustionModel()
+{}
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+
+bool Foam::combustionModels::psiCombustionModel::read()
+{
+    if (combustionModel::read())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+Foam::tmp<Foam::volScalarField>
+Foam::combustionModels::psiCombustionModel::rho() const
+{
+    return thermo_->rho();
+}
+
+// ************************************************************************* //
diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModel.H b/src/combustionModels/psiCombustionModel/psiCombustionModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..aa1e26dac40fdd5c629f7ee88ed2fb6af1644a22
--- /dev/null
+++ b/src/combustionModels/psiCombustionModel/psiCombustionModel.H
@@ -0,0 +1,155 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::psiCombustionModel
+
+Description
+    Combustion models for compressibility-based thermodynamics
+
+SourceFiles
+    psiCombustionModelI.H
+    psiCombustionModel.C
+    psiCombustionModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef psiCombustionModel_H
+#define psiCombustionModel_H
+
+#include "combustionModel.H"
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "hsCombustionThermo.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                     class psiCombustionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class psiCombustionModel
+:
+    public combustionModel
+{
+
+    // Private Member Functions
+
+        //- Construct as copy (not implemented)
+        psiCombustionModel(const psiCombustionModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const psiCombustionModel&);
+
+
+protected:
+
+    // Protected data
+
+
+        //- Thermo package
+        autoPtr<hsCombustionThermo> thermo_;
+
+
+
+
+public:
+
+    //- Runtime type information
+    TypeName("psiCombustionModel");
+
+
+    //- Declare run-time constructor selection tables
+    declareRunTimeSelectionTable
+    (
+        autoPtr,
+        psiCombustionModel,
+        dictionary,
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        ),
+        (modelType, mesh)
+    );
+
+
+    // Constructors
+
+
+        //- Construct from components and thermo
+        psiCombustionModel
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        );
+
+
+
+    //- Selector
+    static autoPtr<psiCombustionModel> New
+    (
+        const fvMesh& mesh
+    );
+
+
+    //- Destructor
+    virtual ~psiCombustionModel();
+
+
+    // Member Functions
+
+        //- Return access to the thermo package
+        inline hsCombustionThermo& thermo();
+
+        //- Return const access to the thermo package
+        inline const hsCombustionThermo& thermo() const;
+
+        //- Return tmp of rho
+        virtual tmp<volScalarField> rho() const;
+
+    // I-O
+
+        //- Update properties from given dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace combustionModels
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "psiCombustionModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModelI.H b/src/combustionModels/psiCombustionModel/psiCombustionModelI.H
new file mode 100644
index 0000000000000000000000000000000000000000..f208d4ea29f6ad582f11f0d6fc95eef1679dbab0
--- /dev/null
+++ b/src/combustionModels/psiCombustionModel/psiCombustionModelI.H
@@ -0,0 +1,41 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline Foam::hsCombustionThermo&
+Foam::combustionModels::psiCombustionModel::thermo()
+{
+    return thermo_();
+}
+
+inline const Foam::hsCombustionThermo&
+Foam::combustionModels::psiCombustionModel::thermo() const
+{
+    return thermo_();
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModelNew.C b/src/combustionModels/psiCombustionModel/psiCombustionModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..28092b4a08972061043c44f8221fe3550a0575c5
--- /dev/null
+++ b/src/combustionModels/psiCombustionModel/psiCombustionModelNew.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "psiCombustionModel.H"
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::combustionModels::psiCombustionModel>
+Foam::combustionModels::psiCombustionModel::New
+(
+    const fvMesh& mesh
+)
+{
+    const word combModelName
+    (
+        IOdictionary
+        (
+            IOobject
+            (
+                "combustionProperties",
+                mesh.time().constant(),
+                mesh,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            )
+        ).lookup("combustionModel")
+    );
+
+    Info<< "Selecting combustion model " << combModelName << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(combModelName);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "psiCombustionModel::New"
+        )   << "Unknown psiCombustionModel type "
+            << combModelName << endl << endl
+            << "Valid  combustionModels are : " << endl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    const label tempOpen = combModelName.find('<');
+
+    const word className = combModelName(0, tempOpen);
+
+    return autoPtr<psiCombustionModel>(cstrIter()(className, mesh));
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModels.C b/src/combustionModels/psiCombustionModel/psiCombustionModels.C
new file mode 100644
index 0000000000000000000000000000000000000000..6bbbb255a7e0d962a67a811224dfdde15aa94cc5
--- /dev/null
+++ b/src/combustionModels/psiCombustionModel/psiCombustionModels.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "makeCombustionTypes.H"
+
+#include "psiCombustionModel.H"
+#include "PaSR.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+    makeCombustionTypes
+    (
+        infinitelyFastChemistry,
+        psiCombustionModel
+    );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.C b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..f427737c8ff901a5838d034585ed57183ef9e0d3
--- /dev/null
+++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.C
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "rhoChemistryCombustionModel.H"
+
+/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */
+
+namespace Foam
+{
+namespace combustionModels
+{
+    defineTypeNameAndDebug(rhoChemistryCombustionModel, 0);
+    defineRunTimeSelectionTable(rhoChemistryCombustionModel, dictionary);
+
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+rhoChemistryCombustionModel::rhoChemistryCombustionModel
+(
+    const word& modelType,
+    const fvMesh& mesh
+)
+:
+    combustionModel(modelType, mesh),
+    pChemistry_(rhoChemistryModel::New(mesh))
+{}
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+rhoChemistryCombustionModel::~rhoChemistryCombustionModel()
+{}
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+
+bool rhoChemistryCombustionModel::read()
+{
+    if (combustionModel::read())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace combustionModels
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.H b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..e288300e6df5038dcdf1f5f856f323b84c405d70
--- /dev/null
+++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModel.H
@@ -0,0 +1,160 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::rhoChemistryCombustionModel
+
+Description
+    Combustion models for compressibility-based thermodynamics
+
+SourceFiles
+    rhoChemistryCombustionModelI.H
+    rhoChemistryCombustionModel.C
+    rhoChemistryCombustionModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef rhoChemistryCombustionModel_H
+#define rhoChemistryCombustionModel_H
+
+#include "combustionModel.H"
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "rhoChemistryModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                     class rhoChemistryCombustionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class rhoChemistryCombustionModel
+:
+    public combustionModel
+{
+
+    // Private Member Functions
+
+        //- Construct as copy (not implemented)
+        rhoChemistryCombustionModel(const rhoChemistryCombustionModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const rhoChemistryCombustionModel&);
+
+
+protected:
+
+    // Protected data
+
+        //- Auto pointer to psiChemistry
+        autoPtr<rhoChemistryModel> pChemistry_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("rhoChemistryCombustionModel");
+
+
+    //- Declare run-time constructor selection tables
+    declareRunTimeSelectionTable
+    (
+        autoPtr,
+        rhoChemistryCombustionModel,
+        dictionary,
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        ),
+        (modelType, mesh)
+    );
+
+
+    // Constructors
+
+
+        //- Construct from components and thermo
+        rhoChemistryCombustionModel
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        );
+
+
+
+    //- Selector
+    static autoPtr<rhoChemistryCombustionModel> New
+    (
+        const fvMesh& mesh
+    );
+
+
+    //- Destructor
+    virtual ~rhoChemistryCombustionModel();
+
+
+    // Member Functions
+
+
+        //- Return access to the thermo package
+        inline rhoChemistryModel& pChemistry();
+
+        //- Return const access to the thermo package
+        inline const rhoChemistryModel& pChemistry() const;
+
+        //- Return const access to rho
+        inline tmp<volScalarField> rho() const;
+
+        //- Return const access to rho
+        inline const hsReactionThermo& thermo() const;
+
+        //- Return non const access to rho
+        inline hsReactionThermo& thermo();
+
+
+    // I-O
+
+        //- Update properties from given dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace combustionModels
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "rhoChemistryCombustionModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelI.H b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelI.H
new file mode 100644
index 0000000000000000000000000000000000000000..93c8d2ea8daba3b4ed14b8d4bba9711bd41e6663
--- /dev/null
+++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelI.H
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline Foam::rhoChemistryModel&
+Foam::combustionModels::rhoChemistryCombustionModel::pChemistry()
+{
+    return pChemistry_();
+}
+
+inline const Foam::rhoChemistryModel&
+Foam::combustionModels::rhoChemistryCombustionModel::
+pChemistry() const
+{
+    return pChemistry_();
+}
+
+inline Foam::tmp<Foam::volScalarField>
+Foam::combustionModels::rhoChemistryCombustionModel::rho() const
+{
+    return pChemistry_->thermo().rho();
+}
+
+inline const Foam::hsReactionThermo&
+Foam::combustionModels::rhoChemistryCombustionModel::thermo() const
+{
+    return pChemistry_->thermo();
+}
+
+inline Foam::hsReactionThermo&
+Foam::combustionModels::rhoChemistryCombustionModel::thermo()
+{
+    return pChemistry_->thermo();
+}
+
+// ************************************************************************* //
diff --git a/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..4df4146f29feb6e69f150990c1dd3958d10a691b
--- /dev/null
+++ b/src/combustionModels/rhoChemistryCombustionModel/rhoChemistryCombustionModelNew.C
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "rhoChemistryCombustionModel.H"
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::combustionModels::rhoChemistryCombustionModel>
+Foam::combustionModels::rhoChemistryCombustionModel::New
+(
+    const fvMesh& mesh
+)
+{
+    const word combModelName
+    (
+        IOdictionary
+        (
+            IOobject
+            (
+                "combustionProperties",
+                mesh.time().constant(),
+                mesh,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            )
+        ).lookup("combustionModel")
+    );
+
+    Info<< "Selecting combustion model " << combModelName << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(combModelName);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "rhoChemistryCombustionModel::New"
+        )   << "Unknown rhoChemistryCombustionModel type "
+            << combModelName << endl << endl
+            << "Valid  combustionModels are : " << endl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    const label tempOpen = combModelName.find('<');
+
+    const word className = combModelName(0, tempOpen);
+
+    return autoPtr<rhoChemistryCombustionModel>
+        (cstrIter()(className, mesh));
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/noCombustion/noCombustion.C b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.C
similarity index 56%
rename from src/combustionModels/noCombustion/noCombustion.C
rename to src/combustionModels/rhoCombustionModel/rhoCombustionModel.C
index 4fc8c7d0c905c11d21c05b7b396c6a3d6439864c..beaebe6aa07b81564540397faac73fa49ffece4b 100644
--- a/src/combustionModels/noCombustion/noCombustion.C
+++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.C
@@ -2,10 +2,11 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
+    This file is part of OpenFOAM.
 
     OpenFOAM is free software: you can redistribute it and/or modify it
     under the terms of the GNU General Public License as published by
@@ -22,45 +23,56 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "noCombustion.H"
-#include "addToRunTimeSelectionTable.H"
+#include "rhoCombustionModel.H"
 
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */
 
 namespace Foam
 {
 namespace combustionModels
 {
-    defineTypeNameAndDebug(noCombustion, 0);
-    addToRunTimeSelectionTable
-    (
-        combustionModel,
-        noCombustion,
-        dictionary
-    );
-};
-};
-
+    defineTypeNameAndDebug(rhoCombustionModel, 0);
+    defineRunTimeSelectionTable(rhoCombustionModel, dictionary);
+}
+}
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-Foam::combustionModels::noCombustion::noCombustion
+
+Foam::combustionModels::rhoCombustionModel::rhoCombustionModel
 (
-    const dictionary& combustionProps,
-    hsCombustionThermo& thermo,
-    const compressible::turbulenceModel& turbulence,
-    const surfaceScalarField& phi,
-    const volScalarField& rho
+    const word& modelType,
+    const fvMesh& mesh
 )
 :
-    combustionModel(combustionProps, thermo, turbulence, phi, rho)
+    combustionModel(modelType, mesh),
+    thermo_(hsReactionThermo::New(mesh))
 {}
 
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
-// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
-
-Foam::combustionModels::noCombustion::~noCombustion()
+Foam::combustionModels::rhoCombustionModel::~rhoCombustionModel()
 {}
 
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::volScalarField>
+Foam::combustionModels::rhoCombustionModel::rho() const
+{
+    return thermo_->rho();
+}
+
+
+bool Foam::combustionModels::rhoCombustionModel::read()
+{
+    if (combustionModel::read())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
 
 // ************************************************************************* //
diff --git a/src/combustionModels/rhoCombustionModel/rhoCombustionModel.H b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..58e499dc8a2f4af8424a2841b8d45e6b6aea546f
--- /dev/null
+++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModel.H
@@ -0,0 +1,158 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::rhoCombustionModel
+
+Description
+    Combustion models for rho-based thermodynamics
+
+SourceFiles
+    rhoCombustionModelI.H
+    rhoCombustionModel.C
+    rhoCombustionModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef rhoCombustionModel_H
+#define rhoCombustionModel_H
+
+#include "combustionModel.H"
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "hsReactionThermo.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                     class rhoCombustionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class rhoCombustionModel
+:
+    public combustionModel
+{
+
+    // Private Member Functions
+
+        //- Construct as copy (not implemented)
+        rhoCombustionModel(const rhoCombustionModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const rhoCombustionModel&);
+
+
+protected:
+
+    // Protected data
+
+        //- Thermo package
+        autoPtr<hsReactionThermo> thermo_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("rhoCombustionModel");
+
+
+    //- Declare run-time constructor selection tables
+    declareRunTimeSelectionTable
+    (
+        autoPtr,
+        rhoCombustionModel,
+        dictionary,
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        ),
+        (modelType, mesh)
+    );
+
+
+    // Constructors
+
+
+        //- Construct from components and thermo
+        rhoCombustionModel
+        (
+            const word& modelType,
+            const fvMesh& mesh
+        );
+
+
+
+    //- Selector
+    static autoPtr<rhoCombustionModel> New
+    (
+        const fvMesh& mesh
+    );
+
+
+    //- Destructor
+    virtual ~rhoCombustionModel();
+
+
+    // Member Functions
+
+        // Access functions
+
+            //- Access combustion dict
+             inline const dictionary& coeff() const;
+
+
+        //- Return access to the thermo package
+        inline hsReactionThermo& thermo();
+
+        //- Return const access to the thermo package
+        inline const hsReactionThermo& thermo() const;
+
+        //- Return tmp of rho
+        virtual tmp<volScalarField> rho() const;
+
+     // I-O
+
+        //- Update properties from given dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace combustionModels
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "rhoCombustionModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/combustionModels/rhoCombustionModel/rhoCombustionModelI.H b/src/combustionModels/rhoCombustionModel/rhoCombustionModelI.H
new file mode 100644
index 0000000000000000000000000000000000000000..23db3695c1d371a4ccb3181f41faf784115f029e
--- /dev/null
+++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModelI.H
@@ -0,0 +1,41 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline Foam::hsReactionThermo&
+Foam::combustionModels::rhoCombustionModel::thermo()
+{
+    return thermo_();
+}
+
+inline const Foam::hsReactionThermo&
+Foam::combustionModels::rhoCombustionModel::thermo() const
+{
+    return thermo_();
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/rhoCombustionModel/rhoCombustionModelNew.C b/src/combustionModels/rhoCombustionModel/rhoCombustionModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..5496f689253ad653eb607a8505ce1a4869aca775
--- /dev/null
+++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModelNew.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "rhoCombustionModel.H"
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::combustionModels::rhoCombustionModel>
+Foam::combustionModels::rhoCombustionModel::New
+(
+    const fvMesh& mesh
+)
+{
+    const word combTypeName
+    (
+        IOdictionary
+        (
+            IOobject
+            (
+                "combustionProperties",
+                mesh.time().constant(),
+                mesh,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            )
+        ).lookup("combustionModel")
+    );
+
+    Info<< "Selecting combustion model " << combTypeName << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(combTypeName);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "rhoCombustionModel::New"
+        )   << "Unknown rhoCombustionModel type "
+            << combTypeName << endl << endl
+            << "Valid  combustionModels are : " << endl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    const label tempOpen = combTypeName.find('<');
+
+    const word className = combTypeName(0, tempOpen);
+
+    return autoPtr<rhoCombustionModel> (cstrIter()(className, mesh));
+}
+
+
+// ************************************************************************* //
diff --git a/src/combustionModels/singleStepCombustion/singleStepCombustion.C b/src/combustionModels/singleStepCombustion/singleStepCombustion.C
new file mode 100644
index 0000000000000000000000000000000000000000..b7ff05fb969e26ce0704340b58625f8a8b80b1e4
--- /dev/null
+++ b/src/combustionModels/singleStepCombustion/singleStepCombustion.C
@@ -0,0 +1,159 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "singleStepCombustion.H"
+#include "fvmSup.H"
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CombThermoType, class ThermoType>
+singleStepCombustion<CombThermoType, ThermoType>
+::singleStepCombustion
+(
+    const word& modelType, const fvMesh& mesh
+)
+:
+    CombThermoType(modelType, mesh),
+    singleMixture_
+    (
+        dynamic_cast<singleStepReactingMixture<ThermoType>&>(this->thermo())
+    ),
+    wFuel_
+    (
+        IOobject
+        (
+            "wFuel",
+            this->mesh().time().timeName(),
+            this->mesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        this->mesh(),
+        dimensionedScalar("zero", dimMass/pow3(dimLength)/dimTime, 0.0)
+    )
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
+
+template<class CombThermoType, class ThermoType>
+singleStepCombustion<CombThermoType, ThermoType>
+::~singleStepCombustion()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+
+template<class CombThermoType, class ThermoType>
+Foam::tmp<Foam::fvScalarMatrix>
+singleStepCombustion<CombThermoType, ThermoType>::R
+(
+    const volScalarField& Y
+) const
+{
+    const label specieI = this->thermo_->composition().species()[Y.name()];
+
+    const label fNorm = singleMixture_.specieProd()[specieI];
+
+    const volScalarField fres(singleMixture_.fres(specieI));
+
+    const volScalarField wSpecie
+    (
+        wFuel_*singleMixture_.specieStoichCoeffs()[specieI]
+      / max(fNorm*(Y - fres), scalar(0.001))
+    );
+
+    return -fNorm*wSpecie*fres + fNorm*fvm::Sp(wSpecie, Y);
+}
+
+
+template<class CombThermoType, class ThermoType>
+Foam::tmp<Foam::volScalarField>
+singleStepCombustion< CombThermoType, ThermoType>::Sh() const
+{
+    const label fuelI = singleMixture_.fuelIndex();
+    const volScalarField& YFuel = this->thermo_->composition().Y(fuelI);
+
+    return -singleMixture_.qFuel()*(R(YFuel) & YFuel);
+}
+
+
+template<class CombThermoType, class ThermoType>
+Foam::tmp<Foam::volScalarField>
+singleStepCombustion< CombThermoType, ThermoType>::dQ() const
+{
+    tmp<volScalarField> tdQ
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "dQ",
+                this->mesh_.time().timeName(),
+                this->mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            this->mesh_,
+            dimensionedScalar("dQ", dimEnergy/dimTime, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+
+    if (this->active())
+    {
+        volScalarField& dQ = tdQ();
+        dQ.dimensionedInternalField() = this->mesh().V()*Sh()();
+    }
+    return tdQ;
+}
+
+
+template<class CombThermoType, class ThermoType>
+bool singleStepCombustion< CombThermoType, ThermoType>::read()
+{
+    if (CombThermoType::read())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace combustionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/combustionModels/singleStepCombustion/singleStepCombustion.H b/src/combustionModels/singleStepCombustion/singleStepCombustion.H
new file mode 100644
index 0000000000000000000000000000000000000000..32c4f952fcc835d4d5b8dc81c49965dcd50be151
--- /dev/null
+++ b/src/combustionModels/singleStepCombustion/singleStepCombustion.H
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+
+    OpenFOAM 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.
+
+    OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::combustionModels::singleStepCombustion
+
+Description
+    Base class for combustion models using singleStepReactingMixture.
+
+SourceFiles
+    singleStepCombustion.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef singleStepCombustion_H
+#define singleStepCombustion_H
+
+#include "singleStepReactingMixture.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace combustionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                  Class singleStepCombustion Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CombThermoType, class ThermoType>
+class singleStepCombustion
+:
+    public CombThermoType
+{
+
+protected:
+
+    // Protected data
+
+        //- Reference to singleStepReactingMixture mixture
+        singleStepReactingMixture<ThermoType>& singleMixture_;
+
+        //- Fuel consumption rate
+        volScalarField wFuel_;
+
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow copy construct
+        singleStepCombustion(const singleStepCombustion&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const singleStepCombustion&);
+
+
+public:
+
+
+    // Constructors
+
+        //- Construct from components
+        singleStepCombustion
+        (
+            const word& modelType, const fvMesh& mesh
+        );
+
+
+    //- Destructor
+    virtual ~singleStepCombustion();
+
+
+    // Member Functions
+
+        // Evolution
+
+
+            //- Fuel consumption rate matrix
+            virtual tmp<fvScalarMatrix> R(const volScalarField& Y) const;
+
+            //- Heat release rate calculated from fuel consumption rate matrix
+            virtual tmp<volScalarField> dQ() const;
+
+            //- Sensible enthalpy source term
+            virtual tmp<volScalarField> Sh() const;
+
+
+    // I-O
+
+            //- Update properties from given dictionary
+            virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace combustionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#ifdef NoRepository
+#   include "singleStepCombustion.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties b/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties
index 8d6965f6b7137d7af9be749b3e7f1268cdc0f1c8..6608c94f4e4babd2c006cc9a384465d16ae7dab8 100644
--- a/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties
+++ b/tutorials/combustion/dieselFoam/aachenBomb/constant/combustionProperties
@@ -15,15 +15,16 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 1;
+combustionModel  PaSR<psiChemistryCombustionModel>;
 
-ignitionProperties1
+active  true;
+
+PaSRCoeffs
 {
-    ignite          on;
-    ignitionPoint   ignitionPoint [ 0 1 0 0 0 0 0 ] ( 0.2 0 0.02 );
-    timing          timing [ 0 0 1 0 0 0 0 ] 0;
-    duration        duration [ 0 0 1 0 0 0 0 ] 1;
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1;
+    turbulentReaction   on;
 }
 
 
+
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties
index c6378c0612e0b1e1bfd5f9f4ddcbbf9a3b723e70..95bc43ae376973e90796296d208b2bf01ce6296c 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties
@@ -15,7 +15,9 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-combustionModel    infinitelyFastChemistry;
+combustionModel  infinitelyFastChemistry<psiCombustionModel,gasThermoPhysics>;
+
+active true;
 
 infinitelyFastChemistryCoeffs
 {
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/panelRegion/cellDecomposition b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/panelRegion/cellDecomposition
deleted file mode 100644
index 07dc8690bb106cb53695b765b617e1eb8a5d167a..0000000000000000000000000000000000000000
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/panelRegion/cellDecomposition
+++ /dev/null
@@ -1,34104 +0,0 @@
-/*--------------------------------*- C++ -*----------------------------------*\
-| =========                 |                                                 |
-| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
-|  \\    /   O peration     | Version:  dev                                   |
-|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
-|    \\/     M anipulation  |                                                 |
-\*---------------------------------------------------------------------------*/
-FoamFile
-{
-    version     2.0;
-    format      ascii;
-    class       labelList;
-    location    "constant";
-    object      cellDecomposition;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-
-34080
-(
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-3
-3
-3
-3
-3
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-4
-4
-4
-4
-4
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-4
-)
-
-
-// ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties
index 51f63787132188da77d2b98b5a414d3e735c5c7b..aeb4fd4cf46eba93ea16a2fdca7ea1c34627e762 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties
@@ -15,16 +15,44 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-combustionModel    infinitelyFastChemistry;
+//combustionModel  infinitelyFastChemistry<psiCombustionModel,gasThermoPhysics>;
+combustionModel  FSD<psiCombustionModel,gasThermoPhysics>;
+
+active  true;
 
 infinitelyFastChemistryCoeffs
 {
-    C       10.0;
+    C       5.0;
 }
 
-noCombustionCoeffs
+FSDCoeffs
 {
-}
+    Cv          0.1;
+    ftVarMin    1e-2;
+
+    reactionRateFlameArea relaxation;
 
+    fuel                Methane;
+
+    relaxationCoeffs
+    {
+        C                     2.0;
+        alpha                 1.0;
+        Methane
+        {
+            omega0            0.5;
+            eta               -0.013;
+            omegaMin          0.01;
+            sigmaExt          470;
+        }
+        Propane
+        {
+            omega0            0.4;
+            eta               -0.00656;
+            omegaMin          0.01;
+            sigmaExt          450;
+        }
+    }
+}
 
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions
index c174cf789ecfdfbaf6128592efbd6123e013f690..67f2373c382e5477caeeada95dc46a061ee97423 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions
@@ -12,6 +12,6 @@ reactions
     propaneReaction
     {
         type         irreversibleinfiniteReaction;
-        reaction     "CH4 + 2O2 = CO2 + 2H2O";
+        reaction     "CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2";
     }
 }
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties
index de54b0bbc10176c603037ff2d6c9908ea9574c72..f528cf3e1284a4d12698c3738dc91aca7b597747 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/combustionProperties
@@ -16,16 +16,14 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-combustionModel    infinitelyFastChemistry;
+//combustionModel  infinitelyFastChemistry<psiCombustionModel,gasThermoPhysics>;
+
+active  on;
 
 infinitelyFastChemistryCoeffs
 {
     C       5.0;
 }
 
-noCombustionCoeffs
-{
-}
-
 
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions
index c174cf789ecfdfbaf6128592efbd6123e013f690..3c6e45a0d6883fd69019f831ae3758bda192e5c3 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/reactions
@@ -12,6 +12,6 @@ reactions
     propaneReaction
     {
         type         irreversibleinfiniteReaction;
-        reaction     "CH4 + 2O2 = CO2 + 2H2O";
+        reaction      "CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2";
     }
 }
diff --git a/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties
index 14d3f4ab0aed2d7816a2e3baaad052eb4c175361..80cafe049a753c2deb2d47be3999ac1ed8970156 100644
--- a/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties
+++ b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/chemistryProperties
@@ -23,8 +23,6 @@ chemistrySolver     ode;
 
 initialChemicalTimeStep 1e-07;
 
-turbulentReaction   on;
-
 sequentialCoeffs
 {
     cTauChem        0.001;
@@ -43,6 +41,4 @@ odeCoeffs
     scale           1;
 }
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 0.1;
-
 // ************************************************************************* //
diff --git a/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/combustionProperties b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/combustionProperties
new file mode 100644
index 0000000000000000000000000000000000000000..cd5f6c35e1cc7835b9797a391cae0190c8e071f8
--- /dev/null
+++ b/tutorials/combustion/reactingFoam/ras/counterFlowFlame2D/constant/combustionProperties
@@ -0,0 +1,34 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      combustionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+combustionModel  PaSR<psiChemistryCombustionModel>;
+
+active  true;
+
+infinitelyFastChemistryCoeffs
+{
+    C       10.0;
+}
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 0.1;
+    turbulentReaction   on;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties
index 67ea1f828dfb41dd86a79bd54ab9986f09dd1d90..5f0483df1b9ad7fc60e590bb1ab9f0681c9d8090 100644
--- a/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties
+++ b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/chemistryProperties
@@ -25,8 +25,4 @@ chemCalcFreq        1;
 
 initialChemicalTimeStep  1e-8; // NOT USED
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 0.1;
-
-turbulentReaction   on;
-
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/combustionProperties b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/combustionProperties
new file mode 100644
index 0000000000000000000000000000000000000000..a07f7b12b79a51be9ece8b6e6e9d349c2a211817
--- /dev/null
+++ b/tutorials/lagrangian/LTSReactingParcelFoam/counterFlowFlame2D/constant/combustionProperties
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      combustionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+combustionModel  PaSR<rhoChemistryCombustionModel>;
+
+active  true;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 0.1;
+    turbulentReaction   on;
+    useReactionRate     true;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties
index 1c723e893176e751b44432dea6fc22bad07827da..69f6f932345866f38fb1c8cdfbbb2fa78fb4cfeb 100644
--- a/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties
+++ b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/chemistryProperties
@@ -19,9 +19,6 @@ rhoChemistryModel  ODEChemistryModel<icoPoly8ThermoPhysics>;
 
 chemistry       off;
 
-
-turbulentReaction off;
-
 chemistrySolver noChemistrySolver;
 
 initialChemicalTimeStep 1e-07;  // NOT USED
diff --git a/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/combustionProperties b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/combustionProperties
new file mode 100644
index 0000000000000000000000000000000000000000..7b938bb47730a20ae9b66cd5422cbe6e862609cf
--- /dev/null
+++ b/tutorials/lagrangian/LTSReactingParcelFoam/verticalChannel/constant/combustionProperties
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      combustionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+combustionModel  PaSR<rhoChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 0.1;
+    turbulentReaction   off;
+    useReactionRate     true;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties
index fd54b847684388b2766bb421f6dc35976272347b..cbce99c7700fc9c29edaac6bbbf3abf5466a31ee 100644
--- a/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties
+++ b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/chemistryProperties
@@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
 
 chemistry       on;
 
-turbulentReaction on;
-
 chemistrySolver ode;
 
 initialChemicalTimeStep 1e-07;
@@ -44,7 +42,5 @@ odeCoeffs
     scale           1;
 }
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 1;
-
 
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/chemistryProperties b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties
similarity index 80%
rename from tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/chemistryProperties
rename to tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties
index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..83adafa2d4f605b12f8e21011b9712722d728973 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/chemistryProperties
+++ b/tutorials/lagrangian/coalChemistryFoam/simplifiedSiwek/constant/combustionProperties
@@ -11,19 +11,20 @@ FoamFile
     format      ascii;
     class       dictionary;
     location    "constant";
-    object      chemistryProperties;
+    object      combustionProperties;
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
+combustionModel  PaSR<psiChemistryCombustionModel>;
 
-chemistry       off;
+active  true;
 
-turbulentReaction off;
 
-chemistrySolver noChemistrySolver;
-
-initialChemicalTimeStep 1e-07;
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   on;
+}
 
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties
index d332d6144c4dff6be5f1143fb899738a8dff8c1b..8bc89b0f589a6790ba4e9c781908a2ebeffea12f 100644
--- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties
+++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/chemistryProperties
@@ -19,8 +19,6 @@ rhoChemistryModel  ODEChemistryModel<icoPoly8ThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver ode;
 
 initialChemicalTimeStep 1e-07;
@@ -44,7 +42,5 @@ odeCoeffs
     scale           1;
 }
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 1;
-
 
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties
similarity index 80%
rename from tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties
rename to tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties
index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..dc51ca05f7392d872afc49f249abb0ca0f16536a 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties
+++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/filter/constant/combustionProperties
@@ -11,19 +11,19 @@ FoamFile
     format      ascii;
     class       dictionary;
     location    "constant";
-    object      chemistryProperties;
+    object      combustionProperties;
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
+combustionModel  PaSR<rhoChemistryCombustionModel>;
 
-chemistry       off;
+active  false;
 
-turbulentReaction off;
-
-chemistrySolver noChemistrySolver;
-
-initialChemicalTimeStep 1e-07;
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   off;
+}
 
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties
index d332d6144c4dff6be5f1143fb899738a8dff8c1b..8bc89b0f589a6790ba4e9c781908a2ebeffea12f 100644
--- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties
+++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/chemistryProperties
@@ -19,8 +19,6 @@ rhoChemistryModel  ODEChemistryModel<icoPoly8ThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver ode;
 
 initialChemicalTimeStep 1e-07;
@@ -44,7 +42,5 @@ odeCoeffs
     scale           1;
 }
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 1;
-
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/combustionProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/combustionProperties
new file mode 100644
index 0000000000000000000000000000000000000000..dc51ca05f7392d872afc49f249abb0ca0f16536a
--- /dev/null
+++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/parcelInBox/constant/combustionProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      combustionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+combustionModel  PaSR<rhoChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   off;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties
index d332d6144c4dff6be5f1143fb899738a8dff8c1b..8bc89b0f589a6790ba4e9c781908a2ebeffea12f 100644
--- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties
+++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/chemistryProperties
@@ -19,8 +19,6 @@ rhoChemistryModel  ODEChemistryModel<icoPoly8ThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver ode;
 
 initialChemicalTimeStep 1e-07;
@@ -44,7 +42,5 @@ odeCoeffs
     scale           1;
 }
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 1;
-
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/combustionProperties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/combustionProperties
new file mode 100644
index 0000000000000000000000000000000000000000..dc51ca05f7392d872afc49f249abb0ca0f16536a
--- /dev/null
+++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/combustionProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      combustionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+combustionModel  PaSR<rhoChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   off;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties
index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/chemistryProperties
@@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver noChemistrySolver;
 
 initialChemicalTimeStep 1e-07;
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties
index 4d6e2a96b0030adb10594884242240aff3cc76b9..86e6e0388b3899e36d707e8efa38e29b459abe86 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/combustionProperties
@@ -15,7 +15,15 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-combustionModel    none;
+combustionModel  PaSR<psiChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   on;
+}
 
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties
index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/chemistryProperties
@@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver noChemistrySolver;
 
 initialChemicalTimeStep 1e-07;
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties
index 4d6e2a96b0030adb10594884242240aff3cc76b9..7c6acfaadd0776258477a4db18a228fc7a9fdfd3 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/combustionProperties
@@ -15,7 +15,15 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-combustionModel    none;
+combustionModel  PaSR<psiChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   off;
+}
 
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties
index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/chemistryProperties
@@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver noChemistrySolver;
 
 initialChemicalTimeStep 1e-07;
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties
index 4d6e2a96b0030adb10594884242240aff3cc76b9..7c6acfaadd0776258477a4db18a228fc7a9fdfd3 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/rivuletPanel/constant/combustionProperties
@@ -15,7 +15,15 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-combustionModel    none;
+combustionModel  PaSR<psiChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   off;
+}
 
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties
index fca4f15a5cacd9815e78fb5fd469bb34807f1c5e..36247042de2dc5d7c5b166134110ccf19f8e884e 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/chemistryProperties
@@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver noChemistrySolver;
 
 initialChemicalTimeStep 1e-07;
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties
index 4d6e2a96b0030adb10594884242240aff3cc76b9..7c6acfaadd0776258477a4db18a228fc7a9fdfd3 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/combustionProperties
@@ -15,7 +15,15 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-combustionModel    none;
+combustionModel  PaSR<psiChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   off;
+}
 
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties
index 462583d3e25646bed8bb64009d7ca0ecd4238419..4a82f1bffdd2d91a77acb5a93741cc953b515bc2 100644
--- a/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties
+++ b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/chemistryProperties
@@ -19,8 +19,6 @@ psiChemistryModel ODEChemistryModel<gasThermoPhysics>;
 
 chemistry       off;
 
-turbulentReaction off;
-
 chemistrySolver ode;
 
 initialChemicalTimeStep 1e-07;
@@ -43,7 +41,5 @@ odeCoeffs
     scale           1;
 }
 
-Cmix            Cmix [ 0 0 0 0 0 0 0 ] 1;
-
 
 // ************************************************************************* //
diff --git a/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/combustionProperties b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/combustionProperties
new file mode 100644
index 0000000000000000000000000000000000000000..7c6acfaadd0776258477a4db18a228fc7a9fdfd3
--- /dev/null
+++ b/tutorials/lagrangian/reactingParcelFoam/evaporationTest/constant/combustionProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      combustionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+combustionModel  PaSR<psiChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   off;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties
index 5612988231f268a3913dd7d6053b17a8ffbe2d8b..82a5c663e00184008f60f5fe603f560c4a4c0bf4 100644
--- a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties
+++ b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/chemistryProperties
@@ -23,10 +23,6 @@ chemistrySolver ode;
 
 initialChemicalTimeStep 1e-07;
 
-turbulentReaction yes;
-
-Cmix Cmix [0 0 0 0 0] 1;
-
 odeCoeffs
 {
     solver          SIBS;
diff --git a/tutorials/lagrangian/sprayFoam/aachenBomb/constant/combustionProperties b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/combustionProperties
new file mode 100644
index 0000000000000000000000000000000000000000..abba13a97fd68fe6a8b6e9ab4eb9346454676a6a
--- /dev/null
+++ b/tutorials/lagrangian/sprayFoam/aachenBomb/constant/combustionProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      combustionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+combustionModel  PaSR<psiChemistryCombustionModel>;
+
+active  false;
+
+PaSRCoeffs
+{
+    Cmix                Cmix [ 0 0 0 0 0 0 0 ] 1.0;
+    turbulentReaction   yes;
+}
+
+
+// ************************************************************************* //