diff --git a/wetb/utils/report_generator/docx_document/__init__.py b/wetb/utils/report_generator/docx_document/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/_rels/.rels b/wetb/utils/report_generator/docx_document/docx-template_clean/_rels/.rels
new file mode 100644
index 0000000000000000000000000000000000000000..7d3b4d2dfc20a100c75a68089002f3965a8ee0fa
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/_rels/.rels
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
+<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
+<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
+<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
+<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officedocument/2006/relationships/metadata/core-properties" Target="docProps/core0.xml"/>
+</Relationships>
\ No newline at end of file
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/fontTable.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/fontTable.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c47d943404cc6d8508e71beab7b06c870f93e72c
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/fontTable.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:fonts xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
+	<w:font w:name="Symbol">
+		<w:panose1 w:val="02000500000000000000"/>
+		<w:charset w:val="02"/>
+		<w:family w:val="auto"/>
+		<w:pitch w:val="variable"/>
+		<w:sig w:usb0="00000000" w:usb1="00000000" w:usb2="00010000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000"/>
+	</w:font>
+	<w:font w:name="Times New Roman">
+		<w:panose1 w:val="02020603050405020304"/>
+		<w:charset w:val="00"/>
+		<w:family w:val="auto"/>
+		<w:pitch w:val="variable"/>
+		<w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
+	</w:font>
+	<w:font w:name="Courier New">
+		<w:panose1 w:val="02070309020205020404"/>
+		<w:charset w:val="00"/>
+		<w:family w:val="auto"/>
+		<w:pitch w:val="variable"/>
+		<w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
+	</w:font>
+	<w:font w:name="Wingdings">
+		<w:panose1 w:val="05020102010804080708"/>
+		<w:charset w:val="02"/>
+		<w:family w:val="auto"/>
+		<w:pitch w:val="variable"/>
+		<w:sig w:usb0="00000000" w:usb1="00000000" w:usb2="00010000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000"/>
+	</w:font>
+	<w:font w:name="Cambria">
+		<w:panose1 w:val="02040503050406030204"/>
+		<w:charset w:val="00"/>
+		<w:family w:val="auto"/>
+		<w:pitch w:val="variable"/>
+		<w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
+	</w:font>
+	<w:font w:name="Calibri">
+		<w:panose1 w:val="020F0502020204030204"/>
+		<w:charset w:val="00"/>
+		<w:family w:val="auto"/>
+		<w:pitch w:val="variable"/>
+		<w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
+	</w:font>
+	<w:font w:name="Arial">
+		<w:panose1 w:val="020B0604020202020204"/>
+		<w:charset w:val="00"/>
+		<w:family w:val="auto"/>
+		<w:pitch w:val="variable"/>
+		<w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
+	</w:font>
+</w:fonts>
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/footer1.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/footer1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f1531e0f808cdb3365a79648c070479350121f57
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/footer1.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:ftr xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14"><w:p w:rsidR="001B1717" w:rsidRDefault="001B1717"><w:pPr><w:pStyle w:val="Footer"/></w:pPr><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:t>LEFT</w:t></w:r><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:tab/></w:r><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:tab/></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:sz w:val="20"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:sz w:val="20"/></w:rPr><w:instrText xml:space="preserve"> PAGE   \* MERGEFORMAT </w:instrText></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:sz w:val="20"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r w:rsidR="004C0EAC"><w:rPr><w:noProof/><w:sz w:val="20"/></w:rPr><w:t>1</w:t></w:r><w:r w:rsidRPr="001B1717"><w:rPr><w:noProof/><w:sz w:val="20"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:p></w:ftr>
\ No newline at end of file
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/numbering.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/numbering.xml
new file mode 100644
index 0000000000000000000000000000000000000000..415ef5183d82e443ca68cb05ae6638d6531a37c7
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/numbering.xml
@@ -0,0 +1,509 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:numbering xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:mo="http://schemas.microsoft.com/office/mac/office/2008/main" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
+	<w:abstractNum w:abstractNumId="0">
+		<w:nsid w:val="FFFFFF1D"/>
+		<w:multiLevelType w:val="multilevel"/>
+		<w:tmpl w:val="D0409C7C"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val=""/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="0"/>
+				</w:tabs>
+				<w:ind w:left="0" w:firstLine="0"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="1">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="ï‚·"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="720"/>
+				</w:tabs>
+				<w:ind w:left="1080" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="2">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="o"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="1440"/>
+				</w:tabs>
+				<w:ind w:left="1800" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="3">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val=""/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="2160"/>
+				</w:tabs>
+				<w:ind w:left="2520" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="4">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val=""/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="2880"/>
+				</w:tabs>
+				<w:ind w:left="3240" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="5">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="ï‚·"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="3600"/>
+				</w:tabs>
+				<w:ind w:left="3960" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="6">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="o"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="4320"/>
+				</w:tabs>
+				<w:ind w:left="4680" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="7">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val=""/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="5040"/>
+				</w:tabs>
+				<w:ind w:left="5400" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+		<w:lvl w:ilvl="8">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val=""/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="5760"/>
+				</w:tabs>
+				<w:ind w:left="6120" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="1">
+		<w:nsid w:val="FFFFFF7C"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="9B522538"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%1."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="1492"/>
+				</w:tabs>
+				<w:ind w:left="1492" w:hanging="360"/>
+			</w:pPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="2">
+		<w:nsid w:val="FFFFFF7D"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="1BB4178C"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%1."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="1209"/>
+				</w:tabs>
+				<w:ind w:left="1209" w:hanging="360"/>
+			</w:pPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="3">
+		<w:nsid w:val="FFFFFF7E"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="4720F336"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%1."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="926"/>
+				</w:tabs>
+				<w:ind w:left="926" w:hanging="360"/>
+			</w:pPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="4">
+		<w:nsid w:val="FFFFFF7F"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="7DCEC040"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%1."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="643"/>
+				</w:tabs>
+				<w:ind w:left="643" w:hanging="360"/>
+			</w:pPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="5">
+		<w:nsid w:val="FFFFFF80"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="A01021FA"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="ï‚·"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="1492"/>
+				</w:tabs>
+				<w:ind w:left="1492" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="6">
+		<w:nsid w:val="FFFFFF81"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="977AAC7C"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="ï‚·"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="1209"/>
+				</w:tabs>
+				<w:ind w:left="1209" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="7">
+		<w:nsid w:val="FFFFFF82"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="0D26C678"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="ï‚·"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="926"/>
+				</w:tabs>
+				<w:ind w:left="926" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="8">
+		<w:nsid w:val="FFFFFF83"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="EE200B76"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:lvlText w:val="ï‚·"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="643"/>
+				</w:tabs>
+				<w:ind w:left="643" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="9">
+		<w:nsid w:val="FFFFFF88"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="E7381406"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:pStyle w:val="ListNumber"/>
+			<w:lvlText w:val="%1."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="360"/>
+				</w:tabs>
+				<w:ind w:left="360" w:hanging="360"/>
+			</w:pPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="10">
+		<w:nsid w:val="FFFFFF89"/>
+		<w:multiLevelType w:val="singleLevel"/>
+		<w:tmpl w:val="ECFC1548"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="bullet"/>
+			<w:pStyle w:val="ListBullet"/>
+			<w:lvlText w:val="ï‚·"/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="360"/>
+				</w:tabs>
+				<w:ind w:left="360" w:hanging="360"/>
+			</w:pPr>
+			<w:rPr>
+				<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
+			</w:rPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:abstractNum w:abstractNumId="11">
+		<w:nsid w:val="30585973"/>
+		<w:multiLevelType w:val="multilevel"/>
+		<w:tmpl w:val="A47E15CE"/>
+		<w:lvl w:ilvl="0">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%1."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="720"/>
+				</w:tabs>
+				<w:ind w:left="720" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="1">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%2."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="1440"/>
+				</w:tabs>
+				<w:ind w:left="1440" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="2">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%3."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="2160"/>
+				</w:tabs>
+				<w:ind w:left="2160" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="3">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%4."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="2880"/>
+				</w:tabs>
+				<w:ind w:left="2880" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="4">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%5."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="3600"/>
+				</w:tabs>
+				<w:ind w:left="3600" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="5">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%6."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="4320"/>
+				</w:tabs>
+				<w:ind w:left="4320" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="6">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%7."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="5040"/>
+				</w:tabs>
+				<w:ind w:left="5040" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="7">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%8."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="5760"/>
+				</w:tabs>
+				<w:ind w:left="5760" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+		<w:lvl w:ilvl="8">
+			<w:start w:val="1"/>
+			<w:numFmt w:val="decimal"/>
+			<w:lvlText w:val="%9."/>
+			<w:lvlJc w:val="left"/>
+			<w:pPr>
+				<w:tabs>
+					<w:tab w:val="num" w:pos="6480"/>
+				</w:tabs>
+				<w:ind w:left="6480" w:hanging="720"/>
+			</w:pPr>
+		</w:lvl>
+	</w:abstractNum>
+	<w:num w:numId="1">
+		<w:abstractNumId w:val="11"/>
+	</w:num>
+	<w:num w:numId="2">
+		<w:abstractNumId w:val="11"/>
+		<w:lvlOverride w:ilvl="0">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="1">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="2">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="3">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="4">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="5">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="6">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="7">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+		<w:lvlOverride w:ilvl="8">
+			<w:startOverride w:val="1"/>
+		</w:lvlOverride>
+	</w:num>
+	<w:num w:numId="3">
+		<w:abstractNumId w:val="4"/>
+	</w:num>
+	<w:num w:numId="4">
+		<w:abstractNumId w:val="3"/>
+	</w:num>
+	<w:num w:numId="5">
+		<w:abstractNumId w:val="2"/>
+	</w:num>
+	<w:num w:numId="6">
+		<w:abstractNumId w:val="1"/>
+	</w:num>
+	<w:num w:numId="7">
+		<w:abstractNumId w:val="0"/>
+	</w:num>
+	<w:num w:numId="8">
+		<w:abstractNumId w:val="10"/>
+	</w:num>
+	<w:num w:numId="9">
+		<w:abstractNumId w:val="8"/>
+	</w:num>
+	<w:num w:numId="10">
+		<w:abstractNumId w:val="7"/>
+	</w:num>
+	<w:num w:numId="11">
+		<w:abstractNumId w:val="6"/>
+	</w:num>
+	<w:num w:numId="12">
+		<w:abstractNumId w:val="5"/>
+	</w:num>
+	<w:num w:numId="13">
+		<w:abstractNumId w:val="9"/>
+	</w:num>
+</w:numbering>
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/settings.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..92dfa3f4874cb391eb7e27d2d8b8cec6d19483ea
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/settings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:settings xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main">
+  <w:zoom w:percent="90"/>
+  <w:embedSystemFonts/>
+  <w:proofState w:spelling="clean" w:grammar="clean"/>
+  <w:stylePaneFormatFilter w:val="0004"/>
+  <w:doNotTrackMoves/>
+  <w:defaultTabStop w:val="720"/>
+  <w:drawingGridHorizontalSpacing w:val="360"/>
+  <w:drawingGridVerticalSpacing w:val="360"/>
+  <w:displayHorizontalDrawingGridEvery w:val="0"/>
+  <w:displayVerticalDrawingGridEvery w:val="0"/>
+  <w:characterSpacingControl w:val="doNotCompress"/>
+  <w:savePreviewPicture/>
+  <w:rsids>
+    <w:rsidRoot w:val="00590D07"/>
+    <w:rsid w:val="00011C8B"/>
+    <w:rsid w:val="004E29B3"/>
+    <w:rsid w:val="00590D07"/>
+    <w:rsid w:val="00784D58"/>
+    <w:rsid w:val="008D6863"/>
+    <w:rsid w:val="00B86B75"/>
+    <w:rsid w:val="00BC48D5"/>
+    <w:rsid w:val="00C36279"/>
+    <w:rsid w:val="00E315A3"/>
+  </w:rsids>
+  <m:mathPr>
+    <m:mathFont m:val="Lucida Grande"/>
+    <m:brkBin m:val="before"/>
+    <m:brkBinSub m:val="--"/>
+    <m:smallFrac m:val="false"/>
+    <m:dispDef m:val="false"/>
+    <m:lMargin m:val="0"/>
+    <m:rMargin m:val="0"/>
+    <m:wrapRight/>
+    <m:intLim m:val="subSup"/>
+    <m:naryLim m:val="subSup"/>
+  </m:mathPr>
+  <w:themeFontLang w:val="en-US"/>
+  <w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink"/>
+  <w:decimalSymbol w:val="."/>
+  <w:listSeparator w:val=","/>
+</w:settings>
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0d8224a617a170367b15373b4946f2cc5404bc57
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles.xml
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:styles xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
+<w:docDefaults>
+<w:rPrDefault>
+<w:rPr>
+<w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/>
+<w:sz w:val="24"/>
+<w:szCs w:val="24"/>
+<w:lang w:val="en-US" w:eastAsia="en-US" w:bidi="ar-SA"/>
+</w:rPr>
+</w:rPrDefault>
+<w:pPrDefault>
+<w:pPr>
+<w:spacing w:after="200"/>
+</w:pPr>
+</w:pPrDefault>
+</w:docDefaults>
+<w:latentStyles w:defLockedState="0" w:defUIPriority="0" w:defSemiHidden="0" w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="276"/>
+<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
+<w:name w:val="Normal"/>
+<w:qFormat/>
+<w:rsid w:val="000D33D5"/>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+</w:style>
+<w:style w:type="paragraph" w:styleId="Heading1">
+<w:name w:val="heading 1"/>
+<w:basedOn w:val="Normal"/>
+<w:next w:val="Normal"/>
+<w:link w:val="Heading1Char"/>
+<w:uiPriority w:val="9"/>
+<w:qFormat/>
+<w:rsid w:val="00E315A3"/>
+<w:pPr>
+<w:keepNext/>
+<w:keepLines/>
+<w:spacing w:before="480" w:after="0"/>
+<w:outlineLvl w:val="0"/>
+</w:pPr>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/>
+<w:sz w:val="32"/>
+<w:szCs w:val="32"/>
+</w:rPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="Heading2">
+<w:name w:val="heading 2"/>
+<w:basedOn w:val="Normal"/>
+<w:next w:val="Normal"/>
+<w:link w:val="Heading2Char"/>
+<w:uiPriority w:val="9"/>
+<w:unhideWhenUsed/>
+<w:qFormat/>
+<w:rsid w:val="00E315A3"/>
+<w:pPr>
+<w:keepNext/>
+<w:keepLines/>
+<w:spacing w:before="200" w:after="0"/>
+<w:outlineLvl w:val="1"/>
+</w:pPr>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="4F81BD" w:themeColor="accent1"/>
+<w:sz w:val="26"/>
+<w:szCs w:val="26"/>
+</w:rPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="Heading3">
+<w:name w:val="heading 3"/>
+<w:basedOn w:val="Normal"/>
+<w:next w:val="Normal"/>
+<w:link w:val="Heading3Char"/>
+<w:uiPriority w:val="9"/>
+<w:unhideWhenUsed/>
+<w:qFormat/>
+<w:rsid w:val="00E315A3"/>
+<w:pPr>
+<w:keepNext/>
+<w:keepLines/>
+<w:spacing w:before="100" w:after="0"/>
+<w:outlineLvl w:val="1"/>
+</w:pPr>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="4F81BD" w:themeColor="accent1"/>
+<w:sz w:val="22"/>
+<w:szCs w:val="22"/>
+</w:rPr>
+</w:style>
+<w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont">
+<w:name w:val="Default Paragraph Font"/>
+<w:semiHidden/>
+<w:unhideWhenUsed/>
+</w:style>
+<w:style w:type="table" w:default="1" w:styleId="TableNormal">
+<w:name w:val="Normal Table"/>
+<w:semiHidden/>
+<w:unhideWhenUsed/>
+<w:qFormat/>
+<w:tblPr>
+<w:tblInd w:w="0" w:type="dxa"/>
+<w:tblCellMar>
+<w:top w:w="0" w:type="dxa"/>
+<w:left w:w="108" w:type="dxa"/>
+<w:bottom w:w="0" w:type="dxa"/>
+<w:right w:w="108" w:type="dxa"/>
+</w:tblCellMar>
+</w:tblPr>
+</w:style>
+<w:style w:type="numbering" w:default="1" w:styleId="NoList">
+<w:name w:val="No List"/>
+<w:semiHidden/>
+<w:unhideWhenUsed/>
+</w:style>
+<w:style w:type="table" w:styleId="ColorfulGrid-Accent1">
+<w:name w:val="Colorful Grid Accent 1"/>
+<w:basedOn w:val="TableNormal"/>
+<w:uiPriority w:val="73"/>
+<w:rsid w:val="008D6863"/>
+<w:pPr>
+<w:spacing w:after="0"/>
+</w:pPr>
+<w:rPr>
+<w:color w:val="000000" w:themeColor="text1"/>
+<w:sz w:val="22"/>
+<w:szCs w:val="22"/>
+</w:rPr>
+<w:tblPr>
+<w:tblStyleRowBandSize w:val="1"/>
+<w:tblStyleColBandSize w:val="1"/>
+<w:tblInd w:w="0" w:type="dxa"/>
+<w:tblBorders>
+<w:insideH w:val="single" w:sz="4" w:space="0" w:color="FFFFFF" w:themeColor="background1"/>
+</w:tblBorders>
+<w:tblCellMar>
+<w:top w:w="0" w:type="dxa"/>
+<w:left w:w="108" w:type="dxa"/>
+<w:bottom w:w="0" w:type="dxa"/>
+<w:right w:w="108" w:type="dxa"/>
+</w:tblCellMar>
+</w:tblPr>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="DBE5F1" w:themeFill="accent1" w:themeFillTint="33"/>
+</w:tcPr>
+<w:tblStylePr w:type="firstRow">
+<w:rPr>
+<w:b/>
+<w:bCs/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="lastRow">
+<w:rPr>
+<w:b/>
+<w:bCs/>
+<w:color w:val="000000" w:themeColor="text1"/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="firstCol">
+<w:rPr>
+<w:color w:val="FFFFFF" w:themeColor="background1"/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="lastCol">
+<w:rPr>
+<w:color w:val="FFFFFF" w:themeColor="background1"/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="band1Vert">
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="band1Horz">
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/>
+</w:tcPr>
+</w:tblStylePr>
+</w:style>
+<w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char">
+<w:name w:val="Heading 1 Char"/>
+<w:basedOn w:val="DefaultParagraphFont"/>
+<w:link w:val="Heading1"/>
+<w:uiPriority w:val="9"/>
+<w:rsid w:val="00E315A3"/>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/>
+<w:sz w:val="32"/>
+<w:szCs w:val="32"/>
+</w:rPr>
+</w:style>
+<w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char">
+<w:name w:val="Heading 2 Char"/>
+<w:basedOn w:val="DefaultParagraphFont"/>
+<w:link w:val="Heading2"/>
+<w:uiPriority w:val="9"/>
+<w:rsid w:val="00E315A3"/>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="4F81BD" w:themeColor="accent1"/>
+<w:sz w:val="26"/>
+<w:szCs w:val="26"/>
+</w:rPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="ListBullet">
+<w:name w:val="List Bullet"/>
+<w:basedOn w:val="Normal"/>
+<w:rsid w:val="00784D58"/>
+<w:pPr>
+<w:numPr>
+<w:numId w:val="8"/>
+</w:numPr>
+<w:contextualSpacing/>
+</w:pPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="ListNumber">
+<w:name w:val="List Number"/>
+<w:basedOn w:val="Normal"/>
+<w:rsid w:val="00784D58"/>
+<w:pPr>
+<w:numPr>
+<w:numId w:val="13"/>
+</w:numPr>
+<w:contextualSpacing/>
+</w:pPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="BodyText">
+<w:name w:val="Body Text"/>
+<w:basedOn w:val="Normal"/>
+<w:link w:val="BodyTextChar"/>
+<w:rsid w:val="00BC48D5"/>
+<w:pPr>
+<w:spacing w:after="120"/>
+</w:pPr>
+</w:style>
+<w:style w:type="character" w:customStyle="1" w:styleId="BodyTextChar">
+<w:name w:val="Body Text Char"/>
+<w:basedOn w:val="DefaultParagraphFont"/>
+<w:link w:val="BodyText"/>
+<w:rsid w:val="00BC48D5"/>
+</w:style>
+<w:style w:type="paragraph" w:styleId="Caption">
+<w:name w:val="caption"/>
+<w:basedOn w:val="Normal"/>
+<w:next w:val="Normal"/>
+<w:rsid w:val="00D61392"/>
+<w:pPr>
+<w:spacing w:after="60"/>
+</w:pPr>
+<w:rPr>
+<w:b/>
+<w:bCs/>
+<w:color w:val="4F81BD" w:themeColor="accent1"/>
+<w:sz w:val="18"/>
+<w:szCs w:val="18"/>
+</w:rPr>
+</w:style>
+<w:style w:type="paragraph" w:customStyle="1" w:styleId="Image">
+<w:name w:val="Image"/>
+<w:basedOn w:val="Normal"/>
+<w:qFormat/>
+<w:rsid w:val="00C06113"/>
+<w:pPr>
+<w:spacing w:after="0"/>
+<w:jc w:val="center"/>
+</w:pPr>
+</w:style>
+</w:styles>
\ No newline at end of file
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b2e824ce7c4439b3e0087b8c865260785c9b9c13
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:styles xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-US" w:eastAsia="en-US" w:bidi="ar-SA"/></w:rPr></w:rPrDefault><w:pPrDefault><w:pPr><w:spacing w:after="200"/></w:pPr></w:pPrDefault></w:docDefaults><w:latentStyles w:defLockedState="0" w:defUIPriority="0" w:defSemiHidden="0" w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="276"/><w:style w:type="paragraph" w:default="1" w:styleId="Normal"><w:name w:val="Normal"/><w:qFormat/><w:rsid w:val="000D33D5"/></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading1Char"/><w:uiPriority w:val="9"/><w:qFormat/><w:rsid w:val="00E315A3"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="480" w:after="0"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading2Char"/><w:uiPriority w:val="9"/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00E315A3"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="200" w:after="0"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="4F81BD" w:themeColor="accent1"/><w:sz w:val="26"/><w:szCs w:val="26"/></w:rPr></w:style><w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/><w:unhideWhenUsed/></w:style><w:style w:type="table" w:default="1" w:styleId="TableNormal"><w:name w:val="Normal Table"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="numbering" w:default="1" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/><w:unhideWhenUsed/></w:style><w:style w:type="table" w:styleId="ColorfulGrid-Accent1"><w:name w:val="Colorful Grid Accent 1"/><w:basedOn w:val="TableNormal"/><w:uiPriority w:val="73"/><w:rsid w:val="008D6863"/><w:pPr><w:spacing w:after="0"/></w:pPr><w:rPr><w:color w:val="000000" w:themeColor="text1"/><w:sz w:val="22"/><w:szCs w:val="22"/></w:rPr><w:tblPr><w:tblStyleRowBandSize w:val="1"/><w:tblStyleColBandSize w:val="1"/><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:insideH w:val="single" w:sz="4" w:space="0" w:color="FFFFFF" w:themeColor="background1"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="DBE5F1" w:themeFill="accent1" w:themeFillTint="33"/></w:tcPr><w:tblStylePr w:type="firstRow"><w:rPr><w:b/><w:bCs/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="lastRow"><w:rPr><w:b/><w:bCs/><w:color w:val="000000" w:themeColor="text1"/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="firstCol"><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="lastCol"><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="band1Vert"><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/></w:tcPr></w:tblStylePr><w:tblStylePr w:type="band1Horz"><w:tblPr/><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/></w:tcPr></w:tblStylePr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char"><w:name w:val="Heading 1 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading1"/><w:uiPriority w:val="9"/><w:rsid w:val="00E315A3"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char"><w:name w:val="Heading 2 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading2"/><w:uiPriority w:val="9"/><w:rsid w:val="00E315A3"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="4F81BD" w:themeColor="accent1"/><w:sz w:val="26"/><w:szCs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet"><w:name w:val="List Bullet"/><w:basedOn w:val="Normal"/><w:rsid w:val="00784D58"/><w:pPr><w:numPr><w:numId w:val="8"/></w:numPr><w:contextualSpacing/></w:pPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00784D58"/><w:pPr><w:numPr><w:numId w:val="13"/></w:numPr><w:contextualSpacing/></w:pPr></w:style><w:style w:type="paragraph" w:styleId="BodyText"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:link w:val="BodyTextChar"/><w:rsid w:val="00BC48D5"/><w:pPr><w:spacing w:after="120"/></w:pPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="BodyTextChar"><w:name w:val="Body Text Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyText"/><w:rsid w:val="00BC48D5"/></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00D61392"/><w:rPr><w:b/><w:bCs/><w:color w:val="4F81BD" w:themeColor="accent1"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:customStyle="1" w:styleId="Image"><w:name w:val="Image"/><w:basedOn w:val="Normal"/><w:qFormat/><w:rsid w:val="00C06113"/><w:pPr><w:spacing w:after="0"/><w:jc w:val="center"/></w:pPr></w:style></w:styles>
\ No newline at end of file
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old2.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a778aee26ef853e4111d328da1dd63b402793282
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/styles_old2.xml
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<w:styles xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
+<w:docDefaults>
+<w:rPrDefault>
+<w:rPr>
+<w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/>
+<w:sz w:val="24"/>
+<w:szCs w:val="24"/>
+<w:lang w:val="en-US" w:eastAsia="en-US" w:bidi="ar-SA"/>
+</w:rPr>
+</w:rPrDefault>
+<w:pPrDefault>
+<w:pPr>
+<w:spacing w:after="200"/>
+</w:pPr>
+</w:pPrDefault>
+</w:docDefaults>
+<w:latentStyles w:defLockedState="0" w:defUIPriority="0" w:defSemiHidden="0" w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="276"/>
+<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
+<w:name w:val="Normal"/>
+<w:qFormat/>
+<w:rsid w:val="000D33D5"/>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+</w:style>
+<w:style w:type="paragraph" w:styleId="Heading1">
+<w:name w:val="heading 1"/>
+<w:basedOn w:val="Normal"/>
+<w:next w:val="Normal"/>
+<w:link w:val="Heading1Char"/>
+<w:uiPriority w:val="9"/>
+<w:qFormat/>
+<w:rsid w:val="00E315A3"/>
+<w:pPr>
+<w:keepNext/>
+<w:keepLines/>
+<w:spacing w:before="480" w:after="0"/>
+<w:outlineLvl w:val="0"/>
+</w:pPr>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/>
+<w:sz w:val="32"/>
+<w:szCs w:val="32"/>
+</w:rPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="Heading2">
+<w:name w:val="heading 2"/>
+<w:basedOn w:val="Normal"/>
+<w:next w:val="Normal"/>
+<w:link w:val="Heading2Char"/>
+<w:uiPriority w:val="9"/>
+<w:unhideWhenUsed/>
+<w:qFormat/>
+<w:rsid w:val="00E315A3"/>
+<w:pPr>
+<w:keepNext/>
+<w:keepLines/>
+<w:spacing w:before="200" w:after="0"/>
+<w:outlineLvl w:val="1"/>
+</w:pPr>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="4F81BD" w:themeColor="accent1"/>
+<w:sz w:val="26"/>
+<w:szCs w:val="26"/>
+</w:rPr>
+</w:style>
+<w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont">
+<w:name w:val="Default Paragraph Font"/>
+<w:semiHidden/>
+<w:unhideWhenUsed/>
+</w:style>
+<w:style w:type="table" w:default="1" w:styleId="TableNormal">
+<w:name w:val="Normal Table"/>
+<w:semiHidden/>
+<w:unhideWhenUsed/>
+<w:qFormat/>
+<w:tblPr>
+<w:tblInd w:w="0" w:type="dxa"/>
+<w:tblCellMar>
+<w:top w:w="0" w:type="dxa"/>
+<w:left w:w="108" w:type="dxa"/>
+<w:bottom w:w="0" w:type="dxa"/>
+<w:right w:w="108" w:type="dxa"/>
+</w:tblCellMar>
+</w:tblPr>
+</w:style>
+<w:style w:type="numbering" w:default="1" w:styleId="NoList">
+<w:name w:val="No List"/>
+<w:semiHidden/>
+<w:unhideWhenUsed/>
+</w:style>
+<w:style w:type="table" w:styleId="ColorfulGrid-Accent1">
+<w:name w:val="Colorful Grid Accent 1"/>
+<w:basedOn w:val="TableNormal"/>
+<w:uiPriority w:val="73"/>
+<w:rsid w:val="008D6863"/>
+<w:pPr>
+<w:spacing w:after="0"/>
+</w:pPr>
+<w:rPr>
+<w:color w:val="000000" w:themeColor="text1"/>
+<w:sz w:val="22"/>
+<w:szCs w:val="22"/>
+</w:rPr>
+<w:tblPr>
+<w:tblStyleRowBandSize w:val="1"/>
+<w:tblStyleColBandSize w:val="1"/>
+<w:tblInd w:w="0" w:type="dxa"/>
+<w:tblBorders>
+<w:insideH w:val="single" w:sz="4" w:space="0" w:color="FFFFFF" w:themeColor="background1"/>
+</w:tblBorders>
+<w:tblCellMar>
+<w:top w:w="0" w:type="dxa"/>
+<w:left w:w="108" w:type="dxa"/>
+<w:bottom w:w="0" w:type="dxa"/>
+<w:right w:w="108" w:type="dxa"/>
+</w:tblCellMar>
+</w:tblPr>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="DBE5F1" w:themeFill="accent1" w:themeFillTint="33"/>
+</w:tcPr>
+<w:tblStylePr w:type="firstRow">
+<w:rPr>
+<w:b/>
+<w:bCs/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="lastRow">
+<w:rPr>
+<w:b/>
+<w:bCs/>
+<w:color w:val="000000" w:themeColor="text1"/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="B8CCE4" w:themeFill="accent1" w:themeFillTint="66"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="firstCol">
+<w:rPr>
+<w:color w:val="FFFFFF" w:themeColor="background1"/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="lastCol">
+<w:rPr>
+<w:color w:val="FFFFFF" w:themeColor="background1"/>
+</w:rPr>
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="365F91" w:themeFill="accent1" w:themeFillShade="BF"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="band1Vert">
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/>
+</w:tcPr>
+</w:tblStylePr>
+<w:tblStylePr w:type="band1Horz">
+<w:tblPr/>
+<w:tcPr>
+<w:shd w:val="clear" w:color="auto" w:fill="A7BFDE" w:themeFill="accent1" w:themeFillTint="7F"/>
+</w:tcPr>
+</w:tblStylePr>
+</w:style>
+<w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char">
+<w:name w:val="Heading 1 Char"/>
+<w:basedOn w:val="DefaultParagraphFont"/>
+<w:link w:val="Heading1"/>
+<w:uiPriority w:val="9"/>
+<w:rsid w:val="00E315A3"/>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5"/>
+<w:sz w:val="32"/>
+<w:szCs w:val="32"/>
+</w:rPr>
+</w:style>
+<w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char">
+<w:name w:val="Heading 2 Char"/>
+<w:basedOn w:val="DefaultParagraphFont"/>
+<w:link w:val="Heading2"/>
+<w:uiPriority w:val="9"/>
+<w:rsid w:val="00E315A3"/>
+<w:rPr>
+<w:rFonts w:ascii="Tahoma" w:hAnsi="Tahoma" w:cs="Tahoma"/>
+<w:b/>
+<w:bCs/>
+<w:color w:val="4F81BD" w:themeColor="accent1"/>
+<w:sz w:val="26"/>
+<w:szCs w:val="26"/>
+</w:rPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="ListBullet">
+<w:name w:val="List Bullet"/>
+<w:basedOn w:val="Normal"/>
+<w:rsid w:val="00784D58"/>
+<w:pPr>
+<w:numPr>
+<w:numId w:val="8"/>
+</w:numPr>
+<w:contextualSpacing/>
+</w:pPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="ListNumber">
+<w:name w:val="List Number"/>
+<w:basedOn w:val="Normal"/>
+<w:rsid w:val="00784D58"/>
+<w:pPr>
+<w:numPr>
+<w:numId w:val="13"/>
+</w:numPr>
+<w:contextualSpacing/>
+</w:pPr>
+</w:style>
+<w:style w:type="paragraph" w:styleId="BodyText">
+<w:name w:val="Body Text"/>
+<w:basedOn w:val="Normal"/>
+<w:link w:val="BodyTextChar"/>
+<w:rsid w:val="00BC48D5"/>
+<w:pPr>
+<w:spacing w:after="120"/>
+</w:pPr>
+</w:style>
+<w:style w:type="character" w:customStyle="1" w:styleId="BodyTextChar">
+<w:name w:val="Body Text Char"/>
+<w:basedOn w:val="DefaultParagraphFont"/>
+<w:link w:val="BodyText"/>
+<w:rsid w:val="00BC48D5"/>
+</w:style>
+<w:style w:type="paragraph" w:styleId="Caption">
+<w:name w:val="caption"/>
+<w:basedOn w:val="Normal"/>
+<w:next w:val="Normal"/>
+<w:rsid w:val="00D61392"/>
+<w:pPr>
+<w:spacing w:after="60"/>
+</w:pPr>
+<w:rPr>
+<w:b/>
+<w:bCs/>
+<w:color w:val="4F81BD" w:themeColor="accent1"/>
+<w:sz w:val="18"/>
+<w:szCs w:val="18"/>
+</w:rPr>
+</w:style>
+<w:style w:type="paragraph" w:customStyle="1" w:styleId="Image">
+<w:name w:val="Image"/>
+<w:basedOn w:val="Normal"/>
+<w:qFormat/>
+<w:rsid w:val="00C06113"/>
+<w:pPr>
+<w:spacing w:after="0"/>
+<w:jc w:val="center"/>
+</w:pPr>
+</w:style>
+</w:styles>
\ No newline at end of file
diff --git a/wetb/utils/report_generator/docx_document/docx-template_clean/word/theme/theme1.xml b/wetb/utils/report_generator/docx_document/docx-template_clean/word/theme/theme1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de62be957503a542a3da002a5cb1502c0058449b
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx-template_clean/word/theme/theme1.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS ゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Angsana New"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS 明朝"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Cordia New"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>
\ No newline at end of file
diff --git a/wetb/utils/report_generator/docx_document/docx.py b/wetb/utils/report_generator/docx_document/docx.py
new file mode 100644
index 0000000000000000000000000000000000000000..721b1df1bf470bf980235a3162bcc6d7e991bf8b
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx.py
@@ -0,0 +1,1194 @@
+#!/usr/bin/env python2.6
+# -*- coding: utf-8 -*-
+"""
+Open and modify Microsoft Word 2007 docx files (called 'OpenXML' and
+'Office OpenXML' by Microsoft)
+
+Part of Python's docx module - http://github.com/mikemaccana/python-docx
+See LICENSE for licensing information.
+"""
+
+import os
+import re
+import time
+import shutil
+import zipfile
+
+from lxml import etree
+from os.path import abspath, basename, join
+
+from PIL import Image
+from mmpe.io import make_dirs
+
+try:
+    from PIL.ExifTags import TAGS
+    from PIL import WmfImagePlugin, PdfImagePlugin, PngImagePlugin, JpegImagePlugin, EpsImagePlugin
+except ImportError:
+    TAGS = {}
+
+#from exceptions import PendingDeprecationWarning
+from warnings import warn
+
+import logging
+pp = lambda t : etree.tostring(t, pretty_print=True)
+
+log = logging.getLogger(__name__)
+
+# Record template directory's location which is just 'template' for a docx
+# developer or 'site-packages/docx-template' if you have installed docx
+template_dir = join(os.path.dirname(__file__.replace("library.zip", '')), 'docx-template')  # installed
+if not os.path.isdir(template_dir):
+    template_dir = join(os.path.dirname(__file__.replace("library.zip", '')), 'template')  # dev
+
+# All Word prefixes / namespace matches used in document.xml & core.xml.
+# LXML doesn't actually use prefixes (just the real namespace) , but these
+# make it easier to copy Word output more easily.
+nsprefixes = {
+    'mo': 'http://schemas.microsoft.com/office/mac/office/2008/main',
+    'o':  'urn:schemas-microsoft-com:office:office',
+    've': 'http://schemas.openxmlformats.org/markup-compatibility/2006',
+    # Text Content
+    'w':   'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
+    'w10': 'urn:schemas-microsoft-com:office:word',
+    'wne': 'http://schemas.microsoft.com/office/word/2006/wordml',
+    'xml': 'xml',
+    # Drawing
+    'a':   'http://schemas.openxmlformats.org/drawingml/2006/main',
+    'm':   'http://schemas.openxmlformats.org/officeDocument/2006/math',
+    'mv':  'urn:schemas-microsoft-com:mac:vml',
+    'pic': 'http://schemas.openxmlformats.org/drawingml/2006/picture',
+    'v':   'urn:schemas-microsoft-com:vml',
+    'wp':  ('http://schemas.openxmlformats.org/drawingml/2006/wordprocessing'
+            'Drawing'),
+    # Properties (core and extended)
+    'cp':  ('http://schemas.openxmlformats.org/package/2006/metadata/core-pr'
+            'operties'),
+    'dc':  'http://purl.org/dc/elements/1.1/',
+    'ep':  ('http://schemas.openxmlformats.org/officeDocument/2006/extended-'
+            'properties'),
+    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+    # Content Types
+    'ct':  'http://schemas.openxmlformats.org/package/2006/content-types',
+    # Package Relationships
+    'r':  ('http://schemas.openxmlformats.org/officeDocument/2006/relationsh'
+           'ips'),
+    'pr':  'http://schemas.openxmlformats.org/package/2006/relationships',
+    # Dublin Core document properties
+    'dcmitype': 'http://purl.org/dc/dcmitype/',
+    'dcterms':  'http://purl.org/dc/terms/'}
+
+
+def opendocx(file):
+    '''Open a docx file, return a document XML tree'''
+    mydoc = zipfile.ZipFile(file)
+    xmlcontent = mydoc.read('word/document.xml')
+    document = etree.fromstring(xmlcontent)
+    return document
+
+
+def newdocument(page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}):
+    document = makeelement('document')
+    body = makeelement('body')
+    document.append(body)
+    #sectPr = makeelement('sectPr')
+    #pgMar = makeelement('pgMar', attributes={k:str(v * 566.89) for (k, v) in page_margins.items()})
+
+    #sectPr.append(pgMar)
+    #body.append(sectPr)
+    body.append(section_layout(portrait=True))
+    return document
+
+def section_layout(page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, portrait=True):
+    sectPr = makeelement('sectPr')
+    if portrait:
+        pgsz = makeelement('pgSz', attributes={'w':"12240", 'h':"15840"})
+    else:
+        pgsz = makeelement('pgSz', attributes={'w':"15840", 'h':"12240", 'orient':"landscape"})
+    sectPr.append(pgsz)
+    pgMar = makeelement('pgMar', attributes={k:str(v * 566.89) for (k, v) in page_margins.items()})
+    sectPr.append(pgMar)
+    return sectPr
+
+
+def makeelement(tagname, tagtext=None, nsprefix='w', attributes=None,
+                attrnsprefix=None):
+    '''Create an element & return it'''
+    # Deal with list of nsprefix by making namespacemap
+    namespacemap = None
+    if isinstance(nsprefix, list):
+        namespacemap = {}
+        for prefix in nsprefix:
+            namespacemap[prefix] = nsprefixes[prefix]
+        # FIXME: rest of code below expects a single prefix
+        nsprefix = nsprefix[0]
+    if nsprefix:
+        namespace = '{' + nsprefixes[nsprefix] + '}'
+    else:
+        # For when namespace = None
+        namespace = ''
+    newelement = etree.Element(namespace + tagname, nsmap=namespacemap)
+    # Add attributes with namespaces
+    if attributes:
+        # If they haven't bothered setting attribute namespace, use an empty
+        # string (equivalent of no namespace)
+        if not attrnsprefix:
+            # Quick hack: it seems every element that has a 'w' nsprefix for
+            # its tag uses the same prefix for it's attributes
+            if nsprefix == 'w':
+                attributenamespace = namespace
+            else:
+                attributenamespace = ''
+        else:
+            attributenamespace = '{' + nsprefixes[attrnsprefix] + '}'
+
+        for tagattribute in attributes:
+            newelement.set(attributenamespace + tagattribute,
+                           attributes[tagattribute])
+    if tagtext:
+        newelement.text = tagtext
+    return newelement
+
+
+def pagebreak(type='page', page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, portrait=True):
+    '''Insert a break, default 'page'.
+    See http://openxmldeveloper.org/forums/thread/4075.aspx
+    Return our page break element.'''
+    # Need to enumerate different types of page breaks.
+    validtypes = ['page', 'section']
+    if type not in validtypes:
+        tmpl = 'Page break style "%s" not implemented. Valid styles: %s.'
+        raise ValueError(tmpl % (type, validtypes))
+    pagebreak = makeelement('p')
+    if type == 'page':
+        run = makeelement('r')
+        br = makeelement('br', attributes={'type': type})
+        run.append(br)
+        pagebreak.append(run)
+    elif type == 'section':
+        pPr = makeelement('pPr')
+#        sectPr = makeelement('sectPr')
+#        if orient == 'portrait':
+#            pgSz = makeelement('pgSz', attributes={'w': '12240', 'h': '15840'})
+#        elif orient == 'landscape':
+#            pgSz = makeelement('pgSz', attributes={'h': '12240', 'w': '15840',
+#                                                   'orient': 'landscape'})
+#        sectPr.append(pgSz)
+        sectPr = section_layout(page_margins, portrait)
+        pPr.append(sectPr)
+        pagebreak.append(pPr)
+    return pagebreak
+
+
+def paragraph(paratext, style='BodyText', breakbefore=False, jc='left', spacing={'before':0, 'after':6}, font_size=10):
+    """
+    Return a new paragraph element containing *paratext*. The paragraph's
+    default style is 'Body Text', but a new style may be set using the
+    *style* parameter.
+
+    @param string jc: Paragraph alignment, possible values:
+                      left, center, right, both (justified), ...
+                      see http://www.schemacentral.com/sc/ooxml/t-w_ST_Jc.html
+                      for a full list
+
+    If *paratext* is a list, add a run for each (text, char_format_str)
+    2-tuple in the list. char_format_str is a string containing one or more
+    of the characters 'b', 'i', or 'u', meaning bold, italic, and underline
+    respectively. For example:
+
+        paratext = [
+            ('some bold text', 'b'),
+            ('some normal text', ''),
+            ('some italic underlined text', 'iu')
+        ]
+    """
+    # Make our elements
+    paragraph = makeelement('p')
+
+    if not isinstance(paratext, list):
+        paratext = [(paratext, '')]
+    text_tuples = []
+    for pt in paratext:
+        text, char_styles_str = (pt if isinstance(pt, (list, tuple))
+                                 else (pt, ''))
+        text_elm = makeelement('t', tagtext=text)
+        if len(text.strip()) < len(text):
+            text_elm.set('{http://www.w3.org/XML/1998/namespace}space',
+                         'preserve')
+        text_tuples.append([text_elm, char_styles_str])
+    pPr = makeelement('pPr')
+    pStyle = makeelement('pStyle', attributes={'val': style})
+    pJc = makeelement('jc', attributes={'val': jc})
+    pPr.append(pStyle)
+    pPr.append(pJc)
+
+    spacing = makeelement('spacing', attributes={'before':str(spacing.get('before') * 20), 'after':str(spacing.get('after') * 20)})
+    pPr.append(spacing)
+
+
+
+
+    # Add the text to the run, and the run to the paragraph
+    paragraph.append(pPr)
+    for text_elm, char_styles_str in text_tuples:
+        run = makeelement('r')
+        rPr = makeelement('rPr')
+        sz = makeelement('sz', attributes={'val':str(font_size * 2)})
+        rPr.append(sz)
+        # Apply styles
+        if 'b' in char_styles_str:
+            b = makeelement('b')
+            rPr.append(b)
+        if 'i' in char_styles_str:
+            i = makeelement('i')
+            rPr.append(i)
+        if 'u' in char_styles_str:
+            u = makeelement('u', attributes={'val': 'single'})
+            rPr.append(u)
+        run.append(rPr)
+        # Insert lastRenderedPageBreak for assistive technologies like
+        # document narrators to know when a page break occurred.
+        if breakbefore:
+            lastRenderedPageBreak = makeelement('lastRenderedPageBreak')
+            run.append(lastRenderedPageBreak)
+        run.append(text_elm)
+        paragraph.append(run)
+    # Return the combined paragraph
+    return paragraph
+
+
+def contenttypes():
+    types = etree.fromstring(
+        '<Types xmlns="http://schemas.openxmlformats.org/package/2006/conten'
+        't-types"></Types>')
+    parts = {
+        '/word/theme/theme1.xml': 'application/vnd.openxmlformats-officedocu'
+                                  'ment.theme+xml',
+        '/word/fontTable.xml':    'application/vnd.openxmlformats-officedocu'
+                                  'ment.wordprocessingml.fontTable+xml',
+        '/docProps/core.xml':     'application/vnd.openxmlformats-package.co'
+                                  're-properties+xml',
+        '/docProps/app.xml':      'application/vnd.openxmlformats-officedocu'
+                                  'ment.extended-properties+xml',
+        '/word/document.xml':     'application/vnd.openxmlformats-officedocu'
+                                  'ment.wordprocessingml.document.main+xml',
+        '/word/settings.xml':     'application/vnd.openxmlformats-officedocu'
+                                  'ment.wordprocessingml.settings+xml',
+        '/word/numbering.xml':    'application/vnd.openxmlformats-officedocu'
+                                  'ment.wordprocessingml.numbering+xml',
+        '/word/styles.xml':       'application/vnd.openxmlformats-officedocu'
+                                  'ment.wordprocessingml.styles+xml',
+        '/word/webSettings.xml':  'application/vnd.openxmlformats-officedocu'
+                                  'ment.wordprocessingml.webSettings+xml'}
+    for part in parts:
+        types.append(makeelement('Override', nsprefix=None,
+                                 attributes={'PartName': part,
+                                             'ContentType': parts[part]}))
+    # Add support for filetypes
+    filetypes = {
+        'gif':  'image/gif',
+        'jpeg': 'image/jpeg',
+        'jpg':  'image/jpeg',
+        'png':  'image/png',
+        'emf':  'image/x-emf',
+        'rels': 'application/vnd.openxmlformats-package.relationships+xml',
+        'xml':  'application/xml'
+    }
+    for extension in filetypes:
+        attrs = {
+            'Extension':   extension,
+            'ContentType': filetypes[extension]
+        }
+        default_elm = makeelement('Default', nsprefix=None, attributes=attrs)
+        types.append(default_elm)
+    return types
+
+
+def heading(headingtext, headinglevel, lang='en'):
+    '''Make a new heading, return the heading element'''
+    lmap = {'en': 'Heading', 'it': 'Titolo'}
+    # Make our elements
+    paragraph = makeelement('p')
+    pr = makeelement('pPr')
+    pStyle = makeelement(
+        'pStyle', attributes={'val': lmap[lang] + str(headinglevel)})
+    run = makeelement('r')
+    text = makeelement('t', tagtext=headingtext)
+    # Add the text the run, and the run to the paragraph
+    pr.append(pStyle)
+    run.append(text)
+    paragraph.append(pr)
+    paragraph.append(run)
+    # Return the combined paragraph
+    return paragraph
+
+
+def table(contents, heading=True, colw=None, cwunit='dxa', tblw=0, tblmargin=.19,
+          twunit='auto', borders={"all":{"color":'auto', 'val':'single', 'sz':'4'}}, column_style={}):
+    """
+    Return a table element based on specified parameters
+
+    @param list contents: A list of lists describing contents. Every item in
+                          the list can be a string or a valid XML element
+                          itself. It can also be a list. In that case all the
+                          listed elements will be merged into the cell.
+    @param bool heading:  Tells whether first line should be treated as
+                          heading or not
+    @param list colw:     list of integer column widths specified in wunitS.
+    @param str  cwunit:   Unit used for column width:
+                            'pct'  : fiftieths of a percent
+                            'dxa'  : twentieths of a point
+                            'nil'  : no width
+                            'auto' : automagically determined
+    @param int  tblw:     Table width
+    @param str  twunit:   Unit used for table width. Same possible values as
+                          cwunit.
+    @param dict borders:  Dictionary defining table border. Supported keys
+                          are: 'top', 'left', 'bottom', 'right',
+                          'insideH', 'insideV', 'all'.
+                          When specified, the 'all' key has precedence over
+                          others. Each key must define a dict of border
+                          attributes:
+                            color : The color of the border, in hex or
+                                    'auto'
+                            space : The space, measured in points
+                            sz    : The size of the border, in eighths of
+                                    a point
+                            val   : The style of the border, see
+                http://www.schemacentral.com/sc/ooxml/t-w_ST_Border.htm
+    @param list column_style: Specify the style for each colum, list of dicts.
+                          supported keys:
+                          'align' : specify the alignment, see paragraph
+                                    documentation.
+    @return lxml.etree:   Generated XML etree element
+    """
+    table = makeelement('tbl')
+    columns = len(contents[0])
+    # Table properties
+    tableprops = makeelement('tblPr')
+    tablestyle = makeelement('tblStyle', attributes={'val': ''})
+    tableprops.append(tablestyle)
+    tableprops.append(makeelement('jc', attributes={'val':'center'}))
+    tablewidth = makeelement(
+        'tblW', attributes={'w': str(tblw), 'type': str(twunit)})
+    tableprops.append(tablewidth)
+    tablemargin = makeelement('tblCellMar')
+    if isinstance(tblmargin, (int, float)):
+        tblmargin = {l:tblmargin for l in ['top', 'left', 'bottom', 'right']}
+    for l in ['top', 'left', 'bottom', 'right']:
+        margin = makeelement(l, attributes={'w':str(tblmargin.get(l, 0) * 568), 'tppe':str(twunit)})
+        tablemargin.append(margin)
+    tableprops.append(tablemargin)
+    if len(borders.keys()):
+        tableborders = makeelement('tblBorders')
+        for b in ['top', 'left', 'bottom', 'right', 'insideH', 'insideV']:
+            if b in borders.keys() or 'all' in borders.keys():
+                k = 'all' if 'all' in borders.keys() else b
+                attrs = {}
+                for a in borders[k].keys():
+                    attrs[a] = str(borders[k][a])
+                borderelem = makeelement(b, attributes=attrs)
+                tableborders.append(borderelem)
+        tableprops.append(tableborders)
+    tablelook = makeelement('tblLook', attributes={'val': '0400'})
+    tableprops.append(tablelook)
+    table.append(tableprops)
+    # Table Grid
+    tablegrid = makeelement('tblGrid')
+    for i in range(columns):
+        attrs = {'w': str(colw[i]) if colw else '2390'}
+        tablegrid.append(makeelement('gridCol', attributes=attrs))
+    table.append(tablegrid)
+    # Heading Row
+    row = makeelement('tr')
+    rowprops = makeelement('trPr')
+    cnfStyle = makeelement('cnfStyle', attributes={'val': '000000100000'})
+    rowprops.append(cnfStyle)
+    row.append(rowprops)
+    if heading:
+        i = 0
+        for heading in contents[0]:
+            cell = makeelement('tc')
+            # Cell properties
+            cellprops = makeelement('tcPr')
+            if colw:
+                wattr = {'w': str(colw[i]), 'type': cwunit}
+            else:
+                wattr = {'w': '0', 'type': 'auto'}
+            cellwidth = makeelement('tcW', attributes=wattr)
+            cellstyle = makeelement('shd', attributes={'val': 'clear',
+                                                       'color': 'auto',
+                                                       'fill': 'FFFFFF',
+                                                       'themeFill': 'text2',
+                                                       'themeFillTint': '99'})
+            cellprops.append(cellwidth)
+            cellprops.append(cellstyle)
+            cell.append(cellprops)
+            # Paragraph (Content)
+            if not isinstance(heading, (list, tuple)):
+                heading = [heading]
+            for h in heading:
+                if isinstance(h, etree._Element):
+                    cell.append(h)
+                else:
+                    c_style = column_style.get(i, column_style.get('all', {}))
+                    cell.append(paragraph(h,
+                                          jc=c_style.get('align', 'left'),
+                                          spacing=c_style.get('spacing', {'before':0, 'after':0}),
+                                          font_size=c_style.get('font_size', 10)))
+            row.append(cell)
+            i += 1
+        table.append(row)
+    # Contents Rows
+    for contentrow in contents[1 if heading else 0:]:
+        row = makeelement('tr')
+        i = 0
+        for content in contentrow:
+            cell = makeelement('tc')
+            # Properties
+            cellprops = makeelement('tcPr')
+            if colw:
+                wattr = {'w': str(colw[i]), 'type': cwunit}
+            else:
+                wattr = {'w': '0', 'type': 'auto'}
+            cellwidth = makeelement('tcW', attributes=wattr)
+            cellprops.append(cellwidth)
+            cell.append(cellprops)
+            # Paragraph (Content)
+            if not isinstance(content, (list, tuple)):
+                content = [content]
+            for c in content:
+                if isinstance(c, etree._Element):
+                    cell.append(c)
+                else:
+                    c_style = column_style.get(i, column_style.get('all', {}))
+                    cell.append(paragraph(c,
+                                          jc=c_style.get('align', 'left'),
+                                          spacing=c_style.get('spacing', {'before':0, 'after':0}),
+                                          font_size=c_style.get('font_size', 10)))
+            #if "<ns0:p>" not in etree.tostring(cell):
+            #    cell.append(paragraph(""))
+            row.append(cell)
+            i += 1
+        table.append(row)
+    return table
+
+
+def picture(
+        relationshiplist, picname, picdescription, pixelwidth=None,
+        pixelheight=None, nochangeaspect=True, nochangearrowheads=True,
+        imagefiledict=None):
+    """
+    Take a relationshiplist, picture file name, and return a paragraph
+    containing the image and an updated relationshiplist
+    """
+#    if imagefiledict is None:
+#        warn(
+#            'Using picture() without imagefiledict parameter will be depreca'
+#            'ted in the future.', PendingDeprecationWarning
+#        )
+
+    # http://openxmldeveloper.org/articles/462.aspx
+    # Create an image. Size may be specified, otherwise it will based on the
+    # pixel size of image. Return a paragraph containing the picture
+
+    # Set relationship ID to that of the image or the first available one
+    picid = '2'
+    picpath = abspath(picname)
+
+    if imagefiledict is not None:
+        # Keep track of the image files in a separate dictionary so they don't
+        # need to be copied into the template directory
+        if picpath not in imagefiledict:
+            picrelid = 'rId' + str(len(relationshiplist) + 1)
+            imagefiledict[picpath] = picrelid
+
+            relationshiplist.append([
+                'http://schemas.openxmlformats.org/officeDocument/2006/relat'
+                'ionships/image',
+                'media/%s_%s' % (picrelid, basename(picpath))
+            ])
+        else:
+            picrelid = imagefiledict[picpath]
+    else:
+        # Copy files into template directory for backwards compatibility
+        # Images still accumulate in the template directory this way
+        picrelid = 'rId' + str(len(relationshiplist) + 1)
+
+        media_dir = join(template_dir, 'word', 'media/')
+        if not os.path.isdir(media_dir):
+            make_dirs(media_dir)
+
+        name, ext = os.path.splitext(picname)
+        unique_picname = name + str(len(os.listdir(media_dir))) + ext
+
+
+        relationshiplist.append([
+            'http://schemas.openxmlformats.org/officeDocument/2006/relations'
+            'hips/image', 'media/' + os.path.basename(unique_picname)
+        ])
+
+
+
+        shutil.copyfile(picname, join(media_dir, os.path.basename(unique_picname)))
+    with open(picname, 'rb') as f:
+        image = Image.open(f)
+
+        # Extract EXIF data, if available
+        imageExif = {}
+        try:
+            exif = image._getexif()
+        except:
+            exif = {}
+
+                # Check if the user has specified a size
+        if not pixelwidth or not pixelheight:
+            # If not, get info from the picture itself
+            pixelwidth, pixelheight = image.size[0:2]
+
+    for tag, value in exif.items():
+        imageExif[TAGS.get(tag, tag)] = value
+
+    imageOrientation = imageExif.get('Orientation', 1)
+    imageAngle = {
+        1: 0, 2: 0, 3: 180, 4: 0, 5: 90, 6: 90, 7: 270, 8: 270
+    }[imageOrientation]
+    imageFlipH = 'true' if imageOrientation in (2, 5, 7) else 'false'
+    imageFlipV = 'true' if imageOrientation == 4 else 'false'
+
+
+
+    # Swap width and height if necessary
+    if imageOrientation in (5, 6, 7, 8):
+        pixelwidth, pixelheight = pixelheight, pixelwidth
+
+    # OpenXML measures on-screen objects in English Metric Units
+    # 1cm = 36000 EMUs
+    emuperpixel = 12700
+    width = str(int(pixelwidth * emuperpixel))
+    height = str(int(pixelheight * emuperpixel))
+
+    # There are 3 main elements inside a picture
+    # 1. The Blipfill - specifies how the image fills the picture area
+    #    (stretch, tile, etc.)
+    blipfill = makeelement('blipFill', nsprefix='pic')
+    blipfill.append(makeelement('blip', nsprefix='a', attrnsprefix='r',
+                    attributes={'embed': picrelid}))
+    stretch = makeelement('stretch', nsprefix='a')
+    stretch.append(makeelement('fillRect', nsprefix='a'))
+    blipfill.append(makeelement('srcRect', nsprefix='a'))
+    blipfill.append(stretch)
+
+    # 2. The non visual picture properties
+    nvpicpr = makeelement('nvPicPr', nsprefix='pic')
+    cnvpr = makeelement(
+        'cNvPr', nsprefix='pic',
+        attributes={'id': '0', 'name': 'Picture 1', 'descr': picdescription}
+    )
+    nvpicpr.append(cnvpr)
+    cnvpicpr = makeelement('cNvPicPr', nsprefix='pic')
+    cnvpicpr.append(makeelement(
+        'picLocks', nsprefix='a',
+        attributes={'noChangeAspect': str(int(nochangeaspect)),
+                    'noChangeArrowheads': str(int(nochangearrowheads))}))
+    nvpicpr.append(cnvpicpr)
+
+    # 3. The Shape properties
+    sppr = makeelement('spPr', nsprefix='pic', attributes={'bwMode': 'auto'})
+    xfrm = makeelement(
+        'xfrm', nsprefix='a', attributes={
+            'rot': str(imageAngle * 60000), 'flipH': imageFlipH,
+            'flipV': imageFlipV
+        }
+    )
+    xfrm.append(
+        makeelement('off', nsprefix='a', attributes={'x': '0', 'y': '0'})
+    )
+    xfrm.append(
+        makeelement(
+            'ext', nsprefix='a', attributes={'cx': width, 'cy': height}
+        )
+    )
+    prstgeom = makeelement(
+        'prstGeom', nsprefix='a', attributes={'prst': 'rect'}
+    )
+    prstgeom.append(makeelement('avLst', nsprefix='a'))
+    sppr.append(xfrm)
+    sppr.append(prstgeom)
+
+    # Add our 3 parts to the picture element
+    pic = makeelement('pic', nsprefix='pic')
+    pic.append(nvpicpr)
+    pic.append(blipfill)
+    pic.append(sppr)
+
+    # Now make the supporting elements
+    # The following sequence is just: make element, then add its children
+    graphicdata = makeelement(
+        'graphicData', nsprefix='a',
+        attributes={'uri': ('http://schemas.openxmlformats.org/drawingml/200'
+                            '6/picture')})
+    graphicdata.append(pic)
+    graphic = makeelement('graphic', nsprefix='a')
+    graphic.append(graphicdata)
+
+    framelocks = makeelement('graphicFrameLocks', nsprefix='a',
+                             attributes={'noChangeAspect': '1'})
+    framepr = makeelement('cNvGraphicFramePr', nsprefix='wp')
+    framepr.append(framelocks)
+    docpr = makeelement('docPr', nsprefix='wp',
+                        attributes={'id': picid, 'name': 'Picture 1',
+                                    'descr': picdescription})
+    effectextent = makeelement('effectExtent', nsprefix='wp',
+                               attributes={'l': '25400', 't': '0', 'r': '0',
+                                           'b': '0'})
+    extent = makeelement('extent', nsprefix='wp',
+                         attributes={'cx': width, 'cy': height})
+    inline = makeelement('inline', attributes={'distT': "0", 'distB': "0",
+                                               'distL': "0", 'distR': "0"},
+                         nsprefix='wp')
+    inline.append(extent)
+    inline.append(effectextent)
+    inline.append(docpr)
+    inline.append(framepr)
+    inline.append(graphic)
+    drawing = makeelement('drawing')
+    drawing.append(inline)
+    run = makeelement('r')
+    run.append(drawing)
+    paragraph = makeelement('p')
+    pPr = makeelement('pPr')
+    pstyle = makeelement('pStyle', attributes={'val':'Image'})
+    pPr.append(pstyle)
+    pJc = makeelement('jc', attributes={'val': 'center'})
+    pPr.append(pJc)
+    paragraph.append(pPr)
+    paragraph.append(run)
+
+
+    if imagefiledict is not None:
+        return relationshiplist, paragraph, imagefiledict
+    else:
+        return relationshiplist, paragraph
+
+def caption(tag, caption_text):
+
+    paragraph = makeelement('p')
+    pPr = makeelement('pPr')
+    pstyle = makeelement('pStyle', attributes={'val':'Caption'})
+    pPr.append(pstyle)
+
+
+    pJc = makeelement('jc', attributes={'val': 'center'})
+    pPr.append(pJc)
+    paragraph.append(pPr)
+
+    run = makeelement('r')
+    t = makeelement('t', attributes={'space':"preserve"}, tagtext=tag + " ")
+    run.append(t)
+    paragraph.append(run)
+    fldSimple = makeelement('fldSimple', attributes={"instr":" SEQ %s \* ARABIC " % tag})
+    run = makeelement('r')
+    rPr = makeelement('rPr')
+    noProof = makeelement('noProof')
+    rPr.append(noProof)
+    run.append(rPr)
+    t = makeelement('t', tagtext='1')
+    run.append(t)
+    fldSimple.append(run)
+    paragraph.append(fldSimple)
+    run = makeelement('r')
+    t = makeelement('t', attributes={'space':"preserve"}, tagtext=" - " + caption_text)
+    run.append(t)
+    paragraph.append(run)
+    paragraph.append(makeelement('bookmarkStart', attributes={'id':'0', 'name':'_GoBack'}))
+    paragraph.append(makeelement('bookmarkEnd', attributes={'id':'0'}))
+
+    return paragraph
+
+def search(document, search):
+    '''Search a document for a regex, return success / fail result'''
+    result = False
+    searchre = re.compile(search)
+    for element in document.iter():
+        if element.tag == '{%s}t' % nsprefixes['w']:  # t (text) elements
+            if element.text:
+                if searchre.search(element.text):
+                    result = True
+    return result
+
+
+def replace(document, search, replace):
+    """
+    Replace all occurences of string with a different string, return updated
+    document
+    """
+    newdocument = document
+    searchre = re.compile(search)
+    for element in newdocument.iter():
+        if element.tag == '{%s}t' % nsprefixes['w']:  # t (text) elements
+            if element.text:
+                if searchre.search(element.text):
+                    element.text = re.sub(search, replace, element.text)
+    return newdocument
+
+
+def clean(document):
+    """ Perform misc cleaning operations on documents.
+        Returns cleaned document.
+    """
+
+    newdocument = document
+
+    # Clean empty text and r tags
+    for t in ('t', 'r'):
+        rmlist = []
+        for element in newdocument.iter():
+            if element.tag == '{%s}%s' % (nsprefixes['w'], t):
+                if not element.text and not len(element):
+                    rmlist.append(element)
+        for element in rmlist:
+            element.getparent().remove(element)
+
+    return newdocument
+
+
+def findTypeParent(element, tag):
+    """ Finds fist parent of element of the given type
+
+    @param object element: etree element
+    @param string the tag parent to search for
+
+    @return object element: the found parent or None when not found
+    """
+
+    p = element
+    while True:
+        p = p.getparent()
+        if p.tag == tag:
+            return p
+
+    # Not found
+    return None
+
+
+def AdvSearch(document, search, bs=3):
+    '''Return set of all regex matches
+
+    This is an advanced version of python-docx.search() that takes into
+    account blocks of <bs> elements at a time.
+
+    What it does:
+    It searches the entire document body for text blocks.
+    Since the text to search could be spawned across multiple text blocks,
+    we need to adopt some sort of algorithm to handle this situation.
+    The smaller matching group of blocks (up to bs) is then adopted.
+    If the matching group has more than one block, blocks other than first
+    are cleared and all the replacement text is put on first block.
+
+    Examples:
+    original text blocks : [ 'Hel', 'lo,', ' world!' ]
+    search : 'Hello,'
+    output blocks : [ 'Hello,' ]
+
+    original text blocks : [ 'Hel', 'lo', ' __', 'name', '__!' ]
+    search : '(__[a-z]+__)'
+    output blocks : [ '__name__' ]
+
+    @param instance  document: The original document
+    @param str       search: The text to search for (regexp)
+                          append, or a list of etree elements
+    @param int       bs: See above
+
+    @return set      All occurences of search string
+
+    '''
+
+    # Compile the search regexp
+    searchre = re.compile(search)
+
+    matches = []
+
+    # Will match against searchels. Searchels is a list that contains last
+    # n text elements found in the document. 1 < n < bs
+    searchels = []
+
+    for element in document.iter():
+        if element.tag == '{%s}t' % nsprefixes['w']:  # t (text) elements
+            if element.text:
+                # Add this element to searchels
+                searchels.append(element)
+                if len(searchels) > bs:
+                    # Is searchels is too long, remove first elements
+                    searchels.pop(0)
+
+                # Search all combinations, of searchels, starting from
+                # smaller up to bigger ones
+                # l = search lenght
+                # s = search start
+                # e = element IDs to merge
+                found = False
+                for l in range(1, len(searchels) + 1):
+                    if found:
+                        break
+                    for s in range(len(searchels)):
+                        if found:
+                            break
+                        if s + l <= len(searchels):
+                            e = range(s, s + l)
+                            txtsearch = ''
+                            for k in e:
+                                txtsearch += searchels[k].text
+
+                            # Searcs for the text in the whole txtsearch
+                            match = searchre.search(txtsearch)
+                            if match:
+                                matches.append(match.group())
+                                found = True
+    return set(matches)
+
+
+def advReplace(document, search, replace, bs=3):
+    """
+    Replace all occurences of string with a different string, return updated
+    document
+
+    This is a modified version of python-docx.replace() that takes into
+    account blocks of <bs> elements at a time. The replace element can also
+    be a string or an xml etree element.
+
+    What it does:
+    It searches the entire document body for text blocks.
+    Then scan thos text blocks for replace.
+    Since the text to search could be spawned across multiple text blocks,
+    we need to adopt some sort of algorithm to handle this situation.
+    The smaller matching group of blocks (up to bs) is then adopted.
+    If the matching group has more than one block, blocks other than first
+    are cleared and all the replacement text is put on first block.
+
+    Examples:
+    original text blocks : [ 'Hel', 'lo,', ' world!' ]
+    search / replace: 'Hello,' / 'Hi!'
+    output blocks : [ 'Hi!', '', ' world!' ]
+
+    original text blocks : [ 'Hel', 'lo,', ' world!' ]
+    search / replace: 'Hello, world' / 'Hi!'
+    output blocks : [ 'Hi!!', '', '' ]
+
+    original text blocks : [ 'Hel', 'lo,', ' world!' ]
+    search / replace: 'Hel' / 'Hal'
+    output blocks : [ 'Hal', 'lo,', ' world!' ]
+
+    @param instance  document: The original document
+    @param str       search: The text to search for (regexp)
+    @param mixed     replace: The replacement text or lxml.etree element to
+                         append, or a list of etree elements
+    @param int       bs: See above
+
+    @return instance The document with replacement applied
+
+    """
+    # Enables debug output
+    DEBUG = False
+
+    newdocument = document
+
+    # Compile the search regexp
+    searchre = re.compile(search)
+
+    # Will match against searchels. Searchels is a list that contains last
+    # n text elements found in the document. 1 < n < bs
+    searchels = []
+
+    for element in newdocument.iter():
+        if element.tag == '{%s}t' % nsprefixes['w']:  # t (text) elements
+            if element.text:
+                # Add this element to searchels
+                searchels.append(element)
+                if len(searchels) > bs:
+                    # Is searchels is too long, remove first elements
+                    searchels.pop(0)
+
+                # Search all combinations, of searchels, starting from
+                # smaller up to bigger ones
+                # l = search lenght
+                # s = search start
+                # e = element IDs to merge
+                found = False
+                for l in range(1, len(searchels) + 1):
+                    if found:
+                        break
+                    #print "slen:", l
+                    for s in range(len(searchels)):
+                        if found:
+                            break
+                        if s + l <= len(searchels):
+                            e = range(s, s + l)
+                            #print "elems:", e
+                            txtsearch = ''
+                            for k in e:
+                                txtsearch += searchels[k].text
+
+                            # Searcs for the text in the whole txtsearch
+                            match = searchre.search(txtsearch)
+                            if match:
+                                found = True
+
+                                # I've found something :)
+                                if DEBUG:
+                                    log.debug("Found element!")
+                                    log.debug("Search regexp: %s",
+                                              searchre.pattern)
+                                    log.debug("Requested replacement: %s",
+                                              replace)
+                                    log.debug("Matched text: %s", txtsearch)
+                                    log.debug("Matched text (splitted): %s",
+                                             [i.text for i in searchels])
+                                    log.debug("Matched at position: %s",
+                                              match.start())
+                                    log.debug("matched in elements: %s", e)
+                                    if isinstance(replace, etree._Element):
+                                        log.debug("Will replace with XML CODE")
+                                    elif isinstance(replace(list, tuple)):
+                                        log.debug("Will replace with LIST OF"
+                                                  " ELEMENTS")
+                                    else:
+                                        log.debug("Will replace with:",
+                                                  re.sub(search, replace,
+                                                         txtsearch))
+
+                                curlen = 0
+                                replaced = False
+                                for i in e:
+                                    curlen += len(searchels[i].text)
+                                    if curlen > match.start() and not replaced:
+                                        # The match occurred in THIS element.
+                                        # Puth in the whole replaced text
+                                        if isinstance(replace, etree._Element):
+                                            # Convert to a list and process
+                                            # it later
+                                            replace = [replace]
+                                        if isinstance(replace, (list, tuple)):
+                                            # I'm replacing with a list of
+                                            # etree elements
+                                            # clear the text in the tag and
+                                            # append the element after the
+                                            # parent paragraph
+                                            # (because t elements cannot have
+                                            # childs)
+                                            p = findTypeParent(
+                                                searchels[i],
+                                                '{%s}p' % nsprefixes['w'])
+                                            searchels[i].text = re.sub(
+                                                search, '', txtsearch)
+                                            insindex = p.getparent().index(p) + 1
+                                            for r in replace:
+                                                p.getparent().insert(
+                                                    insindex, r)
+                                                insindex += 1
+                                        else:
+                                            # Replacing with pure text
+                                            searchels[i].text = re.sub(
+                                                search, replace, txtsearch)
+                                        replaced = True
+                                        log.debug(
+                                            "Replacing in element #: %s", i)
+                                    else:
+                                        # Clears the other text elements
+                                        searchels[i].text = ''
+    return newdocument
+
+
+def getdocumenttext(document):
+    '''Return the raw text of a document, as a list of paragraphs.'''
+    paratextlist = []
+    # Compile a list of all paragraph (p) elements
+    paralist = []
+    for element in document.iter():
+        # Find p (paragraph) elements
+        if element.tag == '{' + nsprefixes['w'] + '}p':
+            paralist.append(element)
+    # Since a single sentence might be spread over multiple text elements,
+    # iterate through each paragraph, appending all text (t) children to that
+    # paragraphs text.
+    for para in paralist:
+        paratext = ''
+        # Loop through each paragraph
+        for element in para.iter():
+            # Find t (text) elements
+            if element.tag == '{' + nsprefixes['w'] + '}t':
+                if element.text:
+                    paratext = paratext + element.text
+            elif element.tag == '{' + nsprefixes['w'] + '}tab':
+                paratext = paratext + '\t'
+        # Add our completed paragraph text to the list of paragraph text
+        if not len(paratext) == 0:
+            paratextlist.append(paratext)
+    return paratextlist
+
+
+def coreproperties(title, subject, creator, keywords, lastmodifiedby=None):
+    """
+    Create core properties (common document properties referred to in the
+    'Dublin Core' specification). See appproperties() for other stuff.
+    """
+    coreprops = makeelement('coreProperties', nsprefix='cp')
+    coreprops.append(makeelement('title', tagtext=title, nsprefix='dc'))
+    coreprops.append(makeelement('subject', tagtext=subject, nsprefix='dc'))
+    coreprops.append(makeelement('creator', tagtext=creator, nsprefix='dc'))
+    coreprops.append(makeelement('keywords', tagtext=','.join(keywords),
+                     nsprefix='cp'))
+    if not lastmodifiedby:
+        lastmodifiedby = creator
+    coreprops.append(makeelement('lastModifiedBy', tagtext=lastmodifiedby,
+                     nsprefix='cp'))
+    coreprops.append(makeelement('revision', tagtext='1', nsprefix='cp'))
+    coreprops.append(
+        makeelement('category', tagtext='Examples', nsprefix='cp'))
+    coreprops.append(
+        makeelement('description', tagtext='Examples', nsprefix='dc'))
+    currenttime = time.strftime('%Y-%m-%dT%H:%M:%SZ')
+    # Document creation and modify times
+    # Prob here: we have an attribute who name uses one namespace, and that
+    # attribute's value uses another namespace.
+    # We're creating the element from a string as a workaround...
+    for doctime in ['created', 'modified']:
+        elm_str = (
+            '<dcterms:%s xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc'
+            'e" xmlns:dcterms="http://purl.org/dc/terms/" xsi:type="dcterms:'
+            'W3CDTF">%s</dcterms:%s>'
+        ) % (doctime, currenttime, doctime)
+        coreprops.append(etree.fromstring(elm_str))
+    return coreprops
+
+
+def appproperties():
+    """
+    Create app-specific properties. See docproperties() for more common
+    document properties.
+
+    """
+    appprops = makeelement('Properties', nsprefix='ep')
+    appprops = etree.fromstring("""<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+    <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"></Properties>""".encode('utf-8'))
+    props = \
+        {'Template':             'Normal.dotm',
+         'TotalTime':            '6',
+         'Pages':                '1',
+         'Words':                '83',
+         'Characters':           '475',
+         'Application':          'Microsoft Word 12.0.0',
+         'DocSecurity':          '0',
+         'Lines':                '12',
+         'Paragraphs':           '8',
+         'ScaleCrop':            'false',
+         'LinksUpToDate':        'false',
+         'CharactersWithSpaces': '583',
+         'SharedDoc':            'false',
+         'HyperlinksChanged':    'false',
+         'AppVersion':           '12.0000'}
+    for prop in props:
+        appprops.append(makeelement(prop, tagtext=props[prop], nsprefix=None))
+    return appprops
+
+
+def websettings():
+    '''Generate websettings'''
+    web = makeelement('webSettings')
+    web.append(makeelement('allowPNG'))
+    web.append(makeelement('doNotSaveAsSingleFile'))
+    return web
+
+
+def relationshiplist():
+    relationshiplist = \
+        [  #['http://schemas.openxmlformats.org/officeDocument/2006/'
+         # 'relationships/numbering', 'numbering.xml'],
+         ['http://schemas.openxmlformats.org/officeDocument/2006/'
+          'relationships/styles', 'styles.xml'],
+         ['http://schemas.openxmlformats.org/officeDocument/2006/'
+          'relationships/settings', 'settings.xml'],
+         ['http://schemas.openxmlformats.org/officeDocument/2006/'
+          'relationships/webSettings', 'webSettings.xml'],
+         ['http://schemas.openxmlformats.org/officeDocument/2006/'
+          'relationships/fontTable', 'fontTable.xml'],
+         ['http://schemas.openxmlformats.org/officeDocument/2006/'
+          'relationships/theme', 'theme/theme1.xml']]
+    return relationshiplist
+
+
+def wordrelationships(relationshiplist):
+    '''Generate a Word relationships file'''
+    # Default list of relationships
+    # FIXME: using string hack instead of making element
+    #relationships = makeelement('Relationships', nsprefix='pr')
+    relationships = etree.fromstring(
+        '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006'
+        '/relationships"></Relationships>')
+    count = 0
+    for relationship in relationshiplist:
+        # Relationship IDs (rId) start at 1.
+        rel_elm = makeelement('Relationship', nsprefix=None,
+                              attributes={'Id':     'rId' + str(count + 1),
+                                          'Type':   relationship[0],
+                                          'Target': relationship[1]}
+                              )
+        relationships.append(rel_elm)
+        count += 1
+    return relationships
+
+
+def savedocx(
+        document, coreprops, appprops, contenttypes, websettings,
+        wordrelationships, output, imagefiledict=None):
+    """
+    Save a modified document
+    """
+#    if imagefiledict is None:
+#        warn(
+#            'Using savedocx() without imagefiledict parameter will be deprec'
+#            'ated in the future.', PendingDeprecationWarning
+#        )
+
+    assert os.path.isdir(template_dir)
+    docxfile = zipfile.ZipFile(
+        output, mode='w', compression=zipfile.ZIP_DEFLATED)
+
+    # Move to the template data path
+    prev_dir = os.path.abspath('.')  # save previous working dir
+    os.chdir(template_dir)
+
+    # Serialize our trees into out zip file
+    treesandfiles = {document:     'word/document.xml',
+                     coreprops:    'docProps/core.xml',
+                     appprops:     'docProps/app.xml',
+                     contenttypes: '[Content_Types].xml',
+                     websettings:  'word/webSettings.xml',
+                     wordrelationships: 'word/_rels/document.xml.rels'}
+
+    for tree in treesandfiles:
+        log.info('Saving: %s' % treesandfiles[tree])
+        treestring = etree.tostring(tree, pretty_print=True).replace(b"ns0:space", b"xml:space")
+        docxfile.writestr(treesandfiles[tree], treestring)
+
+    # Add & compress images, if applicable
+    if imagefiledict is not None:
+        for imagepath, picrelid in imagefiledict.items():
+            archivename = 'word/media/%s_%s' % (picrelid, basename(imagepath))
+            log.info('Saving: %s', archivename)
+            docxfile.write(imagepath, archivename)
+
+    # Add & compress support files
+    files_to_ignore = ['.DS_Store']  # nuisance from some os's
+    for dirpath, dirnames, filenames in os.walk('.'):
+        for filename in filenames:
+            if filename in files_to_ignore:
+                continue
+            templatefile = join(dirpath, filename)
+            archivename = templatefile[2:]
+            log.info('Saving: %s', archivename)
+            docxfile.write(templatefile, archivename)
+
+    log.info('Saved new file to: %r', output)
+    docxfile.close()
+    os.chdir(prev_dir)  # restore previous working dir
+    return
diff --git a/wetb/utils/report_generator/docx_document/docx_document.py b/wetb/utils/report_generator/docx_document/docx_document.py
new file mode 100644
index 0000000000000000000000000000000000000000..6576d995990a66a5b6ec235bedf2dfebb5edc345
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/docx_document.py
@@ -0,0 +1,464 @@
+#!/usr/bin/env python
+
+"""
+This file makes a .docx (Word 2007) file from scratch, showing off most of the
+features of python-docx.
+
+If you need to make documents from scratch, you can use this file as a basis
+for your work.
+
+Part of Python's docx module - http://github.com/mikemaccana/python-docx
+See LICENSE for licensing information.
+"""
+
+import os
+import re
+import shutil
+
+from mmpe.docx_document.docx import picture, table, caption, pagebreak
+from mmpe.docx_document import docx
+from lxml import etree
+
+from mmpe.functions.process_exec import pexec
+from contextlib import contextmanager
+from mmpe.functions.deep_coding import to_str
+from mmpe.io.make_dirs import make_dirs
+
+
+re_bullet_lst = re.compile("[+,\-,*] (.*)")
+re_number_lst = re.compile("[\d]+\. (.*)")
+inkscape_path = os.path.relpath(os.path.join(os.path.dirname(__file__.replace("library.zip", '')), "inkscape/inkscape.exe"))
+pp = lambda t : etree.tostring(t, pretty_print=True)
+
+def vector_graphics_support():
+    return os.path.isfile(inkscape_path)
+
+def prefered_graphic_format(vector=False):
+    if vector and vector_graphics_support():
+        return "pdf"
+    else:
+        return "png"
+
+class ConversionError(Exception):
+    pass
+
+
+def DocxDocument(doc, title='', subject='', creator='', keywords=[], page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, delete_closed=False):
+    if isinstance(doc, str):
+        doc = DocxDocumentClass(doc, title, subject, creator, keywords, page_margins, delete_closed)
+        doc.open_on_exit_lst.append(True)
+    else:
+        doc.open_on_exit_lst.append(False)
+    return doc
+
+class DocxDocumentClass(object):
+    open_on_exit_lst = [False]
+    def __init__(self, filename, title='', subject='', creator='', keywords=[], page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}, delete_closed=False):
+        if "%" in filename:
+            self.filename = None
+            for i in range(100):
+                f = filename % i
+                template_dir = os.path.join(os.path.dirname(f), "docx_template_" + os.path.splitext(os.path.basename(f))[0])
+                if os.path.isfile(f) or os.path.isdir(template_dir):
+                    if delete_closed:
+                        try:
+                            os.remove(f)
+                            if self.filename is None:
+                                self.filename = f
+                        except:
+                            pass
+                else:
+                    if self.filename is None:
+                        self.filename = f
+        else:
+            self.filename = filename
+        try:
+            make_dirs(self.filename)
+            with open(self.filename, 'w'):
+                pass
+        except PermissionError as e:
+            raise Warning(str(e))
+
+        self.template_dir = os.path.join(os.path.dirname(self.filename), "docx_template_" + os.path.splitext(os.path.basename(self.filename))[0])
+        if os.path.isdir(self.template_dir):
+            shutil.rmtree(self.template_dir)
+        shutil.copytree(os.path.join(os.path.dirname(__file__.replace("library.zip", '')), 'docx-template_clean'), self.template_dir)
+        docx.template_dir = self.template_dir
+
+        self.title = title
+        self.subject = subject
+        self.creator = creator
+        self.keywords = keywords
+
+        # Default set of relationshipships - the minimum components of a document
+        self.relationships = docx.relationshiplist()
+        self.imagefiledict = {}
+
+
+        # Make a new document tree - this is the main part of a Word document
+        self.document = docx.newdocument(page_margins=page_margins)
+
+        # This xpath location is where most interesting content lives
+        self.body = self.document.xpath('/w:document/w:body', namespaces=docx.nsprefixes)[0]
+        self.h = self.h1 = self.append_heading
+        self.h2 = lambda s : self.append_heading(s, 2)
+        self.h3 = lambda s : self.append_heading(s, 3)
+        self.p = self.append_paragraph
+        self.n = lambda s : self.append_paragraph([(s, 'ns')])
+        self.i = lambda s : self.append_paragraph([(s, 'i')])
+        self.b = lambda s : self.append_paragraph([(s, 'b')])
+        self.new_page = lambda : self.body.append(pagebreak())
+        self.table = docx.table
+        self.paragraph = docx.paragraph
+        self.caption = docx.caption
+        self.heading = docx.heading
+
+    def write_access(self):
+        try:
+            with open(self.filename, 'a+'):
+                pass
+            return True
+        except IOError:
+            return False
+
+
+    def close(self):
+        if os.path.isdir(self.template_dir):
+            shutil.rmtree(self.template_dir)
+
+
+
+    def search(self, string):
+        return docx.search(self.body, string)
+
+#    def replace(self, find_string, replace_string):
+#        replace(self.body, find_string, replace_string)
+
+
+    def append_heading(self, string, level=1):
+        self.body.append(docx.heading(string, level))
+
+    def append_paragraph(self, string, style='BodyText', breakbefore=False, jc='left', spacing={'before':0, 'after':6}, font_size=12):
+        self.body.append(docx.paragraph(string, style, breakbefore, jc, spacing, font_size))
+
+    def append_list(self, item_list, style):
+        for item in item_list:
+            self.append_paragraph(item, style)
+
+    def append_numberlist(self, item_list):
+        self.append_list(item_list, 'ListNumber')
+
+    def append_bulletlist(self, item_list):
+        self.append_list(item_list, 'ListBullet')
+
+    def append_caption(self, tag, caption_text):
+        self.body.append(caption("Figure", caption_text))
+
+    def picture(self, path, title="", pixelwidth=None, pixelheight=None):
+        global inkscape_path
+        _, ext = os.path.splitext(path.lower())
+        if ext in (".svg", '.svgz', '.eps', '.pdf'):
+            emf_path = path.replace(ext, '.emf')
+            args = [inkscape_path, path, '--export-emf=%s' % emf_path]
+            returncode, stdout, stderr, cmd = pexec(args)
+            if returncode != 0 or not os.path.exists(emf_path):
+                inkscape_path = ""
+                raise ConversionError("%s\n%s" % (stdout, stderr))
+            #succeded
+            path = emf_path
+
+        self.relationships, picpara = picture(self.relationships, path, title, pixelwidth, pixelheight)
+        return picpara
+
+
+    def append_picture(self, path, caption_text="", pixelwidth=None, pixelheight=None):
+        self.body.append(self.picture(path, caption_text, pixelwidth, pixelheight))
+#        if caption_text != "":
+#            self.body.append(caption("Figure", caption_text))
+
+
+
+    def append_table(self, lst_of_lst, header=None, first_column=None, corner="", heading=False, colw=None, cwunit='dxa',
+                     tblw=0, twunit='auto',
+                     tblmargin={'left':.19, 'right':.19},
+                     borders={"all":{"color":'auto', 'val':'single', 'sz':'4'}},
+                     column_style={'all':{'font_size':10, 'spacing':{'before':0, 'after':0}}}):
+        """
+        @param list contents: A list of lists describing contents. Every item in
+                      the list can be a string or a valid XML element
+                      itself. It can also be a list. In that case all the
+                      listed elements will be merged into the cell.
+        @param bool heading:  Tells whether first line should be treated as
+                              heading or not
+        @param list colw:     list of integer column widths specified in wunitS.
+        @param str  cwunit:   Unit used for column width:
+                                'pct'  : fiftieths of a percent
+                                'dxa'  : twentieths of a point
+                                'nil'  : no width
+                                'auto' : automagically determined
+        @param int  tblw:     Table width
+        @param str  twunit:   Unit used for table width. Same possible values as
+                              cwunit.
+        @param dict borders:  Dictionary defining table border. Supported keys
+                              are: 'top', 'left', 'bottom', 'right',
+                              'insideH', 'insideV', 'all'.
+                              When specified, the 'all' key has precedence over
+                              others. Each key must define a dict of border
+                              attributes:
+                                color : The color of the border, in hex or
+                                        'auto'
+                                space : The space, measured in points
+                                sz    : The size of the border, in eighths of
+                                        a point
+                                val   : The style of the border, see
+                    http://www.schemacentral.com/sc/ooxml/t-w_ST_Border.htm
+        @param list celstyle: Specify the style for each colum, list of dicts.
+                              supported keys:
+                              'align' : specify the alignment, see paragraph
+                                        documentation."""
+        m = len(lst_of_lst)
+        n = len(lst_of_lst[0])
+        if header:
+
+            if first_column:
+                lst_of_lst = [[corner] + header] + [[fc] + lst for fc, lst in zip(first_column, lst_of_lst)]
+            else:
+                lst_of_lst = [header] + [ lst for lst in lst_of_lst]
+        lst_of_lst = [[(str(v), v)[isinstance(v, (etree._Element, list, tuple))] for v in lst] for lst in lst_of_lst]
+
+        self.body.append(table(lst_of_lst, heading, colw, cwunit, tblw, tblmargin, twunit, borders, column_style))
+
+
+
+    def append_markdown(self, s):
+        number_lst = []
+        bullet_lst = []
+
+        for l in s.split("\n"):
+            #bullet list
+            if re_bullet_lst.match(l) is not None:
+                bullet_lst.append(re_bullet_lst.match(l).groups()[0])
+                continue
+            elif len(bullet_lst) > 0:
+                self.append_bulletlist(bullet_lst)
+                bullet_lst = []
+            # number list
+            if re_number_lst.match(l) is not None:
+                number_lst.append(re_number_lst.match(l).groups()[0])
+                continue
+            elif len(number_lst) > 0:
+                self.append_numberlist(number_lst)
+                number_lst = []
+
+
+
+            #headings
+            if l.startswith("#"):
+                for i in [3, 2, 1]:
+                    if l.startswith("#"*i):
+                        self.append_heading(l[i:], i)
+                        break
+
+            elif (' *' in l and "* " in l) or (" _" in l and "_ " in l):
+                def styleit(text_lst, style_lst, tag, style):
+                    t_lst = []
+                    s_lst = []
+                    for t, s in (zip(text_lst, style_lst)):
+                        while t.count(tag) > 2:  #" " + tag in t and tag + " " in t:
+                            before, rest = t.split(tag, 1)
+                            style_text, t = rest.split(tag, 1)
+                            t_lst.append(before);s_lst.append(s)
+                            t_lst.append(style_text);s_lst.append(style)
+                        else:
+                            t_lst.append(t);s_lst.append(s)
+                    return t_lst, s_lst
+                text_lst, style_lst = [l], ['n']
+                text_lst, style_lst = styleit(text_lst, style_lst, "**", 'b')
+                text_lst, style_lst = styleit(text_lst, style_lst, "__", 'b')
+                text_lst, style_lst = styleit(text_lst, style_lst, "*", 'i')
+                text_lst, style_lst = styleit(text_lst, style_lst, "_", 'i')
+                self.append_paragraph(list(zip(text_lst, style_lst)))
+            else:
+                self.n(l)
+
+    def landscape(self, page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}):
+        self.body.append(pagebreak('section', page_margins, portrait=False))
+
+    def portrait(self, page_margins={'top':2, 'bottom':2, 'left':3, 'right':2}):
+        self.body.append(pagebreak('section', page_margins, portrait=True))
+
+    def save(self, filename=None):
+        if filename is not None:
+            self.filename = filename
+
+        coreprops = docx.coreproperties(title=self.title,
+                                   subject=self.subject,
+                                   creator=self.creator,
+                                   keywords=self.keywords)
+        appprops = docx.appproperties()
+        contenttypes = docx.contenttypes()
+        websettings = docx.websettings()
+        wordrelationships = docx.wordrelationships(self.relationships)
+        # Save our document
+        docx.savedocx(self.document, coreprops, appprops, contenttypes, websettings,
+                 wordrelationships, self.filename)
+
+    def open(self):
+        self.save()
+        self.close()
+        import subprocess
+        subprocess.Popen(os.path.realpath(self.filename), shell=True, cwd=os.getcwd())
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        if self.open_on_exit_lst.pop():
+            self.open()
+
+
+
+if __name__ == '__main__':
+
+#    doc1 = DocxDocument('test%d.docx')
+#    doc1.h1("first")
+#    doc1.open()
+    with DocxDocument('test%d.docx', delete_closed=True) as doc:
+        doc.p("hej")
+
+#    doc3 = DocxDocument('test%d.docx')
+#    doc3.h1("thirda")
+#    with DocxDocument(doc3) as doc:
+#        doc.h1("thirdb")
+
+#    doc = DocxDocument("test%d.docx")
+#    doc.append_table([['1', '2'], ['3', '4']], header=['a', 'b'], first_column=['c', 'd'], corner='table')
+#    doc.p("")
+#    doc.append_table([['1', '2'], ['3', '4']], header=['a', 'b'], first_column=['c', 'd'])
+#    doc.p("")
+#    doc.append_table([['1', '2'], ['3', '4']], header=['a', 'b'])
+#    doc.p("")
+#    doc.append_table([['1', '2'], ['3', '4']], first_column=['a', 'b'])
+
+    #table_xml = doc.table([['A1'], ['B1']], heading=False, column_style={'all':{'font_size':20, 'spacing':{'before':0, 'after':0}}})
+#    p = doc.paragraph("Test", font_size=30)
+#
+#    doc.body.append(p)
+#
+#    doc.n("")
+#
+#    # Append two headings and a paragraph
+#    doc.h("Welcome to Python's docx module")
+#    doc.h2('Make and edit docx in 200 lines of pure Python')
+#    doc.n('The module was created when I was looking for a '
+#        'Python support for MS Word .doc files on PyPI and Stackoverflow. '
+#        'Unfortunately, the only solutions I could find used:')
+#
+#    doc.i('For those of us who prefer something simpler')
+#    doc.b('I made docx.')
+#
+#
+#    # Add a numbered list
+#    points = [ 'COM automation'
+#             , '.net or Java'
+#             , 'Automating OpenOffice or MS Office'
+#             ]
+#    doc.append_numberlist(points)
+#
+#    doc.append_picture('image1.png', "This is a picture")
+#
+#    doc.append_table([ [doc.picture('image1.png'), 'A2', 'A3'],
+#                       ['B1', 'B2', 'B3'],
+#                       ['C1', 'C2', 'C3']], False)
+#
+##   doc.append_picture('../myplot.pdf', "test", 100, 100)
+#    doc.append_markdown("""#Welcome to Python's docx module
+###Make and edit docx in 200 lines of pure Python
+#The module was created when I was looking for a Python support for MS Word .doc files on PyPI and Stackoverflow. Unfortunately, the only solutions I could find used:
+#*For those of us who prefer something simpler* **I made docx.**
+#
+#4. First
+#5. Second
+#6. Third
+#
+#- first
+#* second
+#+ third
+#""")
+
+
+    #doc.append_heading('Making documents', 2)
+#    body.append(paragraph('The docx module has the following features:'))
+#
+#    # Add some bullets
+#    points = ['Paragraphs', 'Bullets', 'Numbered lists',
+#              'Multiple levels of headings', 'Tables', 'Document Properties']
+#    for point in points:
+#        body.append(paragraph(point, style='ListBullet'))
+#
+#    body.append(paragraph('Tables are just lists of lists, like this:'))
+#    # Append a table
+#    tbl_rows = [ ['A1', 'A2', 'A3']
+#               , ['B1', 'B2', 'B3']
+#               , ['C1', 'C2', 'C3']
+#               ]
+#    body.append(table(tbl_rows))
+#
+#    body.append(heading('Editing documents', 2))
+#    body.append(paragraph('Thanks to the awesomeness of the lxml module, '
+#                          'we can:'))
+#    points = [ 'Search and replace'
+#             , 'Extract plain text of document'
+#             , 'Add and delete items anywhere within the document'
+#             ]
+#    for point in points:
+#        body.append(paragraph(point, style='ListBullet'))
+#
+#    # Add an image
+#    relationships, picpara = picture(relationships, 'image1.png',
+#                                     'This is a test description')
+#    body.append(picpara)
+#
+#    # Search and replace
+#    print 'Searching for something in a paragraph ...',
+#    if search(body, 'the awesomeness'):
+#        print 'found it!'
+#    else:
+#        print 'nope.'
+#
+#    print 'Searching for something in a heading ...',
+#    if search(body, '200 lines'):
+#        print 'found it!'
+#    else:
+#        print 'nope.'
+#
+#    print 'Replacing ...',
+#    body = replace(body, 'the awesomeness', 'the goshdarned awesomeness')
+#    print 'done.'
+#
+#    # Add a pagebreak
+#    body.append(pagebreak(type='page', orient='portrait'))
+#
+#    body.append(heading('Ideas? Questions? Want to contribute?', 2))
+#    body.append(paragraph('Email <python.docx@librelist.com>'))
+
+#    # Create our properties, contenttypes, and other support files
+#    title = 'Python docx demo'
+#    subject = 'A practical example of making docx from Python'
+#    creator = 'Mike MacCana'
+#    keywords = ['python', 'Office Open XML', 'Word']
+
+#    coreprops = coreproperties(title=title, subject=subject, creator=creator,
+#                               keywords=keywords)
+#    appprops = appproperties()
+#    contenttypes = contenttypes()
+#    websettings = websettings()
+#    wordrelationships = wordrelationships(relationships)
+#
+#    # Save our document
+#    savedocx(document, coreprops, appprops, contenttypes, websettings,
+#             wordrelationships, 'Welcome to the Python docx module.docx')
+#    doc.save()
+#    doc.close()
+#    doc.open()
+#
diff --git a/wetb/utils/report_generator/docx_document/example.py b/wetb/utils/report_generator/docx_document/example.py
new file mode 100644
index 0000000000000000000000000000000000000000..c8596f44f2cadf90401a305d8ce1c0a185ef0a13
--- /dev/null
+++ b/wetb/utils/report_generator/docx_document/example.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+
+"""
+This file makes a .docx (Word 2007) file from scratch, showing off most of the
+features of python-docx.
+
+If you need to make documents from scratch, you can use this file as a basis
+for your work.
+
+Part of Python's docx module - http://github.com/mikemaccana/python-docx
+See LICENSE for licensing information.
+"""
+
+from mmpe.docx_document.docx import *
+
+if __name__ == '__main__':
+    # Default set of relationshipships - the minimum components of a document
+    relationships = relationshiplist()
+
+    # Make a new document tree - this is the main part of a Word document
+    document = newdocument()
+
+    # This xpath location is where most interesting content lives
+    body = document.xpath('/w:document/w:body', namespaces=nsprefixes)[0]
+
+    # Append two headings and a paragraph
+    body.append(heading("Welcome to Python's docx module", 1))
+    body.append(heading('Make and edit docx in 200 lines of pure Python', 2))
+    body.append(paragraph('The module was created when I was looking for a '
+        'Python support for MS Word .doc files on PyPI and Stackoverflow. '
+        'Unfortunately, the only solutions I could find used:'))
+
+    # Add a numbered list
+    points = [ 'COM automation'
+             , '.net or Java'
+             , 'Automating OpenOffice or MS Office'
+             ]
+    for point in points:
+        body.append(paragraph(point, style='ListNumber'))
+    body.append(paragraph([('For those of us who prefer something simpler, I '
+                          'made docx.', 'i')]))
+    body.append(heading('Making documents', 2))
+    body.append(paragraph('The docx module has the following features:'))
+
+    # Add some bullets
+    points = ['Paragraphs', 'Bullets', 'Numbered lists',
+              'Multiple levels of headings', 'Tables', 'Document Properties']
+    for point in points:
+        body.append(paragraph(point, style='ListBullet'))
+
+    body.append(paragraph('Tables are just lists of lists, like this:'))
+    # Append a table
+    tbl_rows = [ ['A1', 'A2', 'A3']
+               , ['B1', 'B2', 'B3']
+               , ['C1', 'C2', 'C3']
+               ]
+    body.append(table(tbl_rows))
+
+    body.append(heading('Editing documents', 2))
+    body.append(paragraph('Thanks to the awesomeness of the lxml module, '
+                          'we can:'))
+    points = [ 'Search and replace'
+             , 'Extract plain text of document'
+             , 'Add and delete items anywhere within the document'
+             ]
+    for point in points:
+        body.append(paragraph(point, style='ListBullet'))
+
+    # Add an image
+    relationships, picpara = picture(relationships, 'image1.png',
+                                     'This is a test description')
+    body.append(picpara)
+
+    # Search and replace
+    print ('Searching for something in a paragraph ...',)
+    if search(body, 'the awesomeness'):
+        print ('found it!')
+    else:
+        print ('nope.')
+
+    print ('Searching for something in a heading ...',)
+    if search(body, '200 lines'):
+        print ('found it!')
+    else:
+        print ('nope.')
+
+    print ('Replacing ...',)
+    body = replace(body, 'the awesomeness', 'the goshdarned awesomeness')
+    print ('done.')
+
+    # Add a pagebreak
+    body.append(pagebreak(type='page', orient='portrait'))
+
+    body.append(heading('Ideas? Questions? Want to contribute?', 2))
+    body.append(paragraph('Email <python.docx@librelist.com>'))
+
+    # Create our properties, contenttypes, and other support files
+    title = 'Python docx demo'
+    subject = 'A practical example of making docx from Python'
+    creator = 'Mike MacCana'
+    keywords = ['python', 'Office Open XML', 'Word']
+
+    coreprops = coreproperties(title=title, subject=subject, creator=creator,
+                               keywords=keywords)
+    appprops = appproperties()
+    contenttypes = contenttypes()
+    websettings = websettings()
+    wordrelationships = wordrelationships(relationships)
+
+    # Save our document
+    savedocx(document, coreprops, appprops, contenttypes, websettings,
+             wordrelationships, 'Welcome to the Python docx module.docx')