FREEMARKER-129 freemarker-generator: Merge "freemarker-cli" into "freemarker-generator" (#5)

* FREEMARKER-129 Move maven plugin into its own sub-module

* FREEMARKER-129 Move "freemarker-cli" into its submodule

* FREEMARKER-129 Extract submodule "freemarker-generator-base"

* FREEMARKER-129 Rename / move things around

* FREEMARKER-129 Rename / move things around

* FREEMARKER-129 Re-format the source code

* FREEMARKER-129 Refactor source code

* FREEMARKER-129 Move the tools into "freemarker-generator-tools"

* FREEMARKER-129 Move the tools into "freemarker-generator-tools"

* FREEMARKER-129 Cleanup source code

* FREEMARKER-129 Cleanup source code

* FREEMARKER-129 Minor refactorings

* FREEMARKER-129 Improve tests and Maven build

* Add CSV filter and transform example

* FREEMARKER-129 More refactoring and documentation updates

* FREEMARKER-129 More refactoring and documentation updates

* FREEMARKER-129 Cleanup POMs and dependency management

* FREEMARKER-129 Cleanup POMs and dependency management

* FREEMARKER-129 Use `freemarker.configuration.setting` in `freemarker-cli.properties` to configure FreeMarker

* FREEMARKER-129 Add `freemarker-generator-maven-plugin-sample`

* FREEMARKER-129 Add `freemarker-generator-maven-plugin-sample`

* FREEMARKER-129 Add `freemarker-generator-maven-plugin-sample`

* FREEMARKER-129 Make the Maven RAT plugin happy again

* FREEMARKER-129 Minor refactorings

* FREEMARKER-129 Add LICENSE and NOTICE files to each module

* FREEMARKER-129 Add Travis configuration

* FREEMARKER-129 Update documentation

* FREEMARKER-129 Refactor code

* FREEMARKER-129 Update documentation

* FREEMARKER-129 Refactor code

* FREEMARKER-129 Fix broken Travis build

* FREEMARKER-129 Improve Travis build

* FREEMARKER-129 Add OpenJDK 13 to Travis build

* FREEMARKER-129 Move the various constants into "FreeMarkerConstants" and remove "Settings" from the document model

* FREEMARKER-129 More refactoring & cleanup

* FREEMARKER-129 More refactoring & cleanup

* FREEMARKER-129 More refactoring & cleanup

* FREEMARKER-129 More refactoring & cleanup

* FREEMARKER-129 More refactoring & cleanup

* FREEMARKER-129 User-defined parameters are passed as `-Pkey=value` instead of using system properties

* FREEMARKER-129 User-defined parameters are passed as `-Pkey=value` instead of using system properties

* FREEMARKER-129 User-defined parameters are passed as `-Pkey=value` instead of using system properties

* FREEMARKER-129 More refactoring & cleanup

* FREEMARKER-129 More refactoring & cleanup

* FREEMARKER-129 Support document exclude pattern in addition to include pattern
diff --git a/.gitignore b/.gitignore
index 57e5d5b..4718a9d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,17 +15,17 @@
 # specific language governing permissions and limitations

 # under the License.

 

-/.ivy/

-/.bin/

-/build/

-/build.properties

-/archive/

-/ide-dependencies/

-/META-INF

+.ivy/

+.bin/

+build/

+build.properties

+archive/

+ide-dependencies/

+META-INF

 

-/out/

-/bin/

-/target/

+out/

+bin/

+target/

 

 .classpath

 .project

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..1edf54c
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,14 @@
+language: java
+jdk:
+  - openjdk8
+  - openjdk9
+  - openjdk10
+  - openjdk11
+  - openjdk12
+  - openjdk13
+script:
+  - mvn clean install
+  - cd ./freemarker-generator-cli
+  - sh ./run-samples.sh
+  - cd ../freemarker-generator-maven-plugin-sample
+  - mvn clean package
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c19081..f9a227d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,15 +1,27 @@
-# Changelog
+# Change Log
 
-## 1.0.0-SNAPSHOT
+All notable changes to this project will be documented in this file. We try to adhere to https://github.com/olivierlacan/keep-a-changelog.
+
+## 0.1.0-SNAPSHOT
 
 ### Added
+* [FREEMARKER-129] Support document exclude pattern in addition to include pattern
+* [FREEMARKER-129] User-defined parameters are passed as `-Pkey=value` instead of using system properties
+* [FREEMARKER-129] Add `freemarker-generator-maven-plugin-sample`
+* [FREEMARKER-129] Migrate `freemarker-cli` into `freemarker-generator` project (see [https://github.com/sgoeschl/freemarker-cli](https://github.com/sgoeschl/freemarker-cli))
 
 ### Changed
+* [FREEMARKER-129] Use `freemarker.configuration.setting` in `freemarker-cli.properties` to configure FreeMarker
+* [FREEMARKER-129] Provide a `toString()` metheod for all tools
+* [FREEMARKER-129] Use version "0.X.Y" to cater for API changes according to [Semantic Versioning](https://semver.org)
+* [FREEMARKER-129] Change artifact `freemarker-maven-plugin` to `freemarker-generator-maven-plugin`
+* [FREEMARKER-128] Update `freemarker-maven-plugin` to Apache FreeMarker 2.3.29
 
-### Fixed
+### Deleted
 
-[FREEMARKER-127] Site build fails with missing "org/apache/maven/doxia/siterenderer/DocumentContent"
-
-### Removed
+### Fixed 
+* [FREEMARKER-127] Site build fails with missing "org/apache/maven/doxia/siterenderer/DocumentContent"
 
 [FREEMARKER-127]: https://issues.apache.org/jira/browse/FREEMARKER-127
+[FREEMARKER-128]: https://issues.apache.org/jira/browse/FREEMARKER-128
+[FREEMARKER-129]: https://issues.apache.org/jira/browse/FREEMARKER-129
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index de286ad..1121eba 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,223 +1,223 @@
-

-                                 Apache License

-                           Version 2.0, January 2004

-                        http://www.apache.org/licenses/

-

-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

-

-   1. Definitions.

-

-      "License" shall mean the terms and conditions for use, reproduction,

-      and distribution as defined by Sections 1 through 9 of this document.

-

-      "Licensor" shall mean the copyright owner or entity authorized by

-      the copyright owner that is granting the License.

-

-      "Legal Entity" shall mean the union of the acting entity and all

-      other entities that control, are controlled by, or are under common

-      control with that entity. For the purposes of this definition,

-      "control" means (i) the power, direct or indirect, to cause the

-      direction or management of such entity, whether by contract or

-      otherwise, or (ii) ownership of fifty percent (50%) or more of the

-      outstanding shares, or (iii) beneficial ownership of such entity.

-

-      "You" (or "Your") shall mean an individual or Legal Entity

-      exercising permissions granted by this License.

-

-      "Source" form shall mean the preferred form for making modifications,

-      including but not limited to software source code, documentation

-      source, and configuration files.

-

-      "Object" form shall mean any form resulting from mechanical

-      transformation or translation of a Source form, including but

-      not limited to compiled object code, generated documentation,

-      and conversions to other media types.

-

-      "Work" shall mean the work of authorship, whether in Source or

-      Object form, made available under the License, as indicated by a

-      copyright notice that is included in or attached to the work

-      (an example is provided in the Appendix below).

-

-      "Derivative Works" shall mean any work, whether in Source or Object

-      form, that is based on (or derived from) the Work and for which the

-      editorial revisions, annotations, elaborations, or other modifications

-      represent, as a whole, an original work of authorship. For the purposes

-      of this License, Derivative Works shall not include works that remain

-      separable from, or merely link (or bind by name) to the interfaces of,

-      the Work and Derivative Works thereof.

-

-      "Contribution" shall mean any work of authorship, including

-      the original version of the Work and any modifications or additions

-      to that Work or Derivative Works thereof, that is intentionally

-      submitted to Licensor for inclusion in the Work by the copyright owner

-      or by an individual or Legal Entity authorized to submit on behalf of

-      the copyright owner. For the purposes of this definition, "submitted"

-      means any form of electronic, verbal, or written communication sent

-      to the Licensor or its representatives, including but not limited to

-      communication on electronic mailing lists, source code control systems,

-      and issue tracking systems that are managed by, or on behalf of, the

-      Licensor for the purpose of discussing and improving the Work, but

-      excluding communication that is conspicuously marked or otherwise

-      designated in writing by the copyright owner as "Not a Contribution."

-

-      "Contributor" shall mean Licensor and any individual or Legal Entity

-      on behalf of whom a Contribution has been received by Licensor and

-      subsequently incorporated within the Work.

-

-   2. Grant of Copyright License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      copyright license to reproduce, prepare Derivative Works of,

-      publicly display, publicly perform, sublicense, and distribute the

-      Work and such Derivative Works in Source or Object form.

-

-   3. Grant of Patent License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      (except as stated in this section) patent license to make, have made,

-      use, offer to sell, sell, import, and otherwise transfer the Work,

-      where such license applies only to those patent claims licensable

-      by such Contributor that are necessarily infringed by their

-      Contribution(s) alone or by combination of their Contribution(s)

-      with the Work to which such Contribution(s) was submitted. If You

-      institute patent litigation against any entity (including a

-      cross-claim or counterclaim in a lawsuit) alleging that the Work

-      or a Contribution incorporated within the Work constitutes direct

-      or contributory patent infringement, then any patent licenses

-      granted to You under this License for that Work shall terminate

-      as of the date such litigation is filed.

-

-   4. Redistribution. You may reproduce and distribute copies of the

-      Work or Derivative Works thereof in any medium, with or without

-      modifications, and in Source or Object form, provided that You

-      meet the following conditions:

-

-      (a) You must give any other recipients of the Work or

-          Derivative Works a copy of this License; and

-

-      (b) You must cause any modified files to carry prominent notices

-          stating that You changed the files; and

-

-      (c) You must retain, in the Source form of any Derivative Works

-          that You distribute, all copyright, patent, trademark, and

-          attribution notices from the Source form of the Work,

-          excluding those notices that do not pertain to any part of

-          the Derivative Works; and

-

-      (d) If the Work includes a "NOTICE" text file as part of its

-          distribution, then any Derivative Works that You distribute must

-          include a readable copy of the attribution notices contained

-          within such NOTICE file, excluding those notices that do not

-          pertain to any part of the Derivative Works, in at least one

-          of the following places: within a NOTICE text file distributed

-          as part of the Derivative Works; within the Source form or

-          documentation, if provided along with the Derivative Works; or,

-          within a display generated by the Derivative Works, if and

-          wherever such third-party notices normally appear. The contents

-          of the NOTICE file are for informational purposes only and

-          do not modify the License. You may add Your own attribution

-          notices within Derivative Works that You distribute, alongside

-          or as an addendum to the NOTICE text from the Work, provided

-          that such additional attribution notices cannot be construed

-          as modifying the License.

-

-      You may add Your own copyright statement to Your modifications and

-      may provide additional or different license terms and conditions

-      for use, reproduction, or distribution of Your modifications, or

-      for any such Derivative Works as a whole, provided Your use,

-      reproduction, and distribution of the Work otherwise complies with

-      the conditions stated in this License.

-

-   5. Submission of Contributions. Unless You explicitly state otherwise,

-      any Contribution intentionally submitted for inclusion in the Work

-      by You to the Licensor shall be under the terms and conditions of

-      this License, without any additional terms or conditions.

-      Notwithstanding the above, nothing herein shall supersede or modify

-      the terms of any separate license agreement you may have executed

-      with Licensor regarding such Contributions.

-

-   6. Trademarks. This License does not grant permission to use the trade

-      names, trademarks, service marks, or product names of the Licensor,

-      except as required for reasonable and customary use in describing the

-      origin of the Work and reproducing the content of the NOTICE file.

-

-   7. Disclaimer of Warranty. Unless required by applicable law or

-      agreed to in writing, Licensor provides the Work (and each

-      Contributor provides its Contributions) on an "AS IS" BASIS,

-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

-      implied, including, without limitation, any warranties or conditions

-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

-      PARTICULAR PURPOSE. You are solely responsible for determining the

-      appropriateness of using or redistributing the Work and assume any

-      risks associated with Your exercise of permissions under this License.

-

-   8. Limitation of Liability. In no event and under no legal theory,

-      whether in tort (including negligence), contract, or otherwise,

-      unless required by applicable law (such as deliberate and grossly

-      negligent acts) or agreed to in writing, shall any Contributor be

-      liable to You for damages, including any direct, indirect, special,

-      incidental, or consequential damages of any character arising as a

-      result of this License or out of the use or inability to use the

-      Work (including but not limited to damages for loss of goodwill,

-      work stoppage, computer failure or malfunction, or any and all

-      other commercial damages or losses), even if such Contributor

-      has been advised of the possibility of such damages.

-

-   9. Accepting Warranty or Additional Liability. While redistributing

-      the Work or Derivative Works thereof, You may choose to offer,

-      and charge a fee for, acceptance of support, warranty, indemnity,

-      or other liability obligations and/or rights consistent with this

-      License. However, in accepting such obligations, You may act only

-      on Your own behalf and on Your sole responsibility, not on behalf

-      of any other Contributor, and only if You agree to indemnify,

-      defend, and hold each Contributor harmless for any liability

-      incurred by, or claims asserted against, such Contributor by reason

-      of your accepting any such warranty or additional liability.

-

-   END OF TERMS AND CONDITIONS

-

-   APPENDIX: How to apply the Apache License to your work.

-

-      To apply the Apache License to your work, attach the following

-      boilerplate notice, with the fields enclosed by brackets "[]"

-      replaced with your own identifying information. (Don't include

-      the brackets!)  The text should be enclosed in the appropriate

-      comment syntax for the file format. We also recommend that a

-      file or class name and description of purpose be included on the

-      same "printed page" as the copyright notice for easier

-      identification within third-party archives.

-

-   Copyright [yyyy] [name of copyright owner]

-

-   Licensed under the Apache License, Version 2.0 (the "License");

-   you may not use this file except in compliance with the License.

-   You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

-

-=========================================================================

-

-The source code contains the following binaries,

-which were created at the Apache FreeMarker project, and hence are

-covered by the same license as the other source files of it:

-

-  src/main/misc/overloadedNumberRules/prices.ods

-  src/manual/en_US/docgen-originals/figures/overview.odg

-  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png

-  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png

-  src/manual/en_US/favicon.png

-  src/manual/en_US/figures/model2sketch.png

-  src/manual/en_US/figures/overview.png

-  src/manual/en_US/figures/tree.png

-  src/manual/en_US/logo.png

-  src/manual/zh_CN/favicon.png

-  src/manual/zh_CN/figures/model2sketch.png

-  src/manual/zh_CN/figures/overview.png

-  src/manual/zh_CN/figures/tree.png

-  src/manual/zh_CN/logo.png

+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================
+
+The source code contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
+
+  src/main/misc/overloadedNumberRules/prices.ods
+  src/manual/en_US/docgen-originals/figures/overview.odg
+  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
+  src/manual/en_US/favicon.png
+  src/manual/en_US/figures/model2sketch.png
+  src/manual/en_US/figures/overview.png
+  src/manual/en_US/figures/tree.png
+  src/manual/en_US/logo.png
+  src/manual/zh_CN/favicon.png
+  src/manual/zh_CN/figures/model2sketch.png
+  src/manual/zh_CN/figures/overview.png
+  src/manual/zh_CN/figures/tree.png
+  src/manual/zh_CN/logo.png
diff --git a/NOTICE b/NOTICE
index bc6e606..c27f50e 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
-Apache FreeMarker

-Copyright 2015-2018 The Apache Software Foundation

-

-This product includes software developed at

-The Apache Software Foundation (http://www.apache.org/).

+Apache FreeMarker Site
+Copyright 2020 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index 3a6db0d..efc2fc2 100644
--- a/README.md
+++ b/README.md
@@ -1,184 +1,37 @@
-Apache FreeMarker Generator

-===========================

-

-For documentation or to report bugs visit:

-https://freemarker.apache.org/generator.html

-

-

-Regarding pull requests on Github

----------------------------------

-

-By sending a pull request you grant the Apache Software Foundation

-sufficient rights to use and release the submitted work under the

-Apache license. You grant the same rights (copyright license, patent

-license, etc.) to the Apache Software Foundation as if you have signed

-a [Contributor License Agreement](https://www.apache.org/dev/new-committers-guide.html#cla).

-For contributions that are judged to be non-trivial, you will be asked

-to actually signing a Contributor License Agreement.

-

-

-What is Apache FreeMarker Generator?

-------------------------------------

-

-FreeMarker Generator is a tool that generates files based on FreeMarker

-templates and data that's typically provided in files (such as JSON files) as

-well. It can be used to generated source code, configuration files, etc.

-

-Currently it can be invoked as a Maven plug-in, but in the future it might

-will be callable on other ways (say, from Gradle, or as a standalone command

-line tool).

-

-freemarker-generator-maven-plugin

----------------------------------

-## Table of contents

-

-- [Background](#background)

-- [Install](#install)

-- [Usage](#usage)

-  - [FreeMarker Template Files](#freemarker-template-files)

-  - [JSON Generator Files](#json-generator-files)

-  - [Using POM Properties During Generation](#using-pom-properties-during-generation)

-  - [FreeMarker Configuration](#freemarker-configuration)

-  - [Incremental Builds](#incremental-builds)

-- [Code Coverage](#code-coverage)

-- [Contributing](#contributing)

-- [License](#license)

-

-## Background

-This plugin generates source files from FreeMarker templates with a flexible process that includes the ability to:

-

-- Generate multiple source files from a single template,

-- Generate source files during multiple steps in the build process such as testing, and

-- Specify distinct locations for the templates and data models for different stages of the build. 

-

-## Install

-### pom.xml

-

-Add the following snippet within the `<plugins>` tag of your pom.xml:

-

-```xml

-      <plugin>

-        <groupId>com.oath</groupId>

-        <artifactId>freemarker-maven-plugin</artifactId>

-        <version>${freemarker-maven-plugin.version}</version>

-        <configuration>

-          <!-- Required. Specifies the compatibility version for template processing -->

-          <freeMarkerVersion>2.3.23</freeMarkerVersion>

-        </configuration>

-        <executions>

-          <!-- If you want to generate files during other phases, just add more execution

-               tags and specify appropriate phase, sourceDirectory and outputDirectory values.

-          -->

-          <execution>

-            <id>freemarker</id>

-            <!-- Optional, defaults to generate-sources -->

-            <phase>generate-sources</phase>

-            <goals>

-              <!-- Required, must be generate -->

-              <goal>generate</goal>

-            </goals>

-            <configuration>

-              <!-- Optional, defaults to src/main/freemarker/generator -->

-              <sourceDirectory>src/main/freemarker</sourceDirectory>

-              <!-- Optional, defaults to src/main/freemarker/generator/template -->

-              <templateDirectory>src/main/freemarker/template</templateDirectory>

-              <!-- Optional, defaults to src/main/freemarker/generator -->

-              <generatorDirectory>src/main/freemarker/generator/generator</generatorDirectory>

-              <!-- Optional, defaults to target/generated-sources/freemarker -->

-              <outputDirectory>target/generated-sources/freemarker/generator</outputDirectory>

-            </configuration>

-          </execution>

-        </executions>

-      </plugin>

-```

-

-## Usage

-

-### FreeMarker Template Files

-FreeMarker template files must reside in the `templateDirectory`. For the default configuration,

-this is: `src/main/freemarker/generator/template`.

-

-By convention, file names for FreeMarker template files use the .ftl extension. For details on the FreeMarker

-template syntax, see: [Getting Started](https://freemarker.apache.org/docs/dgui_quickstart.html) and

-[Template Language Reference](https://freemarker.apache.org/docs/ref.html).

-

-### JSON Generator Files

-The JSON generator files must reside in the `generatorDirectory`. For the default

-configuration, this is: `src/main/freemarker/generator/generator`.

-

-For each JSON generator file, freemarker-maven-plugin will generate a file under the outputDirectory.

-The name of the generated file will be based on the name of the JSON data file. For example,

-the following JSON file: 

-```

-    <sourceDirectory>/data/my/package/MyClass.java.json

-```

-will result in the following file being generated:

-```

-    <outputDirectory>/my/package/MyClass.java

-```

-

-This plugin parses the JSON generator file's `dataModel` field into a `Map<String, Object>` instance (hereafter, referred

-to as the data model). If the dataModel field is empty, an empty map will be created.

-

-Here are some additional details you need to know.

-

-  - This plugin *requires* one top-level field in the JSON data file: `templateName`. This field is used to locate the template file under `<sourceDirectory>/template` that is used to generate the file. This plugin provides the data model to FreeMarker as the data model to process the template identified by `templateName`.

-  - The parser allows for comments.

-  - This plugin currently assumes that the JSON data file encoded using UTF-8.

-

-Here is an example JSON data file:

-```json

-{

-  // An end-of-line comment.

-  # Another end-of-line comment

-  "templateName": "my-template.ftl", #Required

-  "dataModel": { #Optional

-      /* A multi-line

-         comment */

-      "myString": "a string",

-      "myNumber": 1,

-      "myListOfStrings": ["s1", "s2"],

-      "myListOfNumbers": [1, 2],

-      "myMap": {

-        "key1": "value1",

-        "key2": 2

-      }

-  }

-}

-```

-

-### Using POM Properties During Generation

-After parsing the JSON file, the plugin will add

-a `pomProperties` entry into the data model, which is a map itself, that contains the properties defined in the pom. Thus, your template can reference the pom property `my_property` using `${pomProperties.my_property}`. If you have a period or dash in the property name, use `${pomProperties["my.property"]}`.

-

-

-

-### FreeMarker Configuration

-

-Typically, users of this plugin do not need to mess with the FreeMarker configuration. This plugin explicitly sets two FreeMarker configurations:

-

- 1. the default encoding is set to UTF-8

- 2. the template loader is set to be a FileTemplateLoader that reads from `templateDirectory`.

- 

-If you need to override these configs or set your own, you can put them in a 

-`<sourceDirectory>/freemarker.properties` file. If that file exists, this plugin will read it into a java Properties instance and pass it to freemarker.core.Configurable.setSettings() to establish the FreeMarker configuration. See this [javadoc](https://freemarker.apache.org/docs/api/freemarker/template/Configuration.html#setSetting-java.lang.String-java.lang.String-) for configuration details.

-

-

-### Incremental Builds

-This plugin supports incremental builds; it only generates sources if the generator file, template file, or pom file have timestamps newer than any existing output file.  To force a rebuild if these conditions are not met (for example, if you pass in a model parameter on the command line), first run `mvn clean`.

-

-## Code Coverage

-

-By default, the code coverage report is not generated. It is generated by screwdriver jobs. You can generate code coverage on your dev machine with the following maven command:

-```bash

-mvn clean initialize -Dclover-phase=initialize 

-``` 

-Bring up the coverage report by pointing your browser to target/site/clover/dashboard.html under the root directory of the local repository.

-

-

-Licensing

----------

-

-Apache FreeMarker Generator is licensed under the Apache License, Version 2.0.

-

-See the LICENSE file for more details!

+Apache FreeMarker Generator
+=============================================================================
+
+For documentation or to report bugs visit: [https://freemarker.apache.org](https://freemarker.apache.org)
+
+
+Regarding pull requests on Github
+-----------------------------------------------------------------------------
+
+By sending a pull request you grant the Apache Software Foundation
+sufficient rights to use and release the submitted work under the
+Apache license. You grant the same rights (copyright license, patent
+license, etc.) to the Apache Software Foundation as if you have signed
+a [Contributor License Agreement](https://www.apache.org/dev/new-committers-guide.html#cla).
+For contributions that are judged to be non-trivial, you will be asked
+to actually signing a Contributor License Agreement.
+
+
+What is Apache FreeMarker Generator?
+-----------------------------------------------------------------------------
+
+FreeMarker Generator is a set of tools that generates files based on FreeMarker
+templates and data that's typically provided in files (such as JSON files) as
+well. It can be used to generated source code, configuration files, etc.
+
+Currently it can be invoked as a 
+
+* Command-line interface `freemarker-generator-cli`
+* Maven plug-in `freemarker-generator-maven-plugin`
+
+
+Licensing
+-----------------------------------------------------------------------------
+
+Apache FreeMarker Generator is licensed under the Apache License, Version 2.0.
+
+See the LICENSE file for more details!
diff --git a/freemarker-generator-base/LICENSE b/freemarker-generator-base/LICENSE
new file mode 100644
index 0000000..1121eba
--- /dev/null
+++ b/freemarker-generator-base/LICENSE
@@ -0,0 +1,223 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================
+
+The source code contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
+
+  src/main/misc/overloadedNumberRules/prices.ods
+  src/manual/en_US/docgen-originals/figures/overview.odg
+  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
+  src/manual/en_US/favicon.png
+  src/manual/en_US/figures/model2sketch.png
+  src/manual/en_US/figures/overview.png
+  src/manual/en_US/figures/tree.png
+  src/manual/en_US/logo.png
+  src/manual/zh_CN/favicon.png
+  src/manual/zh_CN/figures/model2sketch.png
+  src/manual/zh_CN/figures/overview.png
+  src/manual/zh_CN/figures/tree.png
+  src/manual/zh_CN/logo.png
diff --git a/freemarker-generator-base/NOTICE b/freemarker-generator-base/NOTICE
new file mode 100644
index 0000000..c27f50e
--- /dev/null
+++ b/freemarker-generator-base/NOTICE
@@ -0,0 +1,5 @@
+Apache FreeMarker Site
+Copyright 2020 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/freemarker-generator-base/README.md b/freemarker-generator-base/README.md
new file mode 100644
index 0000000..9dd180d
--- /dev/null
+++ b/freemarker-generator-base/README.md
@@ -0,0 +1,9 @@
+# Overview
+
+This module provides common functionality for `freemarker-generator-cli` and `freemarker-generator-maven-plugin` such as
+
+* Various implementation of `DataSources`
+* Implementation of `Document` and utitity methods
+* Creating `Documents` 
+
+The code actually does not depend on Apache FreeMarker since it useful for other command line tools as well.
\ No newline at end of file
diff --git a/freemarker-generator-base/pom.xml b/freemarker-generator-base/pom.xml
new file mode 100644
index 0000000..6b4cb5b
--- /dev/null
+++ b/freemarker-generator-base/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.freemarker.generator</groupId>
+        <artifactId>freemarker-generator</artifactId>
+        <version>0.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>freemarker-generator-base</artifactId>
+    <name>Apache FreeMarker Generator: Base</name>
+    <description>Common functionality</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>javax.activation</groupId>
+            <artifactId>activation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+        <!-- Testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>*.md</exclude>
+                        <exclude>**/*.csv</exclude>
+                        <exclude>src/test/data/txt/file_01.txt</exclude>
+                      </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </reporting>
+
+</project>
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
new file mode 100644
index 0000000..ab6a11f
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
@@ -0,0 +1,71 @@
+package org.apache.freemarker.generator.base;
+
+import java.nio.charset.Charset;
+import java.util.Locale;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Locale.US;
+
+/**
+ * Capture the various constants used within the project.
+ */
+public class FreeMarkerConstants {
+
+    private FreeMarkerConstants() {
+    }
+
+    /** Content type for binary data */
+    public static final String APPLICATION_OCTET_STREAM = "application/octet-stream";
+
+    /** Unknown length for a <code>Document </code> */
+    public static final int DOCUMENT_UNKNOWN_LENGTH = -1;
+
+    /** Default locale for rendering templates */
+    public static final Locale DEFAULT_LOCALE = US;
+
+    /* Default encoding for textual content */
+    public static final Charset DEFAULT_CHARSET = UTF_8;
+
+    public static class Configuration {
+
+        private Configuration() {
+        }
+
+        /** Prefix to extract tools from 'freemarker-cli.properties' */
+        public static final String TOOLS_PREFIX = "freemarker.tools.";
+
+        /** Key for reading the configured locale from 'freemarker-cli.properties' */
+        public static final String LOCALE_KEY = "freemarker.configuration.setting.locale";
+
+        /** Prefix to extract FreeMarker configuration settings from 'freemarker-cli.properties' */
+        public static final String SETTING_PREFIX = "freemarker.configuration.setting.";
+    }
+
+    public static class Location {
+
+        private Location() {
+        }
+
+        public static final String BYTES = "bytes";
+        public static final String INTERACTIVE = "interactive";
+        public static final String INPUTSTREAM = "inputstream";
+        public static final String STDIN = "stdin";
+        public static final String STRING = "string";
+        public static final String URL = "url";
+    }
+
+    public static class Model {
+
+        private Model() {
+        }
+
+        public static final String DOCUMENTS = "Documents";
+
+        public static final String FREEMARKER_CLI_ARGS = "freemarker.cli.args";
+        public static final String FREEMARKER_LOCALE = "freemarker.locale";
+        public static final String FREEMARKER_WRITER = "freemarker.writer";
+        public static final String FREEMARKER_TEMPLATE_DIRECTORIES = "freemarker.template.directories";
+        public static final String FREEMARKER_USER_SYSTEM_PROPERTIES = "freemarker.user.system.properties";
+        public static final String FREEMARKER_USER_PARAMETERS = "freemarker.user.parameters";
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/ByteArrayDataSource.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/ByteArrayDataSource.java
new file mode 100644
index 0000000..619f667
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/ByteArrayDataSource.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.freemarker.generator.base.activation;
+
+import javax.activation.DataSource;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.APPLICATION_OCTET_STREAM;
+
+public class ByteArrayDataSource implements DataSource {
+
+    private final String name;
+    private final byte[] content;
+    private final String contentType;
+
+    public ByteArrayDataSource(String name, byte[] content) {
+        this(name, content, APPLICATION_OCTET_STREAM);
+    }
+
+    public ByteArrayDataSource(String name, byte[] content, String contentType) {
+        this.name = requireNonNull(name);
+        this.content = requireNonNull(content);
+        this.contentType = requireNonNull(contentType);
+    }
+
+    @Override
+    public InputStream getInputStream() {
+        return new ByteArrayInputStream(content);
+    }
+
+    @Override
+    public OutputStream getOutputStream() {
+        return null;
+    }
+
+    @Override
+    public String getContentType() {
+        return contentType;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return "ByteArrayDataSource{" +
+                "name='" + name + '\'' +
+                ", contentType=" + contentType +
+                ", length=" + content.length +
+                '}';
+    }
+
+    public byte[] getContent() {
+        return content;
+    }
+
+    public long length() {
+        return content.length;
+    }
+}
\ No newline at end of file
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/InputStreamDataSource.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/InputStreamDataSource.java
new file mode 100644
index 0000000..da5f6bd
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/InputStreamDataSource.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.activation;
+
+import javax.activation.DataSource;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.APPLICATION_OCTET_STREAM;
+
+/**
+ * Wraps an InputStream into a DataSource. Please note that the input stream
+ * is not buffered and can be consumed only once to support streaming of
+ * arbitrary large amount of data.
+ */
+public class InputStreamDataSource implements DataSource {
+
+    private final String name;
+    private final InputStream is;
+    private final String contentType;
+
+    public InputStreamDataSource(String name, InputStream is) {
+        this(name, is, APPLICATION_OCTET_STREAM);
+    }
+
+    public InputStreamDataSource(String name, InputStream is, String contentType) {
+        this.name = requireNonNull(name);
+        this.is = requireNonNull(is);
+        this.contentType = requireNonNull(contentType);
+    }
+
+    @Override
+    public InputStream getInputStream() {
+        return is;
+    }
+
+    @Override
+    public OutputStream getOutputStream() {
+        return null;
+    }
+
+    @Override
+    public String getContentType() {
+        return contentType;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return "InputStreamDataSource{" +
+                "name='" + name + '\'' +
+                ", contentType='" + contentType + '\'' +
+                ", inputStream=" + is.getClass().getName() +
+                '}';
+    }
+}
+
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/StringDataSource.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/StringDataSource.java
new file mode 100644
index 0000000..7e9c29d
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/activation/StringDataSource.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.activation;
+
+import javax.activation.DataSource;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+public class StringDataSource implements DataSource {
+
+    private final String name;
+    private final String content;
+    private final Charset charset;
+
+    public StringDataSource(String name, String content) {
+        this(name, content, UTF_8);
+    }
+
+    public StringDataSource(String name, String content, Charset charset) {
+        this.name = requireNonNull(name);
+        this.content = requireNonNull(content);
+        this.charset = requireNonNull(charset);
+    }
+
+    @Override
+    public InputStream getInputStream() {
+        return new ByteArrayInputStream(content.getBytes(charset));
+    }
+
+    @Override
+    public OutputStream getOutputStream() {
+        return null;
+    }
+
+    @Override
+    public String getContentType() {
+        return "plain/text";
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public Charset getCharset() {
+        return charset;
+    }
+
+    public long length() {
+        return content.length();
+    }
+
+    @Override
+    public String toString() {
+        return "StringDataSource{" +
+                "name='" + name + '\'' +
+                ", charset=" + charset +
+                ", length=" + content.length() +
+                '}';
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Document.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Document.java
new file mode 100644
index 0000000..6fddd42
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Document.java
@@ -0,0 +1,220 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.document;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.LineIterator;
+import org.apache.freemarker.generator.base.activation.ByteArrayDataSource;
+import org.apache.freemarker.generator.base.activation.StringDataSource;
+import org.apache.freemarker.generator.base.util.CloseableReaper;
+
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.charset.Charset;
+import java.util.List;
+
+import static java.nio.charset.Charset.forName;
+import static java.util.Objects.requireNonNull;
+import static org.apache.commons.io.IOUtils.lineIterator;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.DOCUMENT_UNKNOWN_LENGTH;
+
+/**
+ * Source document which encapsulates a data source. When accessing
+ * content it is loaded on demand on not kept in memory to allow
+ * processing of large volumes of data.
+ */
+public class Document implements Closeable {
+
+    /** Human-readable name of the document */
+    private final String name;
+
+    /** Charset for directly accessing text-based content */
+    private final Charset charset;
+
+    /** The data source */
+    private final DataSource dataSource;
+
+    /** The location of the content, e.g. file name */
+    private final String location;
+
+    /** Collect all closables handed out to the caller to be closed when the document is closed itself */
+    private final CloseableReaper closables;
+
+    public Document(String name, DataSource dataSource, String location, Charset charset) {
+        this.name = requireNonNull(name);
+        this.dataSource = requireNonNull(dataSource);
+        this.location = requireNonNull(location);
+        this.charset = requireNonNull(charset);
+        this.closables = new CloseableReaper();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getBaseName() {
+        return FilenameUtils.getBaseName(name);
+    }
+
+    public String getExtension() {
+        return FilenameUtils.getExtension(name);
+    }
+
+    public Charset getCharset() {
+        return charset;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    /**
+     * Try to get the length lazily, efficient and without consuming the input stream.
+     *
+     * @return Length of document or UNKNOWN_LENGTH
+     */
+    public long getLength() {
+        if (dataSource instanceof FileDataSource) {
+            return ((FileDataSource) dataSource).getFile().length();
+        } else if (dataSource instanceof StringDataSource) {
+            return ((StringDataSource) dataSource).length();
+        } else if (dataSource instanceof ByteArrayDataSource) {
+            return ((ByteArrayDataSource) dataSource).length();
+        } else {
+            return DOCUMENT_UNKNOWN_LENGTH;
+        }
+    }
+
+    /**
+     * Get an input stream which is closed together with this document.
+     *
+     * @return InputStream
+     * @throws IOException Operation failed
+     */
+    public InputStream getInputStream() throws IOException {
+        return closables.add(getUnsafeInputStream());
+    }
+
+    /**
+     * Get an input stream which needs to be closed by the caller.
+     *
+     * @return InputStream
+     * @throws IOException Operation failed
+     */
+    public InputStream getUnsafeInputStream() throws IOException {
+        return dataSource.getInputStream();
+    }
+
+    public String getText() throws IOException {
+        return getText(getCharset().name());
+    }
+
+    public String getText(String charsetName) throws IOException {
+        final StringWriter writer = new StringWriter();
+        try (InputStream is = getUnsafeInputStream()) {
+            IOUtils.copy(is, writer, forName(charsetName));
+            return writer.toString();
+        }
+    }
+
+    /**
+     * Gets the contents of an <code>InputStream</code> as a list of Strings,
+     * one entry per line, using the specified character encoding.
+     *
+     * @return the list of Strings, never null
+     * @throws IOException if an I/O error occurs
+     */
+    public List<String> getLines() throws IOException {
+        return getLines(getCharset().name());
+    }
+
+    /**
+     * Gets the contents of an <code>InputStream</code> as a list of Strings,
+     * one entry per line, using the specified character encoding.
+     *
+     * @param charsetName The name of the requested charset
+     * @return the list of Strings, never null
+     * @throws IOException if an I/O error occurs
+     */
+    public List<String> getLines(String charsetName) throws IOException {
+        try (InputStream inputStream = getUnsafeInputStream()) {
+            return IOUtils.readLines(inputStream, charsetName);
+        }
+    }
+
+    /**
+     * Returns an Iterator for the lines in an <code>InputStream</code>, using
+     * the default character encoding specified. The caller is responsible to close
+     * the line iterator.
+     *
+     * @return line iterator
+     * @throws IOException if an I/O error occurs
+     */
+    public LineIterator getLineIterator() throws IOException {
+        return getLineIterator(getCharset().name());
+    }
+
+    /**
+     * Returns an Iterator for the lines in an <code>InputStream</code>, using
+     * the character encoding specified.
+     *
+     * @param charsetName The name of the requested charset
+     * @return line iterator
+     * @throws IOException if an I/O error occurs
+     */
+    public LineIterator getLineIterator(String charsetName) throws IOException {
+        return closables.add(lineIterator(getUnsafeInputStream(), forName(charsetName)));
+    }
+
+    public byte[] getBytes() throws IOException {
+        try (InputStream inputStream = getUnsafeInputStream()) {
+            return IOUtils.toByteArray(inputStream);
+        }
+    }
+
+    /**
+     * Some tools create a {@link java.io.Closeable} which can bound to the
+     * lifecycle of the document. When the document is closed all the bound
+     * {@link java.io.Closeable} are closed as well.
+     *
+     * @param closeable Closable
+     * @param <T>       Type of closable
+     * @return Closable
+     */
+    public <T extends Closeable> T addClosable(T closeable) {
+        return closables.add(closeable);
+    }
+
+    @Override
+    public void close() {
+        closables.close();
+    }
+
+    @Override
+    public String toString() {
+        return "Document{" +
+                "name='" + name + '\'' +
+                ", location=" + location +
+                ", charset='" + charset + '\'' +
+                '}';
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentFactory.java
new file mode 100644
index 0000000..de4ed51
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentFactory.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.document;
+
+import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
+import org.apache.freemarker.generator.base.activation.ByteArrayDataSource;
+import org.apache.freemarker.generator.base.activation.InputStreamDataSource;
+import org.apache.freemarker.generator.base.activation.StringDataSource;
+
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.activation.URLDataSource;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.charset.Charset;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+/**
+ * Creates a document from various sources.
+ */
+public class DocumentFactory {
+
+    private DocumentFactory() {
+    }
+
+    public static Document create(URL url) {
+        final String location = url.getProtocol() + "://" + url.getHost();
+        final URLDataSource dataSource = new URLDataSource(url);
+        return create(url.getHost(), dataSource, location, UTF_8);
+    }
+
+    public static Document create(String name, String content) {
+        final StringDataSource dataSource = new StringDataSource(name, content, UTF_8);
+        return create(name, dataSource, Location.STRING, UTF_8);
+    }
+
+    public static Document create(File file, Charset charset) {
+        final FileDataSource dataSource = new FileDataSource(file);
+        return create(file.getName(), dataSource, file.getAbsolutePath(), charset);
+    }
+
+    public static Document create(String name, byte[] content) {
+        final ByteArrayDataSource dataSource = new ByteArrayDataSource(name, content);
+        return create(name, dataSource, Location.BYTES, UTF_8);
+    }
+
+    public static Document create(String name, InputStream is, Charset charset) {
+        final InputStreamDataSource dataSource = new InputStreamDataSource(name, is);
+        return create(name, dataSource, Location.INPUTSTREAM, charset);
+    }
+
+    public static Document create(String name, InputStream is, String location, Charset charset) {
+        final InputStreamDataSource dataSource = new InputStreamDataSource(name, is);
+        return create(name, dataSource, location, charset);
+    }
+
+    public static Document create(String name, DataSource dataSource, String location, Charset charset) {
+        return new Document(name, dataSource, location, charset);
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Documents.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Documents.java
new file mode 100644
index 0000000..c1c4680
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Documents.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.document;
+
+import org.apache.freemarker.generator.base.util.ClosableUtils;
+
+import java.io.Closeable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import static java.util.stream.Collectors.toList;
+import static org.apache.commons.io.FilenameUtils.wildcardMatch;
+
+/**
+ * Container for documents with a couple of convenience functions to select
+ * a subset of documents.
+ */
+public class Documents implements Closeable {
+
+    private final List<Document> documents;
+
+    public Documents(Collection<Document> documents) {
+        this.documents = new ArrayList<>(documents);
+    }
+
+    /**
+     * Get the names of all documents.
+     *
+     * @return document names
+     */
+    public List<String> getNames() {
+        return documents.stream()
+                .map(Document::getName)
+                .collect(toList());
+    }
+
+    public int size() {
+        return documents.size();
+    }
+
+    public boolean isEmpty() {
+        return documents.isEmpty();
+    }
+
+    public Document getFirst() {
+        return documents.get(0);
+    }
+
+    public List<Document> getList() {
+        return new ArrayList<>(documents);
+    }
+
+    public Document get(int index) {
+        return documents.get(index);
+    }
+
+    public boolean add(Document document) {
+        return documents.add(document);
+    }
+
+    public Document remove(int index) {
+        return documents.remove(index);
+    }
+
+    /**
+     * Get exactly one document. If not exactly one document
+     * is found an exception is thrown.
+     *
+     * @param name name of the document
+     * @return document
+     */
+    public Document get(String name) {
+        final List<Document> list = find(name);
+
+        if (list.isEmpty()) {
+            throw new IllegalArgumentException("Document not found : " + name);
+        }
+
+        if (list.size() > 1) {
+            throw new IllegalArgumentException("More than one document found : " + name);
+        }
+
+        return list.get(0);
+    }
+
+    /**
+     * Find document based on theit name and globbing pattern.
+     *
+     * @param wildcard globbing pattern
+     * @return list of mathching documents
+     */
+    public List<Document> find(String wildcard) {
+        return documents.stream()
+                .filter(d -> wildcardMatch(d.getName(), wildcard))
+                .collect(toList());
+    }
+
+    @Override
+    public void close() {
+        documents.forEach(ClosableUtils::closeQuietly);
+    }
+
+    @Override
+    public String toString() {
+        return "Documents{" +
+                "documents=" + documents +
+                '}';
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentsSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentsSupplier.java
new file mode 100644
index 0000000..e4b85a9
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentsSupplier.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.document;
+
+import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static java.util.Collections.singletonList;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * Create a list of <code>Document</code> based on a list of sources consisting of
+ * URLs, directories and files.
+ */
+public class DocumentsSupplier implements Supplier<List<Document>> {
+
+    /** List of source files and/or directories */
+    private final Collection<String> sources;
+
+    /** Optional include pattern for resolving source files or directory */
+    private final String include;
+
+    /** Optional exclude pattern for resolving source files or directory */
+    private final String exclude;
+
+    /** The charset for loading text files */
+    private final Charset charset;
+
+    /**
+     * Constructor.
+     *
+     * @param sources List of source files and/or directories
+     * @param include Optional include pattern for resolving source files or directory
+     * @param charset The charset for loading text files
+     */
+    public DocumentsSupplier(Collection<String> sources, String include, String exclude, Charset charset) {
+        this.sources = new ArrayList<>(sources);
+        this.include = include;
+        this.exclude = exclude;
+        this.charset = requireNonNull(charset);
+    }
+
+    @Override
+    public List<Document> get() {
+        return sources.stream()
+                .map(this::get)
+                .flatMap(Collection::stream)
+                .collect(toList());
+    }
+
+    private List<Document> get(String source) {
+        if (isHttpUrl(source)) {
+            return singletonList(resolveHttpUrl(source));
+        } else {
+            return resolveFile(source, include, exclude, charset);
+        }
+    }
+
+    private static Document resolveHttpUrl(String url) {
+        return DocumentFactory.create(toUrl(url));
+    }
+
+    private static List<Document> resolveFile(String source, String include, String exclude, Charset charset) {
+        return fileResolver(source, include, exclude).get().stream()
+                .map(file -> DocumentFactory.create(file, charset))
+                .collect(toList());
+    }
+
+    private static RecursiveFileSupplier fileResolver(String source, String include, String exclude) {
+        return new RecursiveFileSupplier(singletonList(source), singletonList(include), singletonList(exclude));
+    }
+
+    private static boolean isHttpUrl(String value) {
+        return value.startsWith("http://") || value.startsWith("https://");
+    }
+
+    private static URL toUrl(String value) {
+        try {
+            return new URL(value);
+        } catch (MalformedURLException e) {
+            throw new IllegalArgumentException(value, e);
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesClassPathSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesClassPathSupplier.java
new file mode 100644
index 0000000..5a1e8d6
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesClassPathSupplier.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.file;
+
+import org.apache.freemarker.generator.base.util.PropertiesFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.function.Supplier;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Resolve a given properties file from the classpath.
+ */
+public class PropertiesClassPathSupplier implements Supplier<Properties> {
+
+    private final String fileName;
+
+    public PropertiesClassPathSupplier(String fileName) {
+        this.fileName = requireNonNull(fileName);
+    }
+
+    @Override
+    public Properties get() {
+        try {
+            return resolve(fileName);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to supply properties file:" + fileName);
+        }
+    }
+
+    private static Properties resolve(String fileName) throws IOException {
+        final InputStream is = PropertiesClassPathSupplier.class.getResourceAsStream(resourceName(fileName));
+
+        if (is == null) {
+            return null;
+        }
+
+        try {
+            return PropertiesFactory.create(is);
+        } finally {
+            is.close();
+        }
+    }
+
+    private static String resourceName(String name) {
+        return name.startsWith("/") ? name : "/" + name;
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesFileSystemSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesFileSystemSupplier.java
new file mode 100644
index 0000000..cac60ec
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesFileSystemSupplier.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.file;
+
+import org.apache.freemarker.generator.base.util.PropertiesFactory;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.function.Supplier;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Resolve a given properties file from the file system.
+ */
+public class PropertiesFileSystemSupplier implements Supplier<Properties> {
+
+    private final String fileName;
+
+    public PropertiesFileSystemSupplier(String fileName) {
+        this.fileName = requireNonNull(fileName);
+    }
+
+    @Override
+    public Properties get() {
+        final File file = new File(fileName);
+
+        if (!file.exists()) {
+            return null;
+        }
+
+        try {
+            try (InputStream is = new FileInputStream(file)) {
+                return PropertiesFactory.create(is);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to load properties file:" + fileName);
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesSupplier.java
new file mode 100644
index 0000000..ac8b2a9
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/PropertiesSupplier.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.file;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.function.Supplier;
+
+import static java.util.Arrays.asList;
+
+/**
+ * Resolve a given properties file using a list of suppliers.
+ */
+public class PropertiesSupplier implements Supplier<Properties> {
+
+    private final List<Supplier<Properties>> suppliers;
+
+    @SafeVarargs
+    public PropertiesSupplier(Supplier<Properties>... suppliers) {
+        this.suppliers = asList(suppliers);
+    }
+
+    @Override
+    public Properties get() {
+        return this.suppliers.stream()
+                .map(Supplier::get)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .orElse(null);
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java
new file mode 100644
index 0000000..097e17d
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.file;
+
+import org.apache.commons.io.filefilter.AndFileFilter;
+import org.apache.commons.io.filefilter.IOFileFilter;
+import org.apache.commons.io.filefilter.NotFileFilter;
+import org.apache.commons.io.filefilter.OrFileFilter;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+import static java.util.stream.Collectors.toList;
+import static org.apache.commons.io.FileUtils.listFiles;
+import static org.apache.commons.io.filefilter.HiddenFileFilter.HIDDEN;
+import static org.apache.commons.io.filefilter.HiddenFileFilter.VISIBLE;
+import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
+
+/**
+ * Resolve a list of files or directories recursively.
+ *
+ * <ul>
+ *     <li>Matching a list of include patterns</li>
+ *     <li>Matching a list of exclude patterns</li>
+ *     <li>Ignoring invisible files and directories</li>
+ * </ul>
+ */
+public class RecursiveFileSupplier implements Supplier<List<File>> {
+
+    /** List of sources containing files and directories */
+    private final Collection<String> sources;
+
+    /** File filter to apply */
+    private final IOFileFilter fileFilter;
+
+    /** Diectory filter to apply */
+    private final IOFileFilter directoryFilter;
+
+    public RecursiveFileSupplier(Collection<String> sources, Collection<String> includes, Collection<String> excludes) {
+        this.sources = sources;
+        this.fileFilter = fileFilter(includes, excludes);
+        this.directoryFilter = directoryFilter();
+    }
+
+    @Override
+    public List<File> get() {
+        if (sources == null || sources.isEmpty()) {
+            return emptyList();
+        }
+
+        return sources.stream()
+                .map(this::resolve)
+                .flatMap(Collection::stream)
+                .collect(toList());
+    }
+
+    private List<File> resolve(String source) {
+        final File file = new File(source);
+
+        if (file.isFile()) {
+            return resolveFile(file);
+        } else if (file.isDirectory()) {
+            return new ArrayList<>(resolveDirectory(file));
+        } else {
+            throw new IllegalArgumentException("Unable to find source: " + source);
+        }
+    }
+
+    private List<File> resolveFile(File file) {
+        return fileFilter.accept(file) ? singletonList(file) : emptyList();
+    }
+
+    private List<File> resolveDirectory(File directory) {
+        return new ArrayList<>(listFiles(directory, fileFilter, directoryFilter));
+    }
+
+    private static IOFileFilter fileFilter(Collection<String> includes, Collection<String> excludes) {
+        final List<IOFileFilter> fileFilters = new ArrayList<>();
+        fileFilters.addAll(includeFilters(includes));
+        fileFilters.addAll(excludeFilters(excludes));
+        return new AndFileFilter(fileFilters);
+    }
+
+    private static List<IOFileFilter> includeFilters(Collection<String> includes) {
+        if (includes == null || includes.isEmpty()) {
+            return emptyList();
+        }
+
+        return includes.stream().map(RecursiveFileSupplier::includeFilter).collect(toList());
+    }
+
+    private static IOFileFilter includeFilter(String include) {
+        return isEmpty(include) ? VISIBLE : new AndFileFilter(new WildcardFileFilter(include), VISIBLE);
+    }
+
+    private static List<IOFileFilter> excludeFilters(Collection<String> excludes) {
+        if (excludes == null || excludes.isEmpty()) {
+            return emptyList();
+        }
+
+        return excludes.stream().map(RecursiveFileSupplier::exludeFilter).collect(toList());
+    }
+
+    private static IOFileFilter exludeFilter(String exclude) {
+        return isEmpty(exclude) ?
+                VISIBLE :
+                new NotFileFilter(new OrFileFilter(new WildcardFileFilter(exclude), HIDDEN));
+    }
+
+    private static IOFileFilter directoryFilter() {
+        return VISIBLE;
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/tools/ToolsFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/tools/ToolsFactory.java
new file mode 100644
index 0000000..b8eacc1
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/tools/ToolsFactory.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.tools;
+
+import java.lang.reflect.Constructor;
+import java.util.Map;
+
+import static java.util.Arrays.stream;
+import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
+
+public class ToolsFactory {
+
+    /**
+     * Checks if the given class can be loaded from the class loader.
+     *
+     * @param clazzName Class to instantiate
+     * @return true if loaded
+     */
+    public static boolean exists(String clazzName) {
+        if (isEmpty(clazzName)) {
+            return false;
+        }
+
+        try {
+            return forName(clazzName) != null;
+        } catch (NoClassDefFoundError | ClassNotFoundException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Create a tool instance either using single argument constructor taking a map or
+     * the default constructor.
+     *
+     * @param clazzName Class to instantiate
+     * @param settings  Settings used to configure the tool
+     * @return Tool instance
+     */
+    public static Object create(String clazzName, Map<String, Object> settings) {
+        try {
+            final Class<?> clazz = Class.forName(clazzName);
+            final Constructor<?>[] constructors = clazz.getConstructors();
+            final Constructor<?> constructorWithSettings = findSingleParameterConstructor(constructors, Map.class);
+            final Constructor<?> defaultConstructor = findDefaultConstructor(constructors);
+            return constructorWithSettings != null ? constructorWithSettings.newInstance(settings) : defaultConstructor.newInstance();
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to create tool: " + clazzName, e);
+        }
+    }
+
+    private static Constructor<?> findSingleParameterConstructor(Constructor<?>[] constructors, Class<?> parameterClazz) {
+        return stream(constructors)
+                .filter(c -> c.getParameterCount() == 1 && c.getParameterTypes()[0].equals(parameterClazz))
+                .findFirst()
+                .orElse(null);
+    }
+
+    private static Constructor<?> findDefaultConstructor(Constructor<?>[] constructors) {
+        return stream(constructors)
+                .filter(c -> c.getParameterCount() == 0)
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * Similar to {@link Class#forName(java.lang.String)}, but attempts to load
+     * through the thread context class loader. Only if thread context class
+     * loader is inaccessible, or it can't find the class will it attempt to
+     * fall back to the class loader that loads the FreeMarker classes.
+     */
+    private static Class<?> forName(String className) throws ClassNotFoundException {
+        try {
+            final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+            if (contextClassLoader != null) {  // not null: we don't want to fall back to the bootstrap class loader
+                return Class.forName(className, true, contextClassLoader);
+            }
+        } catch (ClassNotFoundException | SecurityException e) {
+            ;// Intentionally ignored
+        }
+
+        // Fall back to the defining class loader of the FreeMarker classes
+        return Class.forName(className);
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/CachingSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/CachingSupplier.java
new file mode 100644
index 0000000..fbada67
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/CachingSupplier.java
@@ -0,0 +1,21 @@
+package org.apache.freemarker.generator.base.util;
+
+import java.util.function.Supplier;
+
+public class CachingSupplier<T> implements Supplier<T> {
+
+    private T cachedValue;
+    private final Supplier<T> supplier;
+
+    public CachingSupplier(Supplier<T> supplier) {
+        this.supplier = supplier;
+    }
+
+    @Override
+    public synchronized T get() {
+        if (cachedValue == null) {
+            cachedValue = supplier.get();
+        }
+        return cachedValue;
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/ClosableUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/ClosableUtils.java
new file mode 100644
index 0000000..dfefc01
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/ClosableUtils.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.util;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+public class ClosableUtils {
+
+    public static void closeQuietly(final Closeable closeable) {
+        try {
+            if (closeable != null) {
+                closeable.close();
+            }
+        } catch (final IOException e) {
+            // e.printStackTrace();
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/CloseableReaper.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/CloseableReaper.java
new file mode 100644
index 0000000..fb56abe
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/CloseableReaper.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.util;
+
+import java.io.Closeable;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Keep track of closables created on behalf of the client to close
+ * them all later on.
+ */
+public class CloseableReaper implements Closeable {
+
+    private final List<WeakReference<Closeable>> closeables = new ArrayList<>();
+
+    public synchronized <T extends Closeable> T add(T closeable) {
+        if (closeable != null) {
+            closeables.add(new WeakReference<>(closeable));
+        }
+        return closeable;
+    }
+
+    @Override
+    public synchronized void close() {
+        closeables.forEach(c -> ClosableUtils.closeQuietly(c.get()));
+        closeables.clear();
+    }
+}
+
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/LocaleUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/LocaleUtils.java
new file mode 100644
index 0000000..5edd405
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/LocaleUtils.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.util;
+
+import java.util.Locale;
+
+import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
+
+public class LocaleUtils {
+
+    public static Locale parseLocale(String value) {
+        if (isEmpty(value) || value.equalsIgnoreCase("JVM default") || value.equalsIgnoreCase("default")) {
+            return Locale.getDefault();
+        }
+
+        final String[] parts = value.split("_");
+        return parts.length == 1 ? new Locale(parts[0]) : new Locale(parts[0], parts[1]);
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/NonClosableWriterWrapper.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/NonClosableWriterWrapper.java
new file mode 100644
index 0000000..e2637b7
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/NonClosableWriterWrapper.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.util;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Wraps a writer (usually the internal FreeMarker's writer instance
+ * and avoids closing it since this would crash FreeMarker. E.g. the
+ * Commons CSV integration uses the FreeMarker writer directly but
+ * some implementation could call "CSVPrinter#close"
+ */
+public class NonClosableWriterWrapper extends Writer {
+
+    private final Writer delegate;
+
+    public NonClosableWriterWrapper(Writer delegate) {
+        this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public void write(int c) throws IOException {
+        delegate.write(c);
+    }
+
+    @Override
+    public void write(char[] cbuf) throws IOException {
+        delegate.write(cbuf);
+    }
+
+    @Override
+    public void write(char[] cbuf, int off, int len) throws IOException {
+        delegate.write(cbuf, off, len);
+    }
+
+    @Override
+    public void write(String str) throws IOException {
+        delegate.write(str);
+    }
+
+    @Override
+    public void write(String str, int off, int len) throws IOException {
+        delegate.write(str, off, len);
+    }
+
+    @Override
+    public Writer append(CharSequence csq) throws IOException {
+        return delegate.append(csq);
+    }
+
+    @Override
+    public Writer append(CharSequence csq, int start, int end) throws IOException {
+        return delegate.append(csq, start, end);
+    }
+
+    @Override
+    public Writer append(char c) throws IOException {
+        return delegate.append(c);
+    }
+
+    @Override
+    public void flush() throws IOException {
+        delegate.flush();
+    }
+
+    @Override
+    public void close() {
+        // ignore
+    }
+
+    @Override
+    public String toString() {
+        return delegate.toString();
+    }
+
+    public Writer getDelegate() {
+        return delegate;
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/PropertiesFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/PropertiesFactory.java
new file mode 100644
index 0000000..e3ad2eb
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/PropertiesFactory.java
@@ -0,0 +1,29 @@
+package org.apache.freemarker.generator.base.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.util.Properties;
+
+public class PropertiesFactory {
+
+    public static Properties create(InputStream is) {
+        try {
+            final Properties properties = new Properties();
+            properties.load(is);
+            return properties;
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to load properties file", e);
+        }
+    }
+
+    public static Properties create(String value) {
+        try (StringReader reader = new StringReader(value)) {
+            final Properties properties = new Properties();
+            properties.load(reader);
+            return properties;
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse properties: " + value, e);
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/PropertiesTransformer.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/PropertiesTransformer.java
new file mode 100644
index 0000000..a863b8d
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/PropertiesTransformer.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.util;
+
+import java.util.Properties;
+
+/**
+ * Helper class to transform <code>java.util.Properties</code>
+ */
+public class PropertiesTransformer {
+
+    /**
+     * Create a new <code>java.util.Properties</code> instance having only key with the prefix.
+     *
+     * @param properties the properties
+     * @param prefix     prefix
+     * @return Properties
+     */
+    public static Properties filterKeyPrefix(Properties properties, String prefix) {
+        final Properties result = new Properties();
+        properties.entrySet()
+                .stream()
+                .filter(entry -> entry.getKey().toString().startsWith(prefix))
+                .forEach(entry -> result.put(entry.getKey().toString(), entry.getValue()));
+        return result;
+    }
+
+    /**
+     * Create a new <code>java.util.Properties</code> instance having the key prefix removed.
+     *
+     * @param properties the properties
+     * @param prefix     prefix to be removed from the matching keys
+     * @return Properties
+     */
+    public static Properties removeKeyPrefix(Properties properties, String prefix) {
+        final Properties result = new Properties();
+        properties.forEach((key, value) -> result.put(key.toString().substring(prefix.length()), value));
+        return result;
+    }
+
+    /**
+     * Copy a entries in a new <code>java.util.Properties</code> instance.
+     *
+     * @param properties the properties
+     * @return properties
+     */
+    public static Properties copy(Properties properties) {
+        final Properties result = new Properties();
+        properties.forEach((key, value) -> result.setProperty((String) key, (String) value));
+        return result;
+    }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java
new file mode 100644
index 0000000..769fd06
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.base.util;
+
+public class StringUtils {
+
+    public static boolean isEmpty(String value) {
+        return value == null || value.trim().isEmpty();
+    }
+}
diff --git a/freemarker-generator-base/src/test/data/csv/file_01.csv b/freemarker-generator-base/src/test/data/csv/file_01.csv
new file mode 100644
index 0000000..3f4e701
--- /dev/null
+++ b/freemarker-generator-base/src/test/data/csv/file_01.csv
@@ -0,0 +1,3 @@
+Text;Date;Number;Currency;Time;Percentage;Forumula
+Row 1;01.01.17;100,00;€100,00;10:00;50,00%;50
+Row 2;01.01.17;100,00;€100,00;10:00;50,00%;50
\ No newline at end of file
diff --git a/freemarker-generator-base/src/test/data/csv/file_02.csv b/freemarker-generator-base/src/test/data/csv/file_02.csv
new file mode 100644
index 0000000..5b9518d
--- /dev/null
+++ b/freemarker-generator-base/src/test/data/csv/file_02.csv
@@ -0,0 +1 @@
+Text;Date;Number;Currency;Time;Percentage;Forumula
\ No newline at end of file
diff --git a/freemarker-generator-base/src/test/data/properties/test.properties b/freemarker-generator-base/src/test/data/properties/test.properties
new file mode 100644
index 0000000..6431653
--- /dev/null
+++ b/freemarker-generator-base/src/test/data/properties/test.properties
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+foo=bar
\ No newline at end of file
diff --git a/freemarker-generator-base/src/test/data/txt/file_01.txt b/freemarker-generator-base/src/test/data/txt/file_01.txt
new file mode 100644
index 0000000..ed81d07
--- /dev/null
+++ b/freemarker-generator-base/src/test/data/txt/file_01.txt
@@ -0,0 +1,2 @@
+Hello
+World
\ No newline at end of file
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentFactoryTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentFactoryTest.java
new file mode 100644
index 0000000..172e0c6
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentFactoryTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.document;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+public class DocumentFactoryTest {
+
+    private static final String ANY_TEXT = "Hello World";
+    private static final String ANY_FILE_NAME = "pom.xml";
+    private static final Charset ANY_CHAR_SET = UTF_8;
+    private static final File ANY_FILE = new File(ANY_FILE_NAME);
+
+    @Test
+    public void shouldCreateFileBasedDocument() throws IOException {
+        final Document document = DocumentFactory.create(ANY_FILE, ANY_CHAR_SET);
+
+        assertEquals(ANY_FILE_NAME, document.getName());
+        assertEquals(UTF_8, document.getCharset());
+        assertEquals(ANY_FILE.getAbsolutePath(), document.getLocation());
+        assertTrue(!document.getLines().isEmpty());
+    }
+
+    @Test
+    public void shouldCreateStringBasedDocument() throws IOException {
+        final Document document = DocumentFactory.create("test.txt", ANY_TEXT);
+
+        assertEquals("test.txt", document.getName());
+        assertEquals(UTF_8, document.getCharset());
+        assertEquals("string", document.getLocation());
+        assertEquals(ANY_TEXT, document.getText());
+        assertEquals(1, document.getLines().size());
+    }
+
+    @Test
+    public void shouldCreateByteArrayBasedDocument() throws IOException {
+        final Document document = DocumentFactory.create("test.txt", ANY_TEXT.getBytes(UTF_8));
+
+        assertEquals("test.txt", document.getName());
+        assertEquals(UTF_8, document.getCharset());
+        assertEquals("bytes", document.getLocation());
+        assertEquals(ANY_TEXT, document.getText());
+        assertEquals(1, document.getLines().size());
+    }
+
+    @Test
+    public void shouldCreateInputStreamBasedDocument() throws IOException {
+        final InputStream is = new ByteArrayInputStream(ANY_TEXT.getBytes(UTF_8));
+        final Document document = DocumentFactory.create("test.txt", is, UTF_8);
+
+        assertEquals("test.txt", document.getName());
+        assertEquals(UTF_8, document.getCharset());
+        assertEquals("inputstream", document.getLocation());
+        assertEquals(ANY_TEXT, document.getText());
+    }
+
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentTest.java
new file mode 100644
index 0000000..22d5952
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentTest.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.document;
+
+import org.apache.commons.io.LineIterator;
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.Iterator;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class DocumentTest {
+
+    private static final String ANY_TEXT = "Hello World";
+    private static final String ANY_FILE_NAME = "pom.xml";
+    private static final Charset ANY_CHAR_SET = UTF_8;
+    private static final File ANY_FILE = new File(ANY_FILE_NAME);
+
+    @Test
+    public void shouldSupportTextDocument() throws IOException {
+        try (Document document = DocumentFactory.create("stdin", ANY_TEXT)) {
+            assertEquals("stdin", document.getName());
+            assertEquals("stdin", document.getBaseName());
+            assertEquals("", document.getExtension());
+            assertEquals("string", document.getLocation());
+            assertEquals(UTF_8, document.getCharset());
+            assertTrue(document.getLength() > 0);
+            assertEquals(ANY_TEXT, document.getText());
+        }
+    }
+
+    @Test
+    public void shouldSupportFileDocument() throws IOException {
+        try (Document document = DocumentFactory.create(ANY_FILE, ANY_CHAR_SET)) {
+            assertEquals(ANY_FILE_NAME, document.getName());
+            assertEquals("pom", document.getBaseName());
+            assertEquals("xml", document.getExtension());
+            assertEquals(ANY_FILE.getAbsolutePath(), document.getLocation());
+            assertEquals(Charset.defaultCharset(), document.getCharset());
+            assertTrue(document.getLength() > 0);
+            assertFalse(document.getText().isEmpty());
+        }
+    }
+
+    @Ignore
+    @Test
+    public void shouldSupportUrlDocument() throws IOException {
+        try (Document document = DocumentFactory.create(new URL("https://google.com?foo=bar"))) {
+            assertEquals("google.com", document.getName());
+            assertEquals("google", document.getBaseName());
+            assertEquals("com", document.getExtension());
+            assertEquals("https://google.com", document.getLocation());
+            assertEquals(UTF_8, document.getCharset());
+            assertEquals(-1, document.getLength());
+            assertFalse(document.getText().isEmpty());
+        }
+    }
+
+    @Test
+    public void shouldSupportLineIterator() throws IOException {
+        try (Document document = textDocument()) {
+            try (LineIterator iterator = document.getLineIterator(ANY_CHAR_SET.name())) {
+                assertEquals(1, count(iterator));
+            }
+        }
+    }
+
+    @Test
+    public void shouldReadLines() throws IOException {
+        try (Document document = textDocument()) {
+            assertEquals(1, document.getLines().size());
+            assertEquals(ANY_TEXT, document.getLines().get(0));
+        }
+    }
+
+    @Test
+    public void shouldGetBytes() throws IOException {
+        try (Document document = textDocument()) {
+            assertEquals(11, document.getBytes().length);
+        }
+    }
+
+    @Test
+    public void shouldCloseDocument() {
+        final Document document = textDocument();
+        final TestClosable closable1 = document.addClosable(new TestClosable());
+        final TestClosable closable2 = document.addClosable(new TestClosable());
+
+        document.close();
+
+        assertTrue(closable1.isClosed());
+        assertTrue(closable2.isClosed());
+    }
+
+    private static int count(Iterator<String> iterator) {
+        int count = 0;
+        while (iterator.hasNext()) {
+            count++;
+            iterator.next();
+        }
+        return count;
+    }
+
+    private static Document textDocument() {
+        return DocumentFactory.create("stdin", ANY_TEXT);
+    }
+
+    private static final class TestClosable implements Closeable {
+
+        private boolean closed = false;
+
+        @Override
+        public void close() throws IOException {
+            closed = true;
+        }
+
+        public boolean isClosed() {
+            return closed;
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsSupplierTest.java
new file mode 100644
index 0000000..2a87db1
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsSupplierTest.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.document;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentsSupplier;
+import org.junit.Test;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.List;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class DocumentsSupplierTest {
+
+    private static final String NO_EXCLUDE = null;
+    private static final String ANY_FILE = "./pom.xml";
+    private static final String ANY_DIRECTORY = "./src/test/data";
+
+    @Test
+    public void shouldResolveSingleFile() {
+        assertEquals(1, supplier(ANY_FILE, "*", NO_EXCLUDE).get().size());
+    }
+
+    @Test
+    public void shouldResolveMultipleFiles() {
+        final List<String> sources = Arrays.asList("pom.xml", "README.md");
+        assertEquals(2, supplier(sources, null, null).get().size());
+        assertEquals(2, supplier(sources, "", null).get().size());
+        assertEquals(2, supplier(sources, "*", null).get().size());
+        assertEquals(2, supplier(sources, "*.*", null).get().size());
+        assertEquals(1, supplier(sources, "*.xml", null).get().size());
+        assertEquals(1, supplier(sources, "*.x**", null).get().size());
+        assertEquals(1, supplier(sources, "*.md", null).get().size());
+        assertEquals(0, supplier(sources, "*.bin", null).get().size());
+    }
+
+    @Test
+    public void shouldResolveDirectory() {
+        assertEquals(4, supplier(ANY_DIRECTORY, null, null).get().size());
+        assertEquals(4, supplier(ANY_DIRECTORY, "", null).get().size());
+        assertEquals(4, supplier(ANY_DIRECTORY, "*", null).get().size());
+        assertEquals(4, supplier(ANY_DIRECTORY, "*.*", null).get().size());
+        assertEquals(2, supplier(ANY_DIRECTORY, "*.csv", null).get().size());
+        assertEquals(1, supplier(ANY_DIRECTORY, "*.t*", null).get().size());
+        assertEquals(0, supplier(ANY_DIRECTORY, "*.bin", null).get().size());
+    }
+
+    @Test
+    public void shouldResolveFilesAndDirectory() {
+        final List<String> sources = Arrays.asList("pom.xml", "README.md", ANY_DIRECTORY);
+
+        assertEquals(6, supplier(sources, null, null).get().size());
+        assertEquals(6, supplier(sources, "", null).get().size());
+        assertEquals(6, supplier(sources, "*", null).get().size());
+        assertEquals(6, supplier(sources, "*.*", null).get().size());
+        assertEquals(2, supplier(sources, "*.csv", null).get().size());
+        assertEquals(1, supplier(sources, "*.t*", null).get().size());
+        assertEquals(1, supplier(sources, "*.xml", null).get().size());
+        assertEquals(0, supplier(sources, "*.bin", null).get().size());
+
+        assertEquals(0, supplier(sources, null, "*").get().size());
+        assertEquals(0, supplier(sources, null, "*.*").get().size());
+        assertEquals(0, supplier(sources, "*", "*").get().size());
+        assertEquals(5, supplier(sources, "*", "*.md").get().size());
+        assertEquals(3, supplier(sources, "*", "file*.*").get().size());
+    }
+
+    @Test
+    public void shouldResolveLargeDirectory() {
+        final List<Document> documents = supplier(".", null, null).get();
+        assertFalse(documents.isEmpty());
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void shouldThrowExceptionForNonexistingSourceDirectory() {
+        assertEquals(0, supplier("/does-not-exist", "*", null).get().size());
+    }
+
+    @Test
+    public void shouldAllowDuplicateFiles() {
+        final List<String> sources = Arrays.asList("pom.xml", "pom.xml");
+        assertEquals(2, supplier(sources, "*.xml", null).get().size());
+    }
+
+    private static DocumentsSupplier supplier(String directory, String include, String exclude) {
+        return new DocumentsSupplier(singletonList(directory), include, exclude, Charset.defaultCharset());
+    }
+
+    private static DocumentsSupplier supplier(List<String> files, String include, String exclude) {
+        return new DocumentsSupplier(files, include, exclude, Charset.defaultCharset());
+    }
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsTest.java
new file mode 100644
index 0000000..5c7f90a
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsTest.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.document;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.freemarker.generator.base.document.Documents;
+import org.junit.Test;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+public class DocumentsTest {
+
+    private static final String UNKNOWN = "unknown";
+    private static final String ANY_TEXT = "Hello World";
+    private static final String ANY_FILE_NAME = "pom.xml";
+    private static final String ANY_FILE_EXTENSION = "xml";
+    private static final File ANY_FILE = new File(ANY_FILE_NAME);
+    private static final String ANY_URL = "https://server.invalid?foo=bar";
+
+    @Test
+    public void shouldFindByWildcard() {
+        final Documents documents = documents();
+
+        assertEquals(0, documents.find(null).size());
+        assertEquals(0, documents.find("").size());
+        assertEquals(0, documents.find("*.bar").size());
+        assertEquals(0, documents.find("foo.*").size());
+        assertEquals(0, documents.find("foo.bar").size());
+
+        assertEquals(2, documents.find("*.*").size());
+        assertEquals(1, documents.find("*." + ANY_FILE_EXTENSION).size());
+        assertEquals(1, documents.find("*.???").size());
+        assertEquals(1, documents.find("*om*").size());
+        assertEquals(1, documents.find("*o*.xml").size());
+
+        assertEquals(1, documents.find(ANY_FILE_NAME).size());
+        assertEquals(1, documents.find(ANY_FILE_NAME.charAt(0) + "*").size());
+
+        assertEquals(3, documents.find("*").size());
+    }
+
+    @Test
+    public void shouldGetDocument() {
+        assertNotNull(documents().get(ANY_FILE_NAME));
+    }
+
+    @Test
+    public void shouldGetAllDocuments() {
+        final Documents documents = documents();
+
+        assertEquals("unknown", documents().get(0).getName());
+        assertEquals("pom.xml", documents().get(1).getName());
+        assertEquals("server.invalid", documents().get(2).getName());
+        assertEquals("unknown", documents().getFirst().getName());
+        assertEquals(3, documents.getList().size());
+        assertEquals(3, documents.size());
+        assertFalse(documents.isEmpty());
+    }
+
+    @Test
+    public void shouldGetNames() {
+        assertEquals(asList("unknown", "pom.xml", "server.invalid"), documents().getNames());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void shouldThrowExceptionWhenGetDoesNotFindDocument() {
+        documents().get("file-does-not-exist");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void shouldThrowExceptionWhenGetFindsMultipleDocuments() {
+        documents().get("*");
+    }
+
+    private static Documents documents() {
+        return new Documents(asList(textDocument(), fileDocument(), urlDocument()));
+    }
+
+    private static Document textDocument() {
+        return DocumentFactory.create(UNKNOWN, ANY_TEXT);
+    }
+
+    private static Document fileDocument() {
+        return DocumentFactory.create(ANY_FILE, UTF_8);
+    }
+
+    private static Document urlDocument() {
+        try {
+            return DocumentFactory.create(new URL(ANY_URL));
+        } catch (MalformedURLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/UriTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/UriTest.java
new file mode 100644
index 0000000..d6b66b1
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/UriTest.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.document;
+
+import org.junit.Test;
+
+import java.net.URI;
+
+import static junit.framework.TestCase.assertNull;
+import static org.junit.Assert.assertEquals;
+
+public class UriTest {
+
+    @Test
+    public void shouldParseHttpUri() throws Exception {
+        final URI uri = new URI("http://user:password@example.com:8042/over/there?name=ferret#nose");
+
+        assertEquals("http", uri.getScheme());
+        assertEquals("user:password@example.com:8042", uri.getAuthority());
+        assertEquals("example.com", uri.getHost());
+        assertEquals(8042, uri.getPort());
+        assertEquals("nose", uri.getFragment());
+        assertEquals("user:password", uri.getUserInfo());
+        assertEquals("/over/there", uri.getPath());
+        assertEquals("name=ferret", uri.getQuery());
+        assertEquals("http://user:password@example.com:8042/over/there?name=ferret#nose", uri.toASCIIString());
+        assertEquals("http://user:password@example.com:8042/over/there?name=ferret#nose", uri.toString());
+    }
+
+    @Test
+    public void shouldParseEnvUri() throws Exception {
+        final URI uri = new URI("env:///HOME");
+
+        assertEquals("env", uri.getScheme());
+        assertEquals("/HOME", uri.getPath());
+        assertEquals("env:///HOME", uri.toASCIIString());
+    }
+
+    @Test
+    public void shouldParseFileUri() throws Exception {
+        final URI uri = new URI("file:///tmp/my/file.json");
+
+        assertEquals("file", uri.getScheme());
+        assertEquals("/tmp/my/file.json", uri.getPath());
+        assertEquals("file:///tmp/my/file.json", uri.toASCIIString());
+    }
+
+    @Test
+    public void shouldParseFileNameOnlyUri() throws Exception {
+        final URI uri = new URI("file.json");
+
+        assertEquals("file.json", uri.getPath());
+        assertEquals("file.json", uri.toASCIIString());
+    }
+
+    @Test
+    public void shouldParseFileUriWithContentTypeAndEncoding() throws Exception {
+        final URI uri = new URI("file:///tmp/my/file.json#type=application/json&charset=UTF-16");
+
+        assertEquals("file", uri.getScheme());
+        assertEquals("/tmp/my/file.json", uri.getPath());
+        assertEquals("file:///tmp/my/file.json#type=application/json&charset=UTF-16", uri.toASCIIString());
+        assertEquals("type=application/json&charset=UTF-16", uri.getFragment());
+    }
+
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/PropertiesFileSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/PropertiesFileSupplierTest.java
new file mode 100644
index 0000000..68926e3
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/PropertiesFileSupplierTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.file;
+
+import org.apache.freemarker.generator.base.file.PropertiesClassPathSupplier;
+import org.apache.freemarker.generator.base.file.PropertiesFileSystemSupplier;
+import org.apache.freemarker.generator.base.file.PropertiesSupplier;
+import org.apache.freemarker.generator.base.util.CachingSupplier;
+import org.junit.Test;
+
+import java.util.Properties;
+import java.util.function.Supplier;
+
+import static junit.framework.TestCase.assertNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class PropertiesFileSupplierTest {
+
+    private static final String ANY_PROPERTIES_FILE = "./src/test/data/properties/test.properties";
+
+    @Test
+    public void shouldResolveFileBasedPropertyFile() {
+        final Properties properties = supplier(ANY_PROPERTIES_FILE).get();
+
+        assertNotNull(properties);
+        assertEquals("bar", properties.getProperty("foo"));
+    }
+
+    @Test
+    public void shouldReturnNullForNonExistingPropertiesFile() {
+        assertNull(supplier("unknown.properties").get());
+    }
+
+    private static Supplier<Properties> supplier(String fileName) {
+        return new CachingSupplier<>(new PropertiesSupplier(
+                new PropertiesFileSystemSupplier(fileName),
+                new PropertiesClassPathSupplier(fileName))
+        );
+    }
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileResolverTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileResolverTest.java
new file mode 100644
index 0000000..7c20b49
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileResolverTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.file;
+
+import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class RecursiveFileResolverTest {
+
+    private static final String ANY_DIRECTORY = "./src/test/data";
+    private static final String ANY_FILE_NAME = "file_01.csv";
+    private static final String UNKNOWN_FILE_NAME = "unknown.file";
+
+    @Test
+    public void shouldResolveAllFilesOfDirectory() {
+        assertEquals(4, fileResolver(ANY_DIRECTORY, null, null).get().size());
+        assertTrue(fileResolver(ANY_DIRECTORY, UNKNOWN_FILE_NAME, null).get().isEmpty());
+    }
+
+    @Test
+    public void shouldResolveSingleMatchingFile() {
+        final List<File> files = fileResolver(ANY_DIRECTORY, ANY_FILE_NAME, null).get();
+
+        assertEquals(1, files.size());
+        assertEquals(ANY_FILE_NAME, files.get(0).getName());
+    }
+
+    @Test
+    public void shouldResolveMultipleFiles() {
+        final List<String> sources = Arrays.asList("pom.xml", "README.md");
+        final List<File> files = fileResolver(sources, "*", null).get();
+
+        assertEquals(2, files.size());
+        assertEquals("pom.xml", files.get(0).getName());
+        assertEquals("README.md", files.get(1).getName());
+    }
+
+    @Test
+    public void shouldResolveMultipleFilesWithIncludeFilter() {
+        final List<String> sources = Arrays.asList("pom.xml", "README.md");
+        final List<File> files = fileResolver(sources, "*.xml", null).get();
+
+        assertEquals(1, files.size());
+        assertEquals("pom.xml", files.get(0).getName());
+    }
+
+    @Test
+    public void shouldExcludeAllFiles() {
+        final List<File> files = fileResolver(ANY_DIRECTORY, null, "*").get();
+
+        assertEquals(0, files.size());
+    }
+
+    @Test
+    public void shouldExcludeFiles() {
+        final List<File> files = fileResolver(ANY_DIRECTORY, null, "*.csv").get();
+
+        assertEquals(2, files.size());
+        assertEquals("file_01.txt", files.get(0).getName());
+        assertEquals("test.properties", files.get(1).getName());
+    }
+
+    @Test
+    public void shouldIncludeAndExcludeFiles() {
+        final List<File> files = fileResolver(ANY_DIRECTORY, "file*.*", "*.csv").get();
+
+        assertEquals(1, files.size());
+        assertEquals("file_01.txt", files.get(0).getName());
+    }
+
+    @Test
+    public void shouldResolveMultipleFilesRecursivelyWithIncludes() {
+        final List<File> files = fileResolver(ANY_DIRECTORY, "*.csv", null).get();
+
+        assertEquals(2, files.size());
+    }
+
+    private static RecursiveFileSupplier fileResolver(String source, String include, String exclude) {
+        return fileResolver(singletonList(source), include, exclude);
+    }
+
+    private static RecursiveFileSupplier fileResolver(List<String> sources, String include, String exclude) {
+        return new RecursiveFileSupplier(sources, singletonList(include), singletonList(exclude));
+    }
+
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/tools/ToolsFactoryTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/tools/ToolsFactoryTest.java
new file mode 100644
index 0000000..d636e17
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/tools/ToolsFactoryTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools;
+
+import org.apache.freemarker.generator.base.tools.ToolsFactory;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class ToolsFactoryTest {
+
+    private final Map<String, Object> settings = new HashMap<>();
+
+    @Test
+    public void shouldCreateToolWithDefaultConstructor() {
+        final Object tool = ToolsFactory.create(ToolWithDefaultConstructor.class.getName(), settings);
+
+        assertNotNull(tool);
+        assertEquals("ToolWithDefaultConstructor", tool.toString());
+    }
+
+    @Test
+    public void shouldCreateToolWithMapConstructor() {
+        final Object tool = ToolsFactory.create(ToolWithMapConstructor.class.getName(), settings);
+
+        assertNotNull(tool);
+        assertEquals("ToolWithMapConstructor", tool.toString());
+        assertNotNull(((ToolWithMapConstructor) tool).getSettings());
+    }
+
+    @Test
+    public void shouldFavourMapOverDefaultConstructorOver() {
+        final Object tool = ToolsFactory.create(ToolWithDefaultAndMapConstructor.class.getName(), settings);
+
+        assertNotNull(tool);
+        assertEquals("ToolWithDefaultAndMapConstructor", tool.toString());
+        assertNotNull(((ToolWithDefaultAndMapConstructor) tool).getSettings());
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void shouldThrowRuntimeExceptionForUnknownClass() {
+        ToolsFactory.create("does-not-exist", settings);
+    }
+
+
+    public static final class ToolWithDefaultConstructor {
+
+        public ToolWithDefaultConstructor() {
+        }
+
+        @Override
+        public String toString() {
+            return "ToolWithDefaultConstructor";
+        }
+    }
+
+    public static final class ToolWithMapConstructor {
+
+        private final Map<String, Object> settings;
+
+        public ToolWithMapConstructor(Map<String, Object> settings) {
+            this.settings = settings;
+        }
+
+        Map<String, Object> getSettings() {
+            return settings;
+        }
+
+        @Override
+        public String toString() {
+            return "ToolWithMapConstructor";
+        }
+    }
+
+    public static final class ToolWithDefaultAndMapConstructor {
+
+        private final Map<String, Object> settings;
+
+        public ToolWithDefaultAndMapConstructor() {
+            this(null);
+        }
+
+        public ToolWithDefaultAndMapConstructor(Map<String, Object> settings) {
+            this.settings = settings;
+        }
+
+        Map<String, Object> getSettings() {
+            return settings;
+        }
+
+        @Override
+        public String toString() {
+            return "ToolWithDefaultAndMapConstructor";
+        }
+    }
+
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/LocalUtilsTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/LocalUtilsTest.java
new file mode 100644
index 0000000..56a6b59
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/LocalUtilsTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.util;
+
+import org.apache.freemarker.generator.base.util.LocaleUtils;
+import org.junit.Test;
+
+import java.util.Locale;
+
+import static java.util.Locale.getDefault;
+import static org.junit.Assert.assertEquals;
+
+public class LocalUtilsTest {
+
+    @Test
+    public void shouldReturnExpectedLocale() {
+        assertEquals(Locale.JAPAN, LocaleUtils.parseLocale("ja_JP"));
+        assertEquals(Locale.ENGLISH, LocaleUtils.parseLocale("en"));
+    }
+
+    @Test
+    public void shouldReturnDefaultLocale() {
+        assertEquals(getDefault(), LocaleUtils.parseLocale(null));
+        assertEquals(getDefault(), LocaleUtils.parseLocale(""));
+        assertEquals(getDefault(), LocaleUtils.parseLocale("default"));
+        assertEquals(getDefault(), LocaleUtils.parseLocale("JVM default"));
+    }
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/PropertiesTransformerTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/PropertiesTransformerTest.java
new file mode 100644
index 0000000..de0c483
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/PropertiesTransformerTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.util;
+
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Configuration.TOOLS_PREFIX;
+import static org.apache.freemarker.generator.base.util.PropertiesTransformer.filterKeyPrefix;
+import static org.apache.freemarker.generator.base.util.PropertiesTransformer.removeKeyPrefix;
+import static org.junit.Assert.assertEquals;
+
+public class PropertiesTransformerTest {
+
+    private final Map<String, Object> settings = new HashMap<>();
+
+    @Test
+    public void shouldFilterKeyPrefix() {
+        final Properties properties = filterKeyPrefix(properties(), TOOLS_PREFIX);
+
+        assertEquals(2, properties.size());
+        assertEquals("o.a.f.g.t.commonscsv.CommonsCSVTool", properties.getProperty("freemarker.tools.CSVTool"));
+        assertEquals("o.a.f.g.t.commonscsv.ExecTool", properties.getProperty("freemarker.tools.ExecTool"));
+    }
+
+    @Test
+    public void shouldRemoveKeyPrefix() {
+        final Properties properties = removeKeyPrefix(filterKeyPrefix(properties(), TOOLS_PREFIX), TOOLS_PREFIX);
+
+        assertEquals(2, properties.size());
+        assertEquals("o.a.f.g.t.commonscsv.CommonsCSVTool", properties.getProperty("CSVTool"));
+        assertEquals("o.a.f.g.t.commonscsv.ExecTool", properties.getProperty("ExecTool"));
+    }
+
+    private Properties properties() {
+        final Properties properties = new Properties();
+        properties.put("foo", "bar");
+        properties.put("freemarker.tools.CSVTool", "o.a.f.g.t.commonscsv.CommonsCSVTool");
+        properties.put("freemarker.tools.ExecTool", "o.a.f.g.t.commonscsv.ExecTool");
+        return properties;
+    }
+}
diff --git a/freemarker-generator-cli/LICENSE b/freemarker-generator-cli/LICENSE
new file mode 100644
index 0000000..1121eba
--- /dev/null
+++ b/freemarker-generator-cli/LICENSE
@@ -0,0 +1,223 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================
+
+The source code contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
+
+  src/main/misc/overloadedNumberRules/prices.ods
+  src/manual/en_US/docgen-originals/figures/overview.odg
+  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
+  src/manual/en_US/favicon.png
+  src/manual/en_US/figures/model2sketch.png
+  src/manual/en_US/figures/overview.png
+  src/manual/en_US/figures/tree.png
+  src/manual/en_US/logo.png
+  src/manual/zh_CN/favicon.png
+  src/manual/zh_CN/figures/model2sketch.png
+  src/manual/zh_CN/figures/overview.png
+  src/manual/zh_CN/figures/tree.png
+  src/manual/zh_CN/logo.png
diff --git a/freemarker-generator-cli/NOTICE b/freemarker-generator-cli/NOTICE
new file mode 100644
index 0000000..c27f50e
--- /dev/null
+++ b/freemarker-generator-cli/NOTICE
@@ -0,0 +1,5 @@
+Apache FreeMarker Site
+Copyright 2020 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/freemarker-generator-cli/README.md b/freemarker-generator-cli/README.md
new file mode 100644
index 0000000..06b7680
--- /dev/null
+++ b/freemarker-generator-cli/README.md
@@ -0,0 +1,1297 @@
+# Apache FreeMarker Generator CLI
+
+# 1. Is This Project For You?
+
+You somehow found this GitHub project and wonder if it solves a problem you might have?!
+
+* You need to transform some structured text document (CSV, HTML, JSON, XML, YAML, Java Property files, access logs) into CSV, HTML, Markdown or Confluence markup?
+* You need to convert an Excel document into CSV, HTML or Markdown?
+* You need to create a nice-looking PDF from some boring-looking CSV or JSON content ?
+
+The goal of `freemarker-cli` is to automate repeated transformation tasks 
+
+* Which are too boring to be done manually 
+* Which happen not often enough to write a dedicated script or program
+
+# 2. Once Upon A Time
+
+In December 2015 I needed a little bit of test data management for a customer project - to make a long story short (after writing a few more Groovy scripts) it boiled down to transforming one or more JSON files to something human readable.
+
+What are the options?
+
+* The cool kids say 'Node.js' - but they always say 'Node.js' 
+* Some fancy Groovy scripts using Groovy's markup builder - but the syntax looks a bit odd
+* Using 'JsonPath' and 'Velocity' to reuse good & old stuff
+
+So I went with 'Apache Groovy', 'JsonPath' and 'Apache Velocity'
+
+* Playing with Groovy over the public holidays
+* Groovy has a built-in package manager which makes distribution a breeze
+* Providing samples to transform JSON to Markdown
+
+Using Velocity actually created some minor issues so I migrated to [Apache FreeMarker](https://freemarker.apache.org) during Christmas 2016
+
+* Velocity 1.7 was released 2010 and only recently there was a new release
+* I was painful to get Velocity Tools working
+* Velocity XML processing support is also painful
+* Spring 4.3 deprecated Velocity support which could affect me in the long run
+* FreeMarker has no additional dependencies and things are just working :-)
+
+While I love Apache Velocity (Apache Turbine anyone?) I decided to give FreeMarker a chance and migrated my [velocity-cli](https://github.com/sgoeschl/velocity-cli) to FreeMarker.
+
+Some years later the not-so-small-any-longer-and-not-having-tests Groovy script was still growing so I decided 
+
+* To ditch Groovy and migrate to plain JDK 8
+* Write unit tests since I had no more excuses
+* To ditch Commons CLI and migrate to [Picocli](https://picocli.info)
+
+# 3. Design Goals
+
+* Create a proper command-line tool which has Unix look & feel
+* Handle arbitrary large input and output data
+* Support multiple source files/directories for a single transformation
+* Support transformation of Property files using plain-vanilla JDK
+* Support transformation of CSV files using [Apache Commons CSV](https://commons.apache.org/proper/commons-csv/)
+* Support transformation of JSON using [Jayway's JSONPath](https://github.com/jayway/JsonPath)
+* Support transformation of Excel using [Apache POI](https://poi.apache.org)
+* Support transformation of YAML using [SnakeYAML](https://bitbucket.org/asomov/snakeyaml/wiki/Home)
+* Support transformation of HTML using [JSoup](https://jsoup.org)
+* Support transformation of structured logfiles using [Grok](https://github.com/thekrakken/java-grok)
+* XML & XPath is supported by FreeMarker [out-of-the-box](http://freemarker.org/docs/xgui.html)
+* Support for reading document content from STDIN to integrate with command line tools
+* Support execution of arbitrary commands using [Apache Commons Exec](https://commons.apache.org/proper/commons-exec/)
+* Add some commonly useful information such as `System Properties`, `Enviroment Variables`
+* Support embedding the code in existing applications
+
+# 4. Installation
+
+Download the latest release from [GitHub](https://github.com/sgoeschl/freemarker-cli/releases), e.g. [freemarker-cli-2.0.0-BETA-5-app.tar.gz](https://github.com/sgoeschl/freemarker-cli/releases/download/v2.0.0-BETA-4/freemarker-cli-2.0.0-BETA-5-app.tar.gz) and unpack it into of a directory of your choice, e.g `/Application/Java/freemarker-cli`
+
+It is recommended 
+
+* To add `bin/freemarker-cli` or `bin/freemarker-cli.bat` to your executable path
+* To create a `~/.freemarker-cli` directory to store your custom FTL templates
+
+You can test the installation by executing
+
+```text
+> ./bin/freemarker-cli -t templates/info.ftl 
+
+FreeMarker CLI Information
+---------------------------------------------------------------------------
+FreeMarker version     : 2.3.29
+Template name          : templates/info.ftl
+Language               : en
+Locale                 : en_US
+Timestamp              : Feb 22, 2020 4:42:01 PM
+Output encoding        : UTF-8
+Output format          : plainText
+
+FreeMarker CLI Template Directories
+---------------------------------------------------------------------------
+[1] /Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler
+
+FreeMarker CLI Tools
+---------------------------------------------------------------------------
+- CSVTool              : Process CSV files using Apache Commons CSV (see https://commons.apache.org/proper/commons-csv/)
+- ExcelTool            : Process Excels files (XLS, XLSX) using Apache POI (see https://poi.apache.org)
+- ExecTool             : Execute command line tools using Apache Commons Exec (see https://commons.apache.org/proper/commons-exec/)
+- FreeMarkerTool       : Expose useful Apache FreeMarker classes
+- GrokTool             : Process text files using Grok expressions (see https://github.com/thekrakken/java-grok)
+- JsonPathTool         : Process JSON files using Java JSON Path (see https://github.com/json-path/JsonPath)
+- JsoupTool            : Process  HTML files using Jsoup (see https://jsoup.org)
+- PropertiesTool       : Process JDK properties files
+- SystemTool           : Expose System-related utility methods
+- UUIDTool             : Create UUIDs
+- XmlTool              : Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html)
+- YamlTool             : Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home)
+
+FreeMarker CLI Documents
+---------------------------------------------------------------------------
+
+User Supplied Parameters
+---------------------------------------------------------------------------
+
+User Supplied System Properties
+---------------------------------------------------------------------------
+
+SystemTool
+---------------------------------------------------------------------------
+Command line         : -t, templates/info.ftl
+Host Name            : W0GL5179.local
+Java Home            : /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home
+User Name            : sgoeschl
+Timestamp            : 1,582,386,121,793
+Writer               : org.apache.freemarker.generator.base.util.NonClosableWriterWrapper
+```
+
+There a many examples (see below) available you can execute - run `./run-samples.sh` and have a look at the generated output
+
+```text
+./run-samples.sh 
+templates/info.ftl
+templates/demo.ftl
+templates/csv/html/transform.ftl
+templates/csv/md/transform.ftl
+templates/csv/shell/curl.ftl
+templates/csv/md/filter.ftl
+templates/csv/fo/transform.ftl
+fop -fo target/out/locker-test-users.fo target/out/locker-test-users.pdf
+templates/csv/fo/transactions.ftl
+fop -fo target/out/transactions.fo target/out/transactions-fo.pdf
+templates/csv/html/transform.ftl
+wkhtmltopdf -O landscape target/out/transactions.html target/out/transactions-html.pdf
+templates/accesslog/combined-access.ftl
+templates/excel/html/transform.ftl
+templates/excel/md/transform.ftl
+templates/excel/csv/transform.ftl
+templates/excel/csv/custom.ftl
+templates/html/csv/dependencies.ftl
+templates/json/csv/swagger-endpoints.ftl
+templates/json/md/github-users.ftl
+templates/properties/csv/locker-test-users.ftl
+templates/yaml/txt/transform.ftl
+templates/xml/txt/recipients.ftl
+Created the following sample files in ./target/out
+total 1344
+-rw-r--r--  1 sgoeschl  staff     646 Feb 22 16:43 combined-access.log.txt
+-rw-r--r--  1 sgoeschl  staff   22548 Feb 22 16:43 contract.html
+-rw-r--r--  1 sgoeschl  staff    7933 Feb 22 16:43 contract.md
+-rw-r--r--  1 sgoeschl  staff     784 Feb 22 16:43 curl.sh
+-rw-r--r--  1 sgoeschl  staff     232 Feb 22 16:43 customer.txt
+-rw-r--r--  1 sgoeschl  staff   15084 Feb 22 16:43 demo.txt
+-rw-r--r--  1 sgoeschl  staff    1310 Feb 22 16:43 dependencies.csv
+-rw-r--r--  1 sgoeschl  staff    2029 Feb 22 16:43 github-users-curl.md
+-rw-r--r--  1 sgoeschl  staff    2668 Feb 22 16:43 info.txt
+-rw-r--r--  1 sgoeschl  staff      66 Feb 22 16:43 interactive-html.txt
+-rw-r--r--  1 sgoeschl  staff      16 Feb 22 16:43 interactive-json.txt
+-rw-r--r--  1 sgoeschl  staff      10 Feb 22 16:43 interactive-xml.txt
+-rw-r--r--  1 sgoeschl  staff     285 Feb 22 16:43 locker-test-users.csv
+-rw-r--r--  1 sgoeschl  staff    6341 Feb 22 16:43 locker-test-users.fo
+-rw-r--r--  1 sgoeschl  staff    5526 Feb 22 16:43 locker-test-users.pdf
+-rw-r--r--  1 sgoeschl  staff     921 Feb 22 16:43 recipients.txt
+-rw-r--r--  1 sgoeschl  staff     910 Feb 22 16:43 sales-records.md
+-rw-r--r--  1 sgoeschl  staff     379 Feb 22 16:43 swagger-spec.csv
+-rw-r--r--  1 sgoeschl  staff     156 Feb 22 16:43 test-multiple-sheets.xlsx.csv
+-rw-r--r--  1 sgoeschl  staff    1917 Feb 22 16:43 test-multiple-sheets.xlsx.html
+-rw-r--r--  1 sgoeschl  staff     389 Feb 22 16:43 test-multiple-sheets.xlsx.md
+-rw-r--r--  1 sgoeschl  staff     150 Feb 22 16:43 test-transform-xls.csv
+-rw-r--r--  1 sgoeschl  staff    1556 Feb 22 16:43 test.xls.html
+-rw-r--r--  1 sgoeschl  staff    1558 Feb 22 16:43 test.xslx.html
+-rw-r--r--  1 sgoeschl  staff   25756 Feb 22 16:43 transactions-fo.pdf
+-rw-r--r--  1 sgoeschl  staff   66016 Feb 22 16:43 transactions-html.pdf
+-rw-r--r--  1 sgoeschl  staff  330128 Feb 22 16:43 transactions.fo
+-rw-r--r--  1 sgoeschl  staff   51008 Feb 22 16:43 transactions.html
+```
+
+Please note that generated PDF files are very likely not found since they require `wkhtmltopdf` and `Apache FOP` installation.
+
+# 5. Usage
+
+```text
+> ./bin/freemarker-cli  -h
+
+Usage: freemarker-cli (-t=<template> | -i=<interactiveTemplate>) [-EhV]
+                      [--stdin] [-b=<baseDir>] [--config=<configFile>]
+                      [-e=<inputEncoding>] [--exclude=<exclude>]
+                      [--include=<include>] [-l=<locale>] [-o=<outputFile>]
+                      [--output-encoding=<outputEncoding>] [--times=<times>]
+                      [-D=<String=String>]... [-P=<String=String>]...
+                      [<sources>...]
+Apache FreeMarker CLI
+      [<sources>...]        List of input files and/or input directories
+  -b, --basedir=<baseDir>   Optional template base directory
+      --config=<configFile> FreeMarker CLI configuration file
+  -D, --system-property=<String=String>
+                            Set system property
+  -e, --input-encoding=<inputEncoding>
+                            Encoding of input documents
+  -E, --expose-env          Expose environment variables and user-supplied
+                              properties globally
+      --exclude=<exclude>   File pattern for document input directory
+  -h, --help                Show this help message and exit.
+  -i, --interactive=<interactiveTemplate>
+                            Interactive FreeMarker template
+      --include=<include>   File pattern for document input directory
+  -l, --locale=<locale>     Locale being used for the output, e.g. 'en_US'
+  -o, --output=<outputFile> Output file
+      --output-encoding=<outputEncoding>
+                            Encoding of output, e.g. UTF-8
+  -P, --param=<String=String>
+                            Set parameter
+      --stdin               Read input document from stdin
+  -t, --template=<template> FreeMarker template to render
+      --times=<times>       Re-run X times for profiling
+  -V, --version             Print version information and exit.
+```
+
+# 6. Examples
+
+The examples were tested with JDK 1.8 on Mac OS X
+
+```text
+> java -version
+java version "1.8.0_192"
+Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
+Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
+```
+It is assumed that you run the examples from the `freemarker-cli` installation directory.
+
+## 6.1 Transforming GitHub JSON To Markdown
+
+A simple example with real JSON data to be transformed into Markdown
+
+### Invocation
+
+You can either use the existing JSON sample
+
+> ./bin/freemarker-cli -t templates/json/md/github-users.ftl site/sample/json/github-users.json
+
+or pipe a cURL response
+
+> curl -s https://api.github.com/users | ./bin/freemarker-cli -t templates/json/md/github-users.ftl --stdin
+
+### FreeMarker Template
+
+```text
+<#ftl output_format="plainText" >
+<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign users = json.read("$[*]")>
+<#--------------------------------------------------------------------------->
+# GitHub Users
+
+Report generated at ${.now?iso_utc}
+
+<#compress>
+<#list users as user>
+<#assign userAvatarUrl = user.avatar_url>
+<#assign userHomeUrl = user.html_url>
+# ${user.login}
+
+| User                                                    | Homepage                                      |
+|:--------------------------------------------------------|:----------------------------------------------|
+| <img src="${user.avatar_url}" width="48" height="48"/> | [${userHomeUrl}](${userHomeUrl})               |
+</#list>
+</#compress>
+```
+
+creates the following output
+
+![](./site/image/github.png)
+
+## 6.2 CSV to HTML/Markdown Transformation
+
+Sometimes you have a CSV file which needs to be translated in Markdown or HTML - there are on-line solutions available such as [CSV To Markdown Table Generator](https://donatstudios.com/CsvToMarkdownTable) but having a local solution gives you more flexibility.
+
+```text
+> ./bin/freemarker-cli -t templates/csv/md/transform.ftl site/sample/csv/contract.csv
+> ./bin/freemarker-cli -t templates/csv/html/transform.ftl site/sample/csv/contract.csv
+```
+
+The FreeMarker template is shown below
+
+```text
+<#ftl output_format="plainText">
+<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
+<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderMap()?keys>
+<#assign csvRecords = csvParser.records>
+<#--------------------------------------------------------------------------->
+<#compress>
+<@writeHeaders headers=csvHeaders/>
+<@writeColums columns=csvRecords/>
+</#compress>
+<#--------------------------------------------------------------------------->
+<#macro writeHeaders headers>
+| ${csvHeaders?join(" | ", "")} |
+    <#list csvHeaders as csvHeader>| --------</#list>|
+</#macro>
+<#--------------------------------------------------------------------------->
+<#macro writeColums columns>
+    <#list columns as column>
+    | ${column.iterator()?join(" | ", "")} |
+    </#list>
+</#macro>
+```
+
+The resulting file actually looks pleasant when compared to raw CSV
+
+![Contract CSV to HTML](./site/image/contract.png "Contract CSV to HTML")
+
+## 6.3 Transform XML To Plain Text
+
+Of course you can also transform a XML document
+
+```text
+> ./bin/freemarker-cli -t templates/xml/txt/recipients.ftl site/sample/xml/recipients.xml
+```
+
+using the following template
+
+```text
+<#ftl output_format="plainText" >
+<#assign xml = XmlTool.parse(Documents.get(0))>
+<#list xml.recipients.person as recipient>
+To: ${recipient.name}
+${recipient.address}
+
+Dear ${recipient.name},
+
+Thank you for your interest in our products. We will be sending you a catalog shortly.
+To take advantage of our free gift offer, please fill in the survey attached to this
+letter and return it to the address on the reverse. Only one participant is allowed for
+each household.
+
+Sincere salutations,
+
+
+D. H.
+
+---------------------------------------------------------------------------------------
+</#list>
+
+```
+
+which generates the following output
+
+```text
+To: John Smith
+3033 Long Drive, Houston, TX
+
+Dear John Smith,
+
+Thank you for your interest in our products. We will be sending you a catalog shortly.
+To take advantage of our free gift offer, please fill in the survey attached to this
+letter and return it to the address on the reverse. Only one participant is allowed for
+each household.
+
+Sincere salutations,
+
+
+D. H.
+```
+
+## 6.4 Transform JSON To CSV
+
+One day I was asked a to prepare a CSV files containing REST endpoints described by Swagger - technically this is a JSON to CSV transformation. Of course I could create that CSV manually but writing a FTL template doing that was simply more fun and saves time in the future.
+
+```text
+<#ftl output_format="plainText" strip_text="true">
+<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign basePath = json.read("$.basePath")>
+<#assign paths = json.read("$.paths")>
+
+<#compress>
+    ENDPOINT;METHOD;CONSUMES;PRODUCES;SUMMARY;DESCRIPTION
+    <#list paths as endpoint,metadata>
+        <#assign relative_url = basePath + endpoint>
+        <#assign methods = metadata?keys>
+        <#list methods as method>
+            <#assign summary = sanitize(paths[endpoint][method]["summary"]!"")>
+            <#assign description = sanitize(paths[endpoint][method]["description"]!"")>
+            <#assign consumes = join(paths[endpoint][method]["consumes"]![])>
+            <#assign produces = join(paths[endpoint][method]["produces"]![])>
+            ${relative_url};${method?upper_case};${consumes};${produces};${summary};${description}
+        </#list>
+    </#list>
+</#compress>
+${'\n'}
+
+<#function sanitize str>
+    <#return (((str?replace(";", ","))?replace("(\\n)+", "",'r')))?truncate(250)>
+</#function>
+
+<#function join list>
+    <#if list?has_content>
+        <#return list?join(", ")>
+    <#else>
+        <#return "">
+    </#if>
+</#function>
+```
+
+Invoking the FTL template
+
+> ./bin/freemarker-cli -t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json 
+
+gives you
+
+```text
+ENDPOINT;METHOD;CONSUMES;PRODUCES;SUMMARY;DESCRIPTION
+/api/pets;GET;;;;Returns all pets from the system that the user has access to
+/api/pets;POST;;;;Creates a new pet in the store. Duplicates are allowed
+/api/pets/{id};GET;;;;Returns a user based on a single ID, if the user does not have access to the pet
+/api/pets/{id};DELETE;;;;Deletes a single pet based on the ID supplied
+```
+
+## 6.5 Transforming Excel Documents
+
+Another day my project management asked me to create a CSV configuration file based on an Excel documents - as usual manual copying was not an option due to required data cleanup and data transformation. So I thought about Apache POI which support XLS and XLSX documents - integration of Apache POI was a breeze but the resulting code was not particularly useful example. So a more generic transformation was provided to show the transformation of Excel documents ...
+
+```text
+> ./bin/freemarker-cli -t templates/excel/html/transform.ftl site/sample/excel/test.xls
+> ./bin/freemarker-cli -t templates/excel/html/transform.ftl site/sample/excel/test.xlsx
+> ./bin/freemarker-cli -t templates/excel/html/transform.ftl site/sample/excel/test-multiple-sheets.xlsx
+> ./bin/freemarker-cli -t templates/excel/md/transform.ftl site/sample/excel/test-multiple-sheets.xlsx
+```
+
+The provided FTL transforms an Excel into a HTML document supporting multiple Excel sheets
+
+```text
+<#ftl output_format="HTML" >
+<#assign document = Documents.get(0)>
+<#assign documentName = document.name>
+<#assign workbook = ExcelTool.parse(document)>
+<#assign date = .now?iso_utc>
+<#--------------------------------------------------------------------------->
+<!DOCTYPE html>
+<html>
+<head>
+    <title>${documentName}</title>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
+</head>
+<body>
+<div class="container-fluid">
+    <h1>Excel Test
+        <small>${documentName}, ${date}</small>
+    </h1>
+    <@writeSheets workbook/>
+</div>
+</body>
+</html>
+
+<#--------------------------------------------------------------------------->
+<#-- writeSheets                                                           -->
+<#--------------------------------------------------------------------------->
+<#macro writeSheets workbook>
+    <#assign sheets = ExcelTool.getSheets(workbook)>
+    <#list sheets as sheet>
+        <@writeSheet sheet/>
+    </#list>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeSheet                                                            -->
+<#--------------------------------------------------------------------------->
+<#macro writeSheet sheet>
+    <#assign rows = ExcelTool.toTable(sheet)>
+    <h2>${sheet.getSheetName()}</h2>
+    <@writeRows rows/>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeRows                                                             -->
+<#--------------------------------------------------------------------------->
+<#macro writeRows rows>
+    <table class="table table-striped">
+        <#list rows as row>
+            <#if row?is_first>
+                <tr>
+                    <th>#</th>
+                    <#list row as column>
+                        <th>${column}</th>
+                    </#list>
+                </tr>
+            <#else>
+                <tr>
+                    <td>${row?index}</td>
+                    <#list row as column>
+                        <td>${column}</td>
+                    </#list>
+                </tr>
+            </#if>
+        </#list>
+    </table>
+</#macro>
+```
+
+but the result looks reasonable
+
+![](./site/image/excel-to-html.png)
+
+## 6.6 Transform Property Files To CSV
+
+In this sample we transform all property files found in a directory (recursive search using include pattern) to a CSV file
+
+```text
+> ./bin/freemarker-cli --include *.properties -t templates/properties/csv/locker-test-users.ftl site/sample/properties
+TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION
+TENANT_A,fat,user_0004,user_0004,password_0004,,,
+TENANT_B,fat,user_0001,user_0001,password_0001,,,
+TENANT_B,uat,user_0003,user_0003,password_0003,,,
+TENANT_C,fat,user_0002,user_0002,password_0004,000000,,Many products
+```
+
+The FTL uses a couple of interesting features
+
+* We process a list of property files
+* The `strip_text` and `compress` strips any white-spaces and line-breaks from the output so we can create a proper CSV file
+* We use FTL functions to extract the `tenant` and `site`, e.g. `extractTenant`
+* We add a manual line break using ```${'\n'}```
+
+```text
+<#ftl output_format="plainText" strip_text="true">
+<#compress>
+    TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION
+    <#list Documents.list as document>
+        <#assign properties = PropertiesTool.parse(document)>
+        <#assign environments = properties["ENVIRONMENTS"]!"">
+        <#assign tenant = extractTenant(environments)>
+        <#assign site = extractSite(environments)>
+        <#assign userId = properties["USER_ID"]!"">
+        <#assign disposerId = properties["USER_ID"]!"">
+        <#assign password = properties["PASSWORD"]!"">
+        <#assign smsOtp = properties["SMS_OTP"]!"">
+        <#assign name = properties["NAME"]!"">
+        <#assign description = properties["DESCRIPTION"]!"">
+        ${tenant},${site},${userId},${disposerId},${password},${smsOtp},${name},${description}
+    </#list>
+</#compress>
+${'\n'}
+
+<#function extractSite environments>
+</#function>
+
+<#function extractTenant environments>
+</#function>
+
+```
+
+## 6.7 Transform CSV To XML-FO
+
+For a POC (proof of concept) I created a sample transformation from CSV to XML-FO in order to create a PDF document using [Apache FOP](https://xmlgraphics.apache.org/fop) using the following template file
+
+```text
+<#ftl output_format="XML" >
+<#assign document = Documents.get(0)>
+<#assign name = document.name>
+<#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()>
+<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderMap()?keys>
+<#assign csvRecords = csvParser.records>
+<#--------------------------------------------------------------------------->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+    <fo:layout-master-set>
+        <fo:simple-page-master master-name="first"
+                               page-height="21cm"
+                               page-width="29.7cm"
+                               margin-top="1cm"
+                               margin-bottom="1cm"
+                               margin-left="1cm"
+                               margin-right="1cm">
+            <fo:region-body margin-top="1cm"/>
+            <fo:region-before extent="1cm"/>
+            <fo:region-after extent="-1.2cm"/>
+        </fo:simple-page-master>
+    </fo:layout-master-set>
+    <fo:page-sequence master-reference="first">
+        <fo:static-content flow-name="xsl-region-before">
+            <fo:block line-height="10pt" font-size="8pt" text-align="left">Transaction Export - ${.now}</fo:block>
+        </fo:static-content>
+        <fo:static-content flow-name="xsl-region-after">
+            <fo:block line-height="6pt" font-size="6pt" text-align="end">Page <fo:page-number/></fo:block>
+        </fo:static-content>
+        <fo:flow flow-name="xsl-region-body">
+            <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+                <fo:table-column column-width="8%"/>
+                <fo:table-column column-width="10%"/>
+                <fo:table-column column-width="12%"/>
+                <fo:table-column column-width="8%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="5%"/>
+                <fo:table-column column-width="5%"/>
+                <fo:table-column column-width="5%"/>
+                <fo:table-column column-width="35%"/>
+                <fo:table-column column-width="5%"/>
+                <@writeTableHeader headers=csvHeaders/>
+                <@writeTableBody columns=csvRecords/>
+            </fo:table>
+        </fo:flow>
+    </fo:page-sequence>
+</fo:root>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableHeader headers>
+    <fo:table-header>
+        <fo:table-row>
+            <#list headers as header>
+                <fo:table-cell border-style="solid" border-width="0.1pt" padding-left="1.0px" padding-right="1.0px">
+                    <fo:block font-size="6pt" font-weight="bold">${header}</fo:block>
+                </fo:table-cell>
+            </#list>
+        </fo:table-row>
+    </fo:table-header>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableBody columns>
+    <fo:table-body>
+        <#list columns as column>
+            <fo:table-row>
+                <#list column.iterator() as field>
+                    <fo:table-cell border-style="solid" border-width="0.1pt" padding-left="1.0px" padding-right="1.0px">
+                        <fo:block font-size="6pt">${field}</fo:block>
+                    </fo:table-cell>
+                </#list>
+            </fo:table-row>
+        </#list>
+    </fo:table-body>
+</#macro>
+
+```
+
+In order to create the PDF you need to execute the following commands (assuming that you have Apache FOP installed)
+
+```text
+> ./bin/freemarker-cli -t templates/csv/fo/transform.ftl site/sample/csv/locker-test-users.csv > sample.fo
+> fop -fo sample.fo sample.pdf
+Dec 29, 2018 10:24:30 PM org.apache.fop.events.LoggingEventListener processEvent
+WARNING: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400".
+Dec 29, 2018 10:24:30 PM org.apache.fop.events.LoggingEventListener processEvent
+WARNING: Font "ZapfDingbats,normal,700" not found. Substituting with "ZapfDingbats,normal,400".
+Dec 29, 2018 10:24:30 PM org.apache.fop.events.LoggingEventListener processEvent
+INFO: Rendered page #1.
+```
+
+The result does not look very impressive but it is a PDF :-)
+
+![](./site/image/locker-test-users-pdf.png)
+
+Further along the line of the POC we converted a transaction export from CSV to PDF using Apache FOP
+
+```text
+> ./bin/freemarker-cli -t templates/csv/fo/transactions.ftl site/sample/csv/transactions.csv > transactions.fo
+> fop -fo transactions.fo transactions.pdf
+Jan 16, 2019 11:15:21 PM org.apache.fop.events.LoggingEventListener processEvent
+WARNING: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400".
+Jan 16, 2019 11:15:21 PM org.apache.fop.events.LoggingEventListener processEvent
+WARNING: Font "ZapfDingbats,normal,700" not found. Substituting with "ZapfDingbats,normal,400".
+Jan 16, 2019 11:15:21 PM org.apache.fop.events.LoggingEventListener processEvent
+WARNING: The contents of fo:block line 1 exceed the available area in the inline-progression direction by 11027 millipoints. (See position 1519:51)
+Jan 16, 2019 11:15:22 PM org.apache.fop.events.LoggingEventListener processEvent
+INFO: Rendered page #1.
+Jan 16, 2019 11:15:22 PM org.apache.fop.events.LoggingEventListener processEvent
+INFO: Rendered page #2.
+```
+
+![](./site/image/transactions.png)
+
+## 6.8 Transforming HTML To CSV
+
+Recently I got the rather unusual question how to determine the list of dependencies of an application - one easy way is the Maven "dependencies.html" but this is unstructured data. Having said that the Jsoup library is perfectly able to parse most real-life HTML and provides a DOM model
+
+```text
+<#ftl output_format="plainText" strip_text="true">
+<#assign document = Documents.get(0)>
+<#assign documentName = document.name>
+<#assign html = JsoupTool.parse(document)>
+
+<#compress>
+    <@writeHeader/>
+    <@writeDependencies "Project_Dependencies_compile"/>
+    <@writeDependencies "Project_Transitive_Dependencies_compile"/>
+    <@writeDependencies "Project_Transitive_Dependencies_runtime"/>
+    <@writeDependencies "Project_Transitive_Dependencies_provided"/>
+</#compress>
+
+<#macro writeHeader>
+    GroupId,ArtifactId,Version,Type,Licenses
+</#macro>
+
+<#macro writeDependencies section>
+    <#assign selection = html.select("a[name=${section}]")>
+    <#if selection?has_content>
+        <#assign table = selection[0].nextElementSibling().child(2).child(0)>
+        <#assign rows = table.children()>
+        <#list rows as row>
+            <#if !row?is_first>
+                <#assign groupId = row.child(0).text()>
+                <#assign artificatId = row.child(1).text()>
+                <#assign version = row.child(2).text()>
+                <#assign type = row.child(3).text()>
+                <#assign licences = row.child(4).text()?replace(",", "")>
+                ${groupId},${artificatId},${version},${type},${licences}
+            </#if>
+        </#list>
+    </#if>
+</#macro>
+
+
+```
+
+Your dependencies as CSV can be generated as shown below
+
+```text
+> ./bin/freemarker-cli -t templates/html/csv/dependencies.ftl site/sample/html/dependencies.html 
+GroupId,ArtifactId,Version,Type,Licenses
+com.jayway.jsonpath,json-path,2.4.0,jar,The Apache Software License Version 2.0
+commons-cli,commons-cli,1.4,jar,Apache License Version 2.0
+org.apache.commons,commons-csv,1.5,jar,Apache License Version 2.0
+org.apache.poi,poi,4.0.1,jar,The Apache Software License Version 2.0
+org.apache.poi,poi-ooxml,3.17,jar,The Apache Software License Version 2.0
+org.apache.poi,poi-ooxml-schemas,3.17,jar,The Apache Software License Version 2.0
+org.freemarker,freemarker,2.3.28,jar,Apache License Version 2.0
+org.jsoup,jsoup,1.11.3,jar,The MIT License
+org.slf4j,slf4j-api,1.7.21,jar,MIT License
+org.slf4j,slf4j-log4j12,1.7.21,jar,MIT License
+com.github.virtuald,curvesapi,1.04,jar,BSD License
+commons-codec,commons-codec,1.11,jar,Apache License Version 2.0
+log4j,log4j,1.2.17,jar,The Apache Software License Version 2.0
+net.minidev,accessors-smart,1.2,jar,The Apache Software License Version 2.0
+net.minidev,json-smart,2.3,jar,The Apache Software License Version 2.0
+org.apache.commons,commons-collections4,4.2,jar,Apache License Version 2.0
+org.apache.commons,commons-math3,3.6.1,jar,Apache License Version 2.0
+org.apache.xmlbeans,xmlbeans,2.6.0,jar,The Apache Software License Version 2.0
+org.ow2.asm,asm,5.0.4,jar,BSD
+stax,stax-api,1.0.1,jar,The Apache Software License Version 2.0
+```
+
+## 6.9 Transform CSV To Shell Script
+
+For a customer project we wanted to record REST request / responses using WireMock - really quick and dirty. So we decided to avoid any sophisticated test tool but generate a ready-to-use shell script executing cURL commands. It turned out that handling of dollar signs is a bit tricky
+
+* Using ```noparse``` directive to disable parsing of dollar signs
+* Using ```${r"${MY_BASE_URL}"``` to generate output with dollar signs
+
+and the final FTL is found below
+
+```text
+<#ftl output_format="plainText">
+<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
+<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign records = csvParser.records>
+<#assign csvMap = CSVTool.toMap(records, "disposer")>
+<#--------------------------------------------------------------------------->
+#!/bin/sh
+
+<#noparse>
+MY_BASE_URL=${MY_BASE_URL:=https://postman-echo.com}
+</#noparse>
+ 
+echo "time,user,status,duration,size"
+<#list records as record>
+date "+%FT%H:%M:%S" | tr -d '\n'; curl --write-out ',${record.disposer},%{http_code},%{time_total},%{size_download}\n' --silent --show-error --output /dev/null "${r"${MY_BASE_URL}"}/get"
+</#list>
+```
+
+Rendering the FreeMarker template 
+
+```
+> ./bin/freemarker-cli -t ./templates/csv/shell/curl.ftl site/sample/csv/user.csv
+```
+
+generates the following shell script
+
+```
+#!/bin/sh
+
+MY_BASE_URL=${MY_BASE_URL:=https://postman-echo.com}
+ 
+echo "time,user,status,duration,size"
+date "+%FT%H:%M:%S" | tr -d '\n'; curl --write-out ',AAAAAAA,%{http_code},%{time_total},%{size_download}\n' --silent --show-error --output /dev/null "${MY_BASE_URL}/get"
+date "+%FT%H:%M:%S" | tr -d '\n'; curl --write-out ',BBBBBBB,%{http_code},%{time_total},%{size_download}\n' --silent --show-error --output /dev/null "${MY_BASE_URL}/get"
+date "+%FT%H:%M:%S" | tr -d '\n'; curl --write-out ',CCCCCCC,%{http_code},%{time_total},%{size_download}\n' --silent --show-error --output /dev/null "${MY_BASE_URL}/get"
+date "+%FT%H:%M:%S" | tr -d '\n'; curl --write-out ',DDDDDDD,%{http_code},%{time_total},%{size_download}\n' --silent --show-error --output /dev/null "${MY_BASE_URL}/get"
+```
+
+Looks a bit complicated but lets dissect the things
+
+* `date "+%FT%H:%M:%S" | tr -d '\n'` creates a timestamp and removes the line feed
+* `curl --write-out` allows to print runtime data (see [https://ec.haxx.se/usingcurl-writeout.html](https://ec.haxx.se/usingcurl-writeout.html))
+
+Executing the result shell script creates the following output (which is a nice CSV for further processing)
+
+```
+time,user,status,duration,size
+2019-09-27T21:02:52,AAAAAAA,200,0.522473,206
+2019-09-27T21:02:53,BBBBBBB,200,0.498093,206
+2019-09-27T21:02:54,CCCCCCC,200,0.529013,206
+2019-09-27T21:02:54,DDDDDDD,200,0.528268,206
+```
+
+## 6.10 Unleashing The Power Of Grok
+
+Think of `Grok` as modular regular expressions with a pre-defined functionality to parse access logs or any other data where you can't comprehend the regular expression any longer, one very simple example is `QUOTEDSTRING`
+
+```
+QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``))
+```
+
+And with `Grok` the `QUOTEDSTRING` is just a building block for an even more complex regular expession such as `COMBINEDAPACHELOG`
+
+> bin/freemarker-cli -t templates/accesslog/combined-access.ftl site/sample/accesslog/combined-access.log 
+
+which gives you the following output
+
+```
+TIMESTAMP;VERB;REQUEST;HTTPVERSION
+19/Jun/2005:06:44:17 +0200;GET;/wximages/wxwidgets02-small.png;1.1
+19/Jun/2005:06:46:05 +0200;GET;/wximages/wxwidgets02-small.png;1.1
+19/Jun/2005:06:47:37 +0200;GET;/wximages/wxwidgets02-small.png;1.1
+19/Jun/2005:06:48:40 +0200;GET;/wiki.pl?WxWidgets_Bounties;1.1
+19/Jun/2005:06:50:49 +0200;GET;/wiki.pl?WxWidgets_Compared_To_Other_Toolkits;1.1
+19/Jun/2005:06:50:49 +0200;GET;/wxwiki.css;1.1
+19/Jun/2005:06:50:49 +0200;GET;/wximages/wxwidgets02-small.png;1.1
+19/Jun/2005:06:50:50 +0200;GET;/favicon.ico;1.1
+19/Jun/2005:06:52:36 +0200;GET;/wximages/wxwidgets02-small.png;1.1
+19/Jun/2005:06:53:14 +0200;GET;/;1.0
+```
+
+using the following FreeMarker template
+
+```text
+<#ftl output_format="plainText" strip_whitespace=true>
+<#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")>
+<#assign document = Documents.get(0)>
+<#assign lines = document.getLineIterator()>
+
+<#compress>
+    TIMESTAMP;VERB;REQUEST;HTTPVERSION
+    <#list lines as line>
+        <#assign parts = grok.match(line)>
+        <#assign timestamp = parts["timestamp"]>
+        <#assign verb = parts["verb"]>
+        <#assign request = parts["request"]>
+        <#assign httpversion = parts["httpversion"]>
+        ${timestamp};${verb};${request};${httpversion}
+    </#list>
+</#compress>
+```
+
+While this looks small and tidy there are some nifty features
+
+* `GrokTool.compile("%{COMBINEDAPACHELOG}")` builds the `Grok` instance to parse access logs in `Combined Format`
+* The source document is streamed line by line and not loaded into memory in one piece
+* This also works for using `stdin` so are able to parse GB of access log or other files
+
+## 6.11 CSV Transformation
+
+Sometimes you have a CSV file which is not quite right - you need to change the format. Lets have a look how `freemarker-cli` can help
+
+> bin/freemarker-cli -Pcsv.in.delimiter=COMMA -Pcsv.out.delimiter=PIPE -t templates/csv/transform.ftl ./site/sample/csv/contract.csv 
+
+renders the following template
+
+```text
+<#ftl output_format="plainText" strip_text="true">
+<#assign csvParser = createCsvParser(Documents.get(0))>
+<#assign csvPrinter = createCsvPrinter()>
+<#-- Print each line without materializing the CSV in memory -->
+<#compress>
+    <#list csvParser.iterator() as record>
+        ${csvPrinter.printRecord(record)}
+    </#list>
+</#compress>
+
+<#function createCsvParser document>
+    <#assign initialCvsInFormat = CSVTool.formats[SystemTool.getParameter("csv.in.format", "DEFAULT")]>
+    <#assign csvInDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.in.delimiter", initialCvsInFormat.getDelimiter()))>
+    <#assign cvsInFormat = initialCvsInFormat.withDelimiter(csvInDelimiter)>
+    <#return CSVTool.parse(document, cvsInFormat)>
+</#function>
+
+<#function createCsvPrinter>
+    <#assign initialCvsOutFormat = CSVTool.formats[SystemTool.getParameter("csv.out.format", "DEFAULT")]>
+    <#assign csvOutDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.out.delimiter", initialCvsOutFormat.getDelimiter()))>
+    <#assign cvsOutFormat = initialCvsOutFormat.withDelimiter(csvOutDelimiter)>
+    <#return CSVTool.printer(cvsOutFormat, SystemTool.writer)>
+</#function>
+```
+
+and generates the following output
+
+```text
+contract_id|seller_company_name|customer_company_name|customer_duns_number|contract_affiliate|FERC_tariff_reference|contract_service_agreement_id|contract_execution_date|contract_commencement_date|contract_termination_date|actual_termination_date|extension_provision_description|class_name|term_name|increment_name|increment_peaking_name|product_type_name|product_name|quantity|units_for_contract|rate|rate_minimum|rate_maximum|rate_description|units_for_rate|point_of_receipt_control_area|point_of_receipt_specific_location|point_of_delivery_control_area|point_of_delivery_specific_location|begin_date|end_date|time_zone
+C71|The Electric Company|The Power Company|456543333|N|FERC Electric Tariff Original Volume No. 10|2|2/15/2001|2/15/2001|||Evergreen|N/A|N/A|N/A|N/A|MB|ENERGY|0||" "|" "|" "|Market Based||||||||ES
+C72|The Electric Company|Utility A|38495837|n|FERC Electric Tariff Original Volume No. 10|15|7/25/2001|8/1/2001|||Evergreen|N/A|N/A|N/A|N/A|MB|ENERGY|0||" "|" "|" "|Market Based||||||||ES
+C73|The Electric Company|Utility B|493758794|N|FERC Electric Tariff Original Volume No. 10|7|6/8/2001|7/6/2001|||Evergreen|N/A|N/A|N/A|N/A|MB|ENERGY|0||" "|" "|" "|Market Based||||" "|" "|||ep
+C74|The Electric Company|Utility C|594739573|n|FERC Electric Tariff Original Volume No. 10|25|6/8/2001|7/6/2001|||Evergreen|N/A|N/A|N/A|N/A|MB|ENERGY|0||" "|" "|" "|Market Based||||" "|" "|||ep
+```
+
+Some useful hints
+
+* For available CSV formats please see [Apache Commons CSV User Guide](http://commons.apache.org/proper/commons-csv/user-guide.html)
+* Stripping the Excel BOM (Byte Order Mark) works out-of-box
+
+## 6.12 Executing Arbitrary Commands
+
+Using Apache Commons Exec allows to execute arbitrary commands - nice but dangerous. It was recently quite useful to to invoke AWS CLI to generate a Confluence page about the overall setup of our AWS accounts. 
+
+A few snippets to illustrate the points
+
+```text
+<#ftl output_format="plainText" strip_whitespace="true">
+<#assign profile = SystemTool.getProperty("profile", "default")>
+<#assign ec2Instances = ec2Instances()/>
+
+h3. AWS EC2 Instance
+<@printEc2Instances ec2Instances/>
+
+<#function ec2Instances>
+    <#local json = awsCliToJson("aws ec2 describe-instances --profile ${profile}")>
+    <#local instances = json.read("$.Reservations[*].Instances[*]")>
+    <#return instances?sort_by(['InstanceType'])>
+</#function>
+
+<#function awsCliToJson line>
+    <#local output = ExecTool.execute(line)>
+    <#return JsonPathTool.parse(output)>
+</#function>
+
+<#function getAwsEc2InstanceTag tags name>
+    <#return tags?filter(x -> x["Key"] == name)?first["Value"]!"">
+</#function>
+
+<#macro printEc2Instances ec2Instances>
+    <#compress>
+        || NAME || INSTANCE_TYPE || VCPUS || STATE || PRIVATE_IP_ADDRESS ||
+        <#list ec2Instances as ec2Instance>
+            <#assign instanceType = ec2Instance["InstanceType"]>
+            <#assign arn = ec2Instance["IamInstanceProfile"]["Arn"]>
+            <#assign privateIpAddress = ec2Instance["PrivateIpAddress"]>
+            <#assign state = ec2Instance["State"]["Name"]>
+            <#assign launchTime = ec2Instance["LaunchTime"]>
+
+            <#assign coreCount = ec2Instance["CpuOptions"]["CoreCount"]?number>
+            <#assign threadsPerCore = ec2Instance["CpuOptions"]["ThreadsPerCore"]?number>
+            <#assign nrOfVirtualCpus = coreCount * threadsPerCore>
+
+            <#assign tags = ec2Instance["Tags"]/>
+            <#assign awsCloudFormationStackId = getAwsEc2InstanceTag(tags, "aws:cloudformation:stack-id")>
+            <#assign awsCloudFormationStackName = getAwsEc2InstanceTag(tags, "aws:cloudformation:stack-name")>
+            <#assign name = getAwsEc2InstanceTag(tags, "Name")>
+            <#assign country = getAwsEc2InstanceTag(tags, "Country")>
+            <#assign environment = getAwsEc2InstanceTag(tags, "Environment")>
+
+            | ${name} | ${instanceType} | ${nrOfVirtualCpus} | ${state} | ${privateIpAddress} |
+        </#list>
+    </#compress>
+</#macro>
+```
+
+## 6.13 Interactive Templates
+
+Sometime you need to apply a CSS, JSON or XPath query in ad ad-hoc way without installing `xmllint`, `jq` or `pup` - in this case you can pass a FreeMarker template in an interactive fashion
+
+```text
+> bin/freemarker-cli -i 'Hello ${SystemTool.envs["USER"]}'; echo
+Hello sgoeschl
+
+> bin/freemarker-cli -i '${JsonPathTool.parse(Documents.first).read("$.info.title")}' site/sample/json/swagger-spec.json; echo
+Swagger Petstore
+
+> bin/freemarker-cli -i '${XmlTool.parse(Documents.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml; echo
+John Smith
+
+> bin/freemarker-cli -i '${JsoupTool.parse(Documents.first).select("a")[0]}' site/sample/html/dependencies.html; echo
+<a href="${project.url}" title="FreeMarker CLI">FreeMarker CLI</a>
+
+> ./bin/freemarker-cli -i '<#list SystemTool.envs as name,value>${name} ==> ${value}${"\n"}</#list>'
+TERM ==> xterm-256color
+LANG ==> en_US
+DISPLAY ==> :0.0
+SHELL ==> /bin/bash
+EDITOR ==> vi
+```
+
+## 6.14 Filtering & Transforming CSV
+
+During an integration project we imported large transactions CSV files (500.000+ records) and in case of import failures the developers would be happy to get a nice outline of the transactions causing the problem (the CSV records have 60+ columns) - in essence it is filtering (based on some primary key) and and transforming into an output format (Markdown).
+
+So lets start the filtering & transformation using the following command line
+
+```text
+> bin/freemarker-cli -e UTF-8 -l de_AT -Dcolumn="Order ID" \
+  -Dvalues=226939189,957081544 \
+  -Dformat=DEFAULT \
+  -Ddelimiter=COMMA \
+  -t templates/csv/md/filter.ftl site/sample/csv/sales-records.csv
+```
+
+and Apache FreeMarker template
+
+```text
+<#ftl output_format="plainText" strip_text="true">
+<#assign document = Documents.get(0)>
+<#assign parser = parser(document)>
+<#assign headers = parser.getHeaderNames()>
+<#assign column = SystemTool.getProperty("column")>
+<#assign values = SystemTool.getProperty("values")?split(",")>
+
+<#-- Process each line without materializing the whole file in memory -->
+
+<#compress>
+    <@writePageHeader document/>
+    <#list parser.iterator() as record>
+        <#if filter(record)>
+            <@writeCsvRecord headers record/>
+        </#if>
+    </#list>
+</#compress>
+
+<#function parser document>
+    <#assign format = CSVTool.formats[SystemTool.getProperty("format", "DEFAULT")]>
+    <#assign delimiter = CSVTool.toDelimiter(SystemTool.getProperty("delimiter", format.getDelimiter()))>
+    <#return CSVTool.parse(document, format.withFirstRecordAsHeader().withDelimiter(delimiter))>
+</#function>
+
+<#function filter record>
+    <#return values?seq_contains(record.get(column))>
+</#function>
+
+<#macro writePageHeader document>
+    # ${document.name}
+</#macro>
+
+<#macro writeCsvRecord headers record>
+    ## Line ${record.getRecordNumber()}
+    | Column    | Value                       |
+    | --------- | --------------------------- |
+    <#list headers as header>
+    | ${header} | ${record.get(header)}       |
+    </#list>
+</#macro>
+
+
+```
+
+yields
+
+```
+# sales-records.csv
+## Line 1
+| Column | Value |
+| --------- | --------------------------- |
+| Region | Central America and the Caribbean |
+| Country | Antigua and Barbuda |
+| Item Type | Baby Food |
+| Sales Channel | Online |
+| Order Priority | M |
+| Order Date | 12/20/2013 |
+| Order ID | 957081544 |
+| Ship Date | 1/11/2014 |
+| Units Sold | 552 |
+| Unit Price | 255.28 |
+| Unit Cost | 159.42 |
+| Total Revenue | 140914.56 |
+| Total Cost | 87999.84 |
+| Total Profit | 52914.72 |
+## Line 4.998
+| Column | Value |
+| --------- | --------------------------- |
+| Region | Asia |
+| Country | Myanmar |
+| Item Type | Baby Food |
+| Sales Channel | Offline |
+| Order Priority | H |
+| Order Date | 11/23/2016 |
+| Order ID | 226939189 |
+| Ship Date | 12/10/2016 |
+| Units Sold | 5204 |
+| Unit Price | 255.28 |
+| Unit Cost | 159.42 |
+| Total Revenue | 1328477.12 |
+| Total Cost | 829621.68 |
+| Total Profit | 498855.44 |
+```
+
+## 6.15 Using Advanced FreeMarker Features
+
+There is a `demo.ftl` which shows some advanced FreeMarker functionality
+
+* Invoking a Java constructor
+* Invoke a static method of non-instantiable class
+* Work with Java enumerations
+* Access System properties
+* Access Environment variables
+
+Running 
+
+> ./bin/freemarker-cli -t templates/demo.ftl 
+
+gives you
+
+```text
+1) FreeMarker Special Variables
+---------------------------------------------------------------------------
+FreeMarker version     : 2.3.29
+Template name          : templates/demo.ftl
+Language               : en
+Locale                 : en_US
+Timestamp              : Feb 22, 2020 4:54:19 PM
+Output encoding        : UTF-8
+Output format          : plainText
+
+2) Invoke a constructor of a Java class
+---------------------------------------------------------------------------
+new java.utilDate(1000 * 3600 * 24): Jan 2, 1970 1:00:00 AM
+
+3) Invoke a static method of an non-constructor class
+---------------------------------------------------------------------------
+Random UUID              : 1fdb5ead-80a3-418c-bcc7-242e41b4e950
+System.currentTimeMillis : 1,582,386,859,782
+
+4) Access an Enumeration
+---------------------------------------------------------------------------
+java.math.RoundingMode#UP: UP
+
+5) Loop Over The Values Of An Enumeration
+---------------------------------------------------------------------------
+- java.math.RoundingMode.UP
+- java.math.RoundingMode.DOWN
+- java.math.RoundingMode.CEILING
+- java.math.RoundingMode.FLOOR
+- java.math.RoundingMode.HALF_UP
+- java.math.RoundingMode.HALF_DOWN
+- java.math.RoundingMode.HALF_EVEN
+- java.math.RoundingMode.UNNECESSARY
+
+6) Display list of input files
+---------------------------------------------------------------------------
+List all files:
+
+7) SystemTool
+---------------------------------------------------------------------------
+Host name       : W0GL5179.local
+Command line    : -t, templates/demo.ftl
+System property : sgoeschl
+Timestamp       : 1582386860080
+Environment var : sgoeschl
+
+8) Access System Properties
+---------------------------------------------------------------------------
+app.dir      : 
+app.home     : /Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler
+app.pid      : 71792
+basedir      : /Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler
+java.version : 1.8.0_192
+user.name    : sgoeschl
+user.dir     : /Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler
+user.home    : /Users/sgoeschl
+
+9) List Environment Variables
+---------------------------------------------------------------------------
+- TERM ==> xterm-256color
+- LANG ==> en_US
+- DISPLAY ==> :0.0
+- SHELL ==> /bin/bash
+- EDITOR ==> vi
+
+10) List System Properties
+---------------------------------------------------------------------------
+- java.runtime.name ==> Java(TM) SE Runtime Environment
+- java.vm.version ==> 25.192-b12
+- java.vm.vendor ==> Oracle Corporation
+- java.vendor.url ==> http://java.oracle.com/
+- java.vm.name ==> Java HotSpot(TM) 64-Bit Server VM
+
+11) Access Documents
+---------------------------------------------------------------------------
+Get the number of documents:
+- 0
+List all files containing "README" in the name
+List all files having "md" extension
+Get all documents
+
+12) FreeMarker CLI Tools
+---------------------------------------------------------------------------
+- CSVTool              : Process CSV files using Apache Commons CSV (see https://commons.apache.org/proper/commons-csv/)
+- ExcelTool            : Process Excels files (XLS, XLSX) using Apache POI (see https://poi.apache.org)
+- ExecTool             : Execute command line tools using Apache Commons Exec (see https://commons.apache.org/proper/commons-exec/)
+- FreeMarkerTool       : Expose useful Apache FreeMarker classes
+- GrokTool             : Process text files using Grok expressions (see https://github.com/thekrakken/java-grok)
+- JsonPathTool         : Process JSON files using Java JSON Path (see https://github.com/json-path/JsonPath)
+- JsoupTool            : Process  HTML files using Jsoup (see https://jsoup.org)
+- PropertiesTool       : Process JDK properties files
+- SystemTool           : Expose System-related utility methods
+- UUIDTool             : Create UUIDs
+- XmlTool              : Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html)
+- YamlTool             : Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home)
+
+13) Document Data Model
+---------------------------------------------------------------------------
+- CSVTool
+- Documents
+- ExcelTool
+- ExecTool
+- FreeMarkerTool
+- GrokTool
+- JsonPathTool
+- JsoupTool
+- PropertiesTool
+- SystemTool
+- UUIDTool
+- XmlTool
+- YamlTool
+
+14) Create a UUID
+---------------------------------------------------------------------------
+UUIDTool Random UUID  : 936315a5-ee3d-44cd-a32c-2be10d2249a6
+UUIDTool Named UUID   : 298415f9-e888-3d98-90e7-6c0d63ad14dc
+
+15) Printing Special Characters
+---------------------------------------------------------------------------
+German Special Characters: äöüßÄÖÜ
+
+16) Locale-specific output
+---------------------------------------------------------------------------
+Small Number :  1.23
+Large Number :  12,345,678.90
+Date         :  Feb 22, 2020
+Time         :  4:54:20 PM
+
+17) Execute a program
+---------------------------------------------------------------------------
+> date
+Sat Feb 22 16:54:20 CET 2020
+```
+
+# 7. Design Considerations
+
+## 7.1 How It Works
+
+* The user-supplied files are loaded or input is read from `stdin`
+* The FreeMarker data model containing the documents and tools is created and passed to the template
+* The generated output is written to the user-supplied file or to `stdout`
+
+## 7.2 FreeMarker Data Model
+
+Within the script a FreeMarker data model is set up and passed to the template - it contains the documents to be processed and the following tools
+
+| Entry                 | Description                                                                                               |
+|-----------------------|-----------------------------------------------------------------------------------------------------------|
+| CSVTool               | Process CSV files using [Apache Commons CSV](https://commons.apache.org/proper/commons-csv/)              |
+| ExecTool              | Execute command line tools using [Apache Commons Exec](https://commons.apache.org/proper/commons-exec/)   |
+| ExcelTool             | Process Excels files (XLS, XLSX) using [Apache POI](https://poi.apache.org)                               |
+| Documents             | Helper class to find documents, e.g. by name, extension or index                                          |
+| FreeMarkerTool        | Expose useful FreeMarker classes                                                                          |
+| GrokTool              | Process text files using [Grok](https://github.com/thekrakken/java-grok) instead of regular expressions   |
+| JsonPathTool          | Process JSON file using [Java JSON Path](https://github.com/json-path/JsonPath)                           |
+| JsoupTool             | Processing HTML files using [Jsoup](https://jsoup.org)                                                    |
+| PropertiesTool        | Process JDK properties files                                                                              |
+| SystemTool            | System-related utility methods                                                                            |
+| XmlTool               | Process XML files using [Apache FreeMarker](https://freemarker.apache.org/docs/xgui.html)                 |
+| YamlTool              | Process YAML files using [SnakeYAML](https://bitbucket.org/asomov/snakeyaml/wiki/Home)                    |
+| UUIDTool              | Create UUIDs                                                                                              |
+
+
+# 8. Tips & Tricks
+
+## 8.1 Template Base Directory
+
+When doing some ad-hoc scripting it is useful to rely on a base directory to resolve the FTL templates
+
+* As a default the FTL templates are resolved relative to the script directory
+* The caller can provide a `-b` or `--basedir` command line parameter
+
+> ./bin/freemarker-cli -t templates/json/html/customer-user-products.ftl freemarker-cli/site/sample/json/customer-user-products.jso
+
+## 8.2 Using Pipes
+
+When doing ad-hoc scripting it useful to pipe the output of one command directly into "freemarker-cli"
+
+> cat site/sample/json/customer-user-products.json | ./bin/freemarker-cli -t ./templates/json/html/customer-user-products.ftl --stdin
\ No newline at end of file
diff --git a/freemarker-generator-cli/pom.xml b/freemarker-generator-cli/pom.xml
new file mode 100644
index 0000000..70855b7
--- /dev/null
+++ b/freemarker-generator-cli/pom.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.freemarker.generator</groupId>
+        <artifactId>freemarker-generator</artifactId>
+        <version>0.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>freemarker-generator-cli</artifactId>
+    <name>Apache FreeMarker Generator: CLI</name>
+    <description>Command-line client for Apache FreeMarker</description>
+
+    <build>
+        <defaultGoal>package</defaultGoal>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>appassembler-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>assemble</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <repositoryLayout>flat</repositoryLayout>
+                    <repositoryName>lib</repositoryName>
+                    <extraJvmArguments>-Xms64m -Xmx512m</extraJvmArguments>
+                    <endorsedDir>endorsed</endorsedDir>
+                    <useWildcardClassPath>true</useWildcardClassPath>
+                    <copyConfigurationDirectory>true</copyConfigurationDirectory>
+                    <configurationDirectory>config</configurationDirectory>
+                    <programs>
+                        <program>
+                            <platforms>
+                                <platform>windows</platform>
+                                <platform>unix</platform>
+                            </platforms>
+                            <mainClass>org.apache.freemarker.generator.cli.Main</mainClass>
+                            <id>freemarker-cli</id>
+                        </program>
+                    </programs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <configuration>
+                            <target>
+                                <copy file="README.md" todir="./target/appassembler" />
+                                <copy file="./src/main/scripts/run-samples.sh" todir="./target/appassembler" />
+                                <copy todir="./target/appassembler/site">
+                                    <fileset dir="site" />
+                                </copy>
+                                <copy todir="./target/appassembler/templates">
+                                    <fileset dir="templates" />
+                                </copy>
+                                <chmod file="./target/appassembler/run-samples.sh" perm="a+x" />
+                            </target>
+                        </configuration>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <configuration>
+                            <tarLongFileMode>gnu</tarLongFileMode>
+                            <descriptors>
+                                <descriptor>${basedir}/src/main/assembly/dist.xml</descriptor>
+                                <descriptor>${basedir}/src/main/assembly/app.xml</descriptor>
+                            </descriptors>
+                        </configuration>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>pl.project13.maven</groupId>
+                <artifactId>git-commit-id-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>get-the-git-infos</id>
+                        <goals>
+                            <goal>revision</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>validate-the-git-infos</id>
+                        <goals>
+                            <goal>validateRevision</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>*.md</exclude>
+                        <exclude>.travis.yml</exclude>
+                        <exclude>src/main/resources/patterns/*</exclude>
+                        <exclude>site/sample/*/**</exclude>
+                        <exclude>src/test/data/encoding/utf8.txt</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-pmd-plugin</artifactId>
+                <configuration>
+                    <linkXRef>false</linkXRef>
+                </configuration>
+            </plugin>
+        </plugins>
+    </reporting>
+
+    <dependencies>
+        <!-- CLI processing -->
+        <dependency>
+            <groupId>info.picocli</groupId>
+            <artifactId>picocli</artifactId>
+            <version>4.1.4</version>
+        </dependency>
+        <!-- Apache FreeMarker Generator Tools -->
+        <dependency>
+            <groupId>org.apache.freemarker.generator</groupId>
+            <artifactId>freemarker-generator-tools</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!-- Logging -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+        </dependency>
+        <!-- Testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>release</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <goals>
+                                    <goal>jar-no-fork</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>
diff --git a/freemarker-generator-cli/run-samples.sh b/freemarker-generator-cli/run-samples.sh
new file mode 100755
index 0000000..4e0e867
--- /dev/null
+++ b/freemarker-generator-cli/run-samples.sh
@@ -0,0 +1,168 @@
+#!/bin/sh
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Check that java is on the path
+
+hash java 2>/dev/null || { echo >&2 "I require JDK but it's not installed.  Aborting."; exit 1; }
+hash mvn 2>/dev/null || { echo >&2 "I require Maven but it's not installed.  Aborting."; exit 1; }
+
+# Run all the samples being documented
+
+mkdir target 2>/dev/null
+mkdir target/out 2>/dev/null
+
+FREEMARKER_CMD="target/appassembler/bin/freemarker-cli"
+# FREEMARKER_CMD="java -jar target/freemarker-cli-2.0.0-BETA-4-SNAPSHOT-jar-with-dependencies.jar"
+
+#############################################################################
+# Info
+#############################################################################
+
+echo "templates/info.ftl"
+$FREEMARKER_CMD -t templates/info.ftl README.md > target/out/info.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# Demo
+#############################################################################
+
+echo "templates/demo.ftl"
+$FREEMARKER_CMD -t templates/demo.ftl README.md > target/out/demo.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# Interactive Mode
+#############################################################################
+
+$FREEMARKER_CMD -i '${JsonPathTool.parse(Documents.first).read("$.info.title")}' site/sample/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${XmlTool.parse(Documents.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${JsoupTool.parse(Documents.first).select("a")[0]}' site/sample/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# CSV
+#############################################################################
+
+echo "templates/csv/html/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/html/transform.ftl site/sample/csv/contract.csv > target/out/contract.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/csv/md/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/md/transform.ftl site/sample/csv/contract.csv > target/out/contract.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/csv/shell/curl.ftl"
+$FREEMARKER_CMD -t ./templates/csv/shell/curl.ftl site/sample/csv/user.csv > target/out/curl.sh || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/csv/md/filter.ftl"
+$FREEMARKER_CMD -e UTF-8 -l de_AT -Pcolumn="Order ID" -Pvalues=226939189,957081544 -Pformat=DEFAULT -Pdelimiter=COMMA -t templates/csv/md/filter.ftl site/sample/csv/sales-records.csv > target/out/sales-records.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# CSV To XML-FO & PDF
+#############################################################################
+
+echo "templates/csv/fo/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/fo/transform.ftl site/sample/csv/locker-test-users.csv > target/out/locker-test-users.fo || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash fop 2>/dev/null; then
+	echo "fop -fo target/out/locker-test-users.fo target/out/locker-test-users.pdf"
+    fop -fo target/out/locker-test-users.fo target/out/locker-test-users.pdf 2>/dev/null || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+echo "templates/csv/fo/transactions.ftl"
+$FREEMARKER_CMD -t templates/csv/fo/transactions.ftl site/sample/csv/transactions.csv > target/out/transactions.fo || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash fop 2>/dev/null; then
+	echo "fop -fo target/out/transactions.fo target/out/transactions-fo.pdf"
+    fop -fo target/out/transactions.fo target/out/transactions-fo.pdf 2>/dev/null || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+#############################################################################
+# CSV to HTML & PDF
+#############################################################################
+
+echo "templates/csv/html/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/html/transactions.ftl site/sample/csv/transactions.csv > target/out/transactions.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash wkhtmltopdf 2>/dev/null; then
+	echo "wkhtmltopdf -O landscape target/out/transactions.html target/out/transactions-html.pdf"
+    wkhtmltopdf -O landscape target/out/transactions.html target/out/transactions-html.pdf 2>/dev/null || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+#############################################################################
+# Grok
+#############################################################################
+
+echo "templates/accesslog/combined-access.ftl"
+$FREEMARKER_CMD -t templates/accesslog/combined-access.ftl site/sample/accesslog/combined-access.log > target/out/combined-access.log.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# Excel
+#############################################################################
+
+echo "templates/excel/html/transform.ftl"
+$FREEMARKER_CMD -t templates/excel/html/transform.ftl site/sample/excel/test.xls > target/out/test.xls.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -t templates/excel/html/transform.ftl site/sample/excel/test.xlsx > target/out/test.xslx.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -t templates/excel/html/transform.ftl site/sample/excel/test-multiple-sheets.xlsx > target/out/test-multiple-sheets.xlsx.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/excel/md/transform.ftl"
+$FREEMARKER_CMD -t templates/excel/md/transform.ftl site/sample/excel/test-multiple-sheets.xlsx > target/out/test-multiple-sheets.xlsx.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/excel/csv/transform.ftl"
+$FREEMARKER_CMD -t templates/excel/csv/transform.ftl site/sample/excel/test-multiple-sheets.xlsx > target/out/test-multiple-sheets.xlsx.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/excel/csv/custom.ftl"
+$FREEMARKER_CMD -t templates/excel/csv/custom.ftl -Pcsv.format=MYSQL site/sample/excel/test.xls > target/out/test-transform-xls.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# HTML
+#############################################################################
+
+echo "templates/html/csv/dependencies.ftl"
+$FREEMARKER_CMD -t templates/html/csv/dependencies.ftl site/sample/html/dependencies.html > target/out/dependencies.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# JSON
+#############################################################################
+
+echo "templates/json/csv/swagger-endpoints.ftl"
+$FREEMARKER_CMD -t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json > target/out/swagger-spec.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash curl 2>/dev/null; then
+echo "templates/json/md/github-users.ftl"
+$FREEMARKER_CMD -t templates/json/md/github-users.ftl site/sample/json/github-users.json > target/out/github-users-curl.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+#############################################################################
+# Properties
+#############################################################################
+
+echo "templates/properties/csv/locker-test-users.ftl"
+$FREEMARKER_CMD -t templates/properties/csv/locker-test-users.ftl site/sample/properties > target/out/locker-test-users.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# YAML
+#############################################################################
+
+echo "templates/yaml/txt/transform.ftl"
+$FREEMARKER_CMD -t ./templates/yaml/txt/transform.ftl ./site/sample/yaml/customer.yaml > target/out/customer.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# XML
+#############################################################################
+
+echo "templates/xml/txt/recipients.ftl"
+$FREEMARKER_CMD -t ./templates/xml/txt/recipients.ftl site/sample/xml/recipients.xml > target/out/recipients.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "Created the following sample files in ./target/out"
+ls -l ./target/out
+
diff --git a/freemarker-generator-cli/site/image/contract.png b/freemarker-generator-cli/site/image/contract.png
new file mode 100644
index 0000000..e69f0eb
--- /dev/null
+++ b/freemarker-generator-cli/site/image/contract.png
Binary files differ
diff --git a/freemarker-generator-cli/site/image/excel-to-html.png b/freemarker-generator-cli/site/image/excel-to-html.png
new file mode 100644
index 0000000..ddb561f
--- /dev/null
+++ b/freemarker-generator-cli/site/image/excel-to-html.png
Binary files differ
diff --git a/freemarker-generator-cli/site/image/github.png b/freemarker-generator-cli/site/image/github.png
new file mode 100644
index 0000000..e39415a
--- /dev/null
+++ b/freemarker-generator-cli/site/image/github.png
Binary files differ
diff --git a/freemarker-generator-cli/site/image/locker-test-users-pdf.png b/freemarker-generator-cli/site/image/locker-test-users-pdf.png
new file mode 100644
index 0000000..67a9eb7
--- /dev/null
+++ b/freemarker-generator-cli/site/image/locker-test-users-pdf.png
Binary files differ
diff --git a/freemarker-generator-cli/site/image/transactions.png b/freemarker-generator-cli/site/image/transactions.png
new file mode 100644
index 0000000..d7d0fc1
--- /dev/null
+++ b/freemarker-generator-cli/site/image/transactions.png
Binary files differ
diff --git a/freemarker-generator-cli/site/sample/accesslog/combined-access.log b/freemarker-generator-cli/site/sample/accesslog/combined-access.log
new file mode 100644
index 0000000..d56f485
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/accesslog/combined-access.log
@@ -0,0 +1,10 @@
+222.64.146.118 - - [19/Jun/2005:06:44:17 +0200] "GET /wximages/wxwidgets02-small.png HTTP/1.1" 200 12468 "http://blog.vckbase.com/bastet/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler )"
+218.84.191.50 - - [19/Jun/2005:06:46:05 +0200] "GET /wximages/wxwidgets02-small.png HTTP/1.1" 200 12468 "http://blog.vckbase.com/bastet/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
+202.201.245.20 - - [19/Jun/2005:06:47:37 +0200] "GET /wximages/wxwidgets02-small.png HTTP/1.1" 200 12468 "http://blog.vckbase.com/bastet/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
+138.243.201.10 - - [19/Jun/2005:06:48:40 +0200] "GET /wiki.pl?WxWidgets_Bounties HTTP/1.1" 200 8873 "http://www.wxwidgets.org/toolbar.htm" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.7) Gecko/20050414 Firefox/1.0.3"
+68.251.52.253 - - [19/Jun/2005:06:50:49 +0200] "GET /wiki.pl?WxWidgets_Compared_To_Other_Toolkits HTTP/1.1" 200 19476 "http://www.google.com/search?q=wxWidget+designer" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4"
+68.251.52.253 - - [19/Jun/2005:06:50:49 +0200] "GET /wxwiki.css HTTP/1.1" 200 1540 "http://wiki.wxwidgets.org/wiki.pl?WxWidgets_Compared_To_Other_Toolkits" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4"
+68.251.52.253 - - [19/Jun/2005:06:50:49 +0200] "GET /wximages/wxwidgets02-small.png HTTP/1.1" 200 12468 "http://wiki.wxwidgets.org/wiki.pl?WxWidgets_Compared_To_Other_Toolkits" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4"
+68.251.52.253 - - [19/Jun/2005:06:50:50 +0200] "GET /favicon.ico HTTP/1.1" 200 3262 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4"
+61.177.31.179 - - [19/Jun/2005:06:52:36 +0200] "GET /wximages/wxwidgets02-small.png HTTP/1.1" 200 12468 "http://blog.vckbase.com/bastet/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
+216.148.248.43 - - [19/Jun/2005:06:53:14 +0200] "GET / HTTP/1.0" 200 3369 "-" "Mozilla/4.0 (compatible;)"
\ No newline at end of file
diff --git a/freemarker-generator-cli/site/sample/csv/contract.csv b/freemarker-generator-cli/site/sample/csv/contract.csv
new file mode 100644
index 0000000..6ce0d00
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/csv/contract.csv
@@ -0,0 +1,23 @@
+contract_id,seller_company_name,customer_company_name,customer_duns_number,contract_affiliate,FERC_tariff_reference,contract_service_agreement_id,contract_execution_date,contract_commencement_date,contract_termination_date,actual_termination_date,extension_provision_description,class_name,term_name,increment_name,increment_peaking_name,product_type_name,product_name,quantity,units_for_contract,rate,rate_minimum,rate_maximum,rate_description,units_for_rate,point_of_receipt_control_area,point_of_receipt_specific_location,point_of_delivery_control_area,point_of_delivery_specific_location,begin_date,end_date,time_zone
+C71,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Original Volume No. 10,2,2/15/2001,2/15/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,,,,,,ES
+C72,The Electric Company,Utility A,38495837,n,FERC Electric Tariff Original Volume No. 10,15,7/25/2001,8/1/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,,,,,,ES
+C73,The Electric Company,Utility B,493758794,N,FERC Electric Tariff Original Volume No. 10,7,6/8/2001,7/6/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,, , ,,,ep
+C74,The Electric Company,Utility C,594739573,n,FERC Electric Tariff Original Volume No. 10,25,6/8/2001,7/6/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,, , ,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,ENERGY,2000,KWh,.1475, , ,Max amount of capacity and energy to be transmitted.  Bill based on monthly max delivery to City.,$/KWh,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,point-to-point agreement,2000,KW,0.01, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,network,2000,KW,0.2, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,BLACK START SERVICE,2000,KW,0.22, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,CAPACITY,2000,KW,0.04, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,regulation & frequency response,2000,KW,0.1, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,real power transmission loss,2000,KW,7, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C76,The Electric Company,The Power Company,456534333,N,FERC Electric Tariff Original Volume No. 10,132,12/15/2001,1/1/2002,12/31/2004,12/31/2004,None,F,LT,M,FP,MB,CAPACITY,70,MW,3750, , ,70MW for each and every hour over the term of the agreement (7x24 schedule).,$/MW,,,,,,,ep
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,35, , ,,$/MWH,,,PJM,Bus 4321,20020101,20030101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,37, , ,,$/MWH,,,PJM,Bus 4321,20030101,20040101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,39, , ,,$/MWH,,,PJM,Bus 4321,20040101,20050101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,41, , ,,$/MWH,,,PJM,Bus 4321,20050101,20060101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,43, , ,,$/MWH,,,PJM,Bus 4321,20060101,20070101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,45, , ,,$/MWH,,,PJM,Bus 4321,20070101,20080101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,47, , ,,$/MWH,,,PJM,Bus 4321,20080101,20090101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,49, , ,,$/MWH,,,PJM,Bus 4321,20090101,20100101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,51, , ,,$/MWH,,,PJM,Bus 4321,20100101,20110101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,53, , ,,$/MWH,,,PJM,Bus 4321,20110101,20120101,EP
diff --git a/freemarker-generator-cli/site/sample/csv/excel-export-utf8.csv b/freemarker-generator-cli/site/sample/csv/excel-export-utf8.csv
new file mode 100644
index 0000000..8022365
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/csv/excel-export-utf8.csv
@@ -0,0 +1,3 @@
+Text;Date;Number;Currency;Time;Percentage;Forumula
+Row 1;01.01.17;100,00;€100,00;10:00;50,00%;50
+Row 2;01.01.17;100,00;€100,00;10:00;50,00%;50
\ No newline at end of file
diff --git a/freemarker-generator-cli/site/sample/csv/locker-test-users.csv b/freemarker-generator-cli/site/sample/csv/locker-test-users.csv
new file mode 100644
index 0000000..ed5d129
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/csv/locker-test-users.csv
@@ -0,0 +1,5 @@
+TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION
+TENANT_A,fat,user_0004,user_0004,password_0004,,,
+TENANT_B,fat,user_0001,user_0001,password_0001,,,
+TENANT_B,uat,user_0003,user_0003,password_0003,,,
+TENANT_C,fat,user_0002,user_0002,password_0004,000000,,Many products
\ No newline at end of file
diff --git a/freemarker-generator-cli/site/sample/csv/sales-records.csv b/freemarker-generator-cli/site/sample/csv/sales-records.csv
new file mode 100755
index 0000000..d589719
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/csv/sales-records.csv
@@ -0,0 +1,5001 @@
+Region,Country,Item Type,Sales Channel,Order Priority,Order Date,Order ID,Ship Date,Units Sold,Unit Price,Unit Cost,Total Revenue,Total Cost,Total Profit
+Central America and the Caribbean,Antigua and Barbuda ,Baby Food,Online,M,12/20/2013,957081544,1/11/2014,552,255.28,159.42,140914.56,87999.84,52914.72
+Central America and the Caribbean,Panama,Snacks,Offline,C,7/5/2010,301644504,7/26/2010,2167,152.58,97.44,330640.86,211152.48,119488.38
+Europe,Czech Republic,Beverages,Offline,C,9/12/2011,478051030,9/29/2011,4778,47.45,31.79,226716.10,151892.62,74823.48
+Asia,North Korea,Cereal,Offline,L,5/13/2010,892599952,6/15/2010,9016,205.70,117.11,1854591.20,1055863.76,798727.44
+Asia,Sri Lanka,Snacks,Offline,C,7/20/2015,571902596,7/27/2015,7542,152.58,97.44,1150758.36,734892.48,415865.88
+Middle East and North Africa,Morocco,Personal Care,Offline,L,11/8/2010,412882792,11/22/2010,48,81.73,56.67,3923.04,2720.16,1202.88
+Australia and Oceania,Federated States of Micronesia,Clothes,Offline,H,3/28/2011,932776868,5/10/2011,8258,109.28,35.84,902434.24,295966.72,606467.52
+Europe,Bosnia and Herzegovina,Clothes,Online,M,10/14/2013,919133651,11/4/2013,927,109.28,35.84,101302.56,33223.68,68078.88
+Middle East and North Africa,Afghanistan,Clothes,Offline,M,8/27/2016,579814469,10/5/2016,8841,109.28,35.84,966144.48,316861.44,649283.04
+Sub-Saharan Africa,Ethiopia,Baby Food,Online,M,4/13/2015,192993152,5/7/2015,9817,255.28,159.42,2506083.76,1565026.14,941057.62
+Middle East and North Africa,Turkey,Office Supplies,Offline,C,9/25/2013,557156026,10/15/2013,3704,651.21,524.96,2412081.84,1944451.84,467630.00
+Middle East and North Africa,Oman,Cosmetics,Online,M,5/12/2013,741101920,5/17/2013,7382,437.20,263.33,3227410.40,1943902.06,1283508.34
+Asia,Malaysia,Cereal,Offline,L,7/31/2016,333942162,8/25/2016,9762,205.70,117.11,2008043.40,1143227.82,864815.58
+Central America and the Caribbean,Saint Lucia,Cosmetics,Offline,H,7/6/2015,795100581,7/16/2015,6786,437.20,263.33,2966839.20,1786957.38,1179881.82
+Central America and the Caribbean,Saint Vincent and the Grenadines,Baby Food,Online,L,11/28/2010,504313504,12/3/2010,6428,255.28,159.42,1640939.84,1024751.76,616188.08
+Middle East and North Africa,Lebanon,Meat,Offline,H,12/17/2015,611629760,1/31/2016,3693,421.89,364.69,1558039.77,1346800.17,211239.60
+Europe,Austria,Cereal,Offline,C,8/13/2014,987410676,9/6/2014,5616,205.70,117.11,1155211.20,657689.76,497521.44
+Europe,Bulgaria,Office Supplies,Online,L,10/31/2010,672330081,11/29/2010,6266,651.21,524.96,4080481.86,3289399.36,791082.50
+North America,Mexico,Beverages,Online,C,3/13/2017,127374303,3/20/2017,1742,47.45,31.79,82657.90,55378.18,27279.72
+Central America and the Caribbean,Trinidad and Tobago,Baby Food,Offline,C,4/16/2013,783842170,6/1/2013,5172,255.28,159.42,1320308.16,824520.24,495787.92
+Middle East and North Africa,Libya,Beverages,Offline,L,1/18/2010,993345010,3/3/2010,1718,47.45,31.79,81519.10,54615.22,26903.88
+Middle East and North Africa,Algeria,Baby Food,Offline,M,9/5/2015,977806651,10/14/2015,3572,255.28,159.42,911860.16,569448.24,342411.92
+Europe,Estonia,Fruits,Online,L,9/28/2016,579463422,11/1/2016,4958,9.33,6.92,46258.14,34309.36,11948.78
+Australia and Oceania,Tuvalu,Beverages,Offline,L,3/22/2012,610864150,4/7/2012,7132,47.45,31.79,338413.40,226726.28,111687.12
+Middle East and North Africa,Saudi Arabia,Snacks,Offline,L,4/25/2017,604870164,6/5/2017,3378,152.58,97.44,515415.24,329152.32,186262.92
+Central America and the Caribbean,Cuba,Cereal,Online,H,3/13/2014,164655292,5/1/2014,4015,205.70,117.11,825885.50,470196.65,355688.85
+Europe,Montenegro,Fruits,Offline,L,5/29/2016,313705861,7/10/2016,1390,9.33,6.92,12968.70,9618.80,3349.90
+Central America and the Caribbean,Guatemala,Office Supplies,Online,M,1/17/2012,345820701,2/1/2012,4885,651.21,524.96,3181160.85,2564429.60,616731.25
+Sub-Saharan Africa,Guinea,Baby Food,Online,M,12/27/2012,975111138,1/21/2013,5910,255.28,159.42,1508704.80,942172.20,566532.60
+Australia and Oceania,Vanuatu,Snacks,Online,C,4/1/2013,286001002,4/15/2013,2907,152.58,97.44,443550.06,283258.08,160291.98
+Middle East and North Africa,United Arab Emirates,Cosmetics,Offline,H,6/26/2015,483226621,8/6/2015,6350,437.20,263.33,2776220.00,1672145.50,1104074.50
+Australia and Oceania,Australia,Clothes,Offline,M,1/17/2012,241836822,1/17/2012,3744,109.28,35.84,409144.32,134184.96,274959.36
+Middle East and North Africa,Oman,Clothes,Online,H,7/3/2011,557192933,7/5/2011,4626,109.28,35.84,505529.28,165795.84,339733.44
+Sub-Saharan Africa,Malawi,Meat,Online,L,2/17/2012,694968783,4/2/2012,5562,421.89,364.69,2346552.18,2028405.78,318146.40
+Middle East and North Africa,Lebanon,Fruits,Online,H,4/5/2013,441150701,5/12/2013,5150,9.33,6.92,48049.50,35638.00,12411.50
+Europe,Czech Republic,Cereal,Online,M,7/8/2011,552037513,8/5/2011,9022,205.70,117.11,1855825.40,1056566.42,799258.98
+Australia and Oceania,Vanuatu,Cosmetics,Offline,C,2/24/2012,504240548,3/27/2012,4838,437.20,263.33,2115173.60,1273990.54,841183.06
+Europe,Luxembourg,Vegetables,Offline,L,2/13/2010,744683635,4/1/2010,7291,154.06,90.93,1123251.46,662970.63,460280.83
+Sub-Saharan Africa,Benin,Personal Care,Online,L,8/7/2016,440603101,9/15/2016,3104,81.73,56.67,253689.92,175903.68,77786.24
+Middle East and North Africa,Somalia,Clothes,Offline,L,4/26/2017,629547774,5/3/2017,6031,109.28,35.84,659067.68,216151.04,442916.64
+Europe,Switzerland,Meat,Online,L,3/21/2014,169378983,4/10/2014,1860,421.89,364.69,784715.40,678323.40,106392.00
+Middle East and North Africa,Saudi Arabia,Personal Care,Offline,L,2/2/2014,688270556,3/4/2014,3407,81.73,56.67,278454.11,193074.69,85379.42
+Asia,Laos,Meat,Online,L,3/21/2017,734708821,3/24/2017,5522,421.89,364.69,2329676.58,2013818.18,315858.40
+Asia,Kyrgyzstan,Snacks,Online,C,8/6/2013,727492606,9/22/2013,84,152.58,97.44,12816.72,8184.96,4631.76
+Middle East and North Africa,Algeria,Baby Food,Offline,M,12/30/2016,705733239,1/25/2017,1003,255.28,159.42,256045.84,159898.26,96147.58
+Sub-Saharan Africa,Angola,Office Supplies,Offline,C,10/3/2015,778854548,10/3/2015,9224,651.21,524.96,6006761.04,4842231.04,1164530.00
+Sub-Saharan Africa,Mauritania,Cosmetics,Offline,M,5/30/2014,676592862,7/9/2014,7718,437.20,263.33,3374309.60,2032380.94,1341928.66
+Middle East and North Africa,Lebanon,Household,Offline,M,10/15/2014,198997008,10/16/2014,6492,668.27,502.54,4338408.84,3262489.68,1075919.16
+Europe,Finland,Beverages,Online,H,3/16/2012,566428315,3/23/2012,7581,47.45,31.79,359718.45,240999.99,118718.46
+Asia,Taiwan,Baby Food,Online,M,5/27/2014,369560611,6/13/2014,52,255.28,159.42,13274.56,8289.84,4984.72
+Europe,Belgium,Snacks,Online,M,1/12/2015,519380223,1/17/2015,5005,152.58,97.44,763662.90,487687.20,275975.70
+Asia,Laos,Office Supplies,Online,H,8/10/2012,197185981,9/11/2012,568,651.21,524.96,369887.28,298177.28,71710.00
+Europe,San Marino,Office Supplies,Online,H,4/13/2014,904589211,5/4/2014,6905,651.21,524.96,4496605.05,3624848.80,871756.25
+Australia and Oceania,Tuvalu,Household,Offline,H,11/23/2016,613513743,12/31/2016,1205,668.27,502.54,805265.35,605560.70,199704.65
+Australia and Oceania,Kiribati,Clothes,Offline,M,10/22/2010,516195905,10/29/2010,2694,109.28,35.84,294400.32,96552.96,197847.36
+Asia,Kyrgyzstan,Vegetables,Offline,H,12/3/2013,975184524,1/17/2014,7626,154.06,90.93,1174861.56,693432.18,481429.38
+Australia and Oceania,Samoa ,Clothes,Online,M,12/8/2014,173340928,1/3/2015,4287,109.28,35.84,468483.36,153646.08,314837.28
+Sub-Saharan Africa,Central African Republic,Personal Care,Offline,H,12/16/2014,863838946,1/5/2015,7995,81.73,56.67,653431.35,453076.65,200354.70
+Asia,Uzbekistan,Cereal,Offline,L,3/2/2016,920164906,3/6/2016,6099,205.70,117.11,1254564.30,714253.89,540310.41
+Central America and the Caribbean,Dominica,Meat,Online,M,6/12/2010,986117637,7/30/2010,2977,421.89,364.69,1255966.53,1085682.13,170284.40
+Middle East and North Africa,Qatar,Cereal,Online,L,6/18/2013,425808465,7/18/2013,5042,205.70,117.11,1037139.40,590468.62,446670.78
+Central America and the Caribbean,Saint Lucia,Beverages,Online,L,6/12/2015,473661220,7/3/2015,5736,47.45,31.79,272173.20,182347.44,89825.76
+Europe,Bosnia and Herzegovina,Baby Food,Online,C,4/4/2015,184412229,4/7/2015,531,255.28,159.42,135553.68,84652.02,50901.66
+Asia,South Korea,Vegetables,Offline,H,8/12/2016,483110320,9/30/2016,1934,154.06,90.93,297952.04,175858.62,122093.42
+Central America and the Caribbean,Trinidad and Tobago,Household,Online,H,9/22/2016,115116822,11/1/2016,4481,668.27,502.54,2994517.87,2251881.74,742636.13
+Middle East and North Africa,Somalia,Baby Food,Online,M,1/29/2010,596105563,3/20/2010,9738,255.28,159.42,2485916.64,1552431.96,933484.68
+Sub-Saharan Africa,Nigeria,Snacks,Online,C,12/10/2014,362062871,12/23/2014,1304,152.58,97.44,198964.32,127061.76,71902.56
+Sub-Saharan Africa,South Africa,Beverages,Online,H,7/28/2016,619287574,8/2/2016,9810,47.45,31.79,465484.50,311859.90,153624.60
+Central America and the Caribbean,Saint Vincent and the Grenadines,Clothes,Offline,H,6/10/2016,394391000,6/23/2016,7916,109.28,35.84,865060.48,283709.44,581351.04
+Sub-Saharan Africa,Sudan,Beverages,Online,M,4/16/2013,584296977,4/28/2013,5315,47.45,31.79,252196.75,168963.85,83232.90
+Middle East and North Africa,Algeria,Clothes,Offline,M,7/5/2014,806241834,8/15/2014,3730,109.28,35.84,407614.40,133683.20,273931.20
+Europe,Netherlands,Meat,Offline,M,3/8/2017,747774398,4/3/2017,1916,421.89,364.69,808341.24,698746.04,109595.20
+Central America and the Caribbean,Panama,Meat,Online,H,11/24/2011,616755998,12/3/2011,660,421.89,364.69,278447.40,240695.40,37752.00
+Australia and Oceania,Solomon Islands,Baby Food,Offline,C,10/20/2016,691360461,11/7/2016,7779,255.28,159.42,1985823.12,1240128.18,745694.94
+Central America and the Caribbean,Saint Vincent and the Grenadines,Beverages,Online,C,4/1/2013,870074117,5/16/2013,3121,47.45,31.79,148091.45,99216.59,48874.86
+Middle East and North Africa,Iran,Office Supplies,Online,H,3/1/2010,221695792,3/20/2010,3566,651.21,524.96,2322214.86,1872007.36,450207.50
+Australia and Oceania,Vanuatu,Fruits,Online,M,7/13/2017,135336816,8/17/2017,8026,9.33,6.92,74882.58,55539.92,19342.66
+Australia and Oceania,Federated States of Micronesia,Office Supplies,Online,L,4/29/2012,270421016,5/23/2012,2443,651.21,524.96,1590906.03,1282477.28,308428.75
+Sub-Saharan Africa,Equatorial Guinea,Household,Online,H,6/16/2010,806684720,7/18/2010,4790,668.27,502.54,3201013.30,2407166.60,793846.70
+Europe,Russia,Household,Online,M,7/10/2017,194176757,8/20/2017,72,668.27,502.54,48115.44,36182.88,11932.56
+Middle East and North Africa,Azerbaijan,Baby Food,Offline,H,6/28/2017,103258454,8/15/2017,5326,255.28,159.42,1359621.28,849070.92,510550.36
+Middle East and North Africa,Iraq,Office Supplies,Online,H,4/21/2014,474603641,5/30/2014,4619,651.21,524.96,3007938.99,2424790.24,583148.75
+Sub-Saharan Africa,Mauritius ,Cereal,Online,H,12/26/2012,869198644,1/5/2013,4049,205.70,117.11,832879.30,474178.39,358700.91
+Sub-Saharan Africa,Eritrea,Household,Online,H,11/1/2015,918342292,12/21/2015,6747,668.27,502.54,4508817.69,3390637.38,1118180.31
+Europe,Ukraine,Cosmetics,Online,H,1/22/2011,773645913,1/28/2011,7873,437.20,263.33,3442075.60,2073197.09,1368878.51
+Asia,Myanmar,Cosmetics,Online,C,6/13/2014,657033336,7/2/2014,9620,437.20,263.33,4205864.00,2533234.60,1672629.40
+Europe,Bosnia and Herzegovina,Meat,Online,H,7/24/2012,410740888,9/1/2012,6211,421.89,364.69,2620358.79,2265089.59,355269.20
+Europe,Latvia,Meat,Offline,M,12/15/2011,847317397,12/18/2011,8902,421.89,364.69,3755664.78,3246470.38,509194.40
+Europe,Serbia,Beverages,Online,L,9/3/2012,599624192,9/21/2012,978,47.45,31.79,46406.10,31090.62,15315.48
+Asia,Mongolia,Beverages,Offline,H,1/19/2012,170835101,2/12/2012,2758,47.45,31.79,130867.10,87676.82,43190.28
+Central America and the Caribbean,Grenada,Cereal,Online,H,1/17/2016,584436452,2/9/2016,6588,205.70,117.11,1355151.60,771520.68,583630.92
+Sub-Saharan Africa,Namibia,Office Supplies,Online,H,10/2/2012,234227073,10/12/2012,1851,651.21,524.96,1205389.71,971700.96,233688.75
+Europe,Portugal,Office Supplies,Online,M,1/21/2014,734318292,3/4/2014,9956,651.21,524.96,6483446.76,5226501.76,1256945.00
+Central America and the Caribbean,Barbados,Snacks,Online,H,12/21/2013,169133937,12/31/2013,9345,152.58,97.44,1425860.10,910576.80,515283.30
+Asia,Sri Lanka,Cereal,Online,C,2/24/2015,743410336,3/20/2015,494,205.70,117.11,101615.80,57852.34,43763.46
+Europe,Poland,Household,Offline,L,7/7/2017,232196319,8/4/2017,905,668.27,502.54,604784.35,454798.70,149985.65
+Sub-Saharan Africa,Senegal,Beverages,Offline,L,6/30/2014,530853211,8/2/2014,117,47.45,31.79,5551.65,3719.43,1832.22
+Australia and Oceania,Kiribati,Fruits,Online,L,12/7/2011,905054843,1/12/2012,4695,9.33,6.92,43804.35,32489.40,11314.95
+Middle East and North Africa,Somalia,Household,Offline,C,9/27/2016,240787541,11/13/2016,3239,668.27,502.54,2164526.53,1627727.06,536799.47
+Sub-Saharan Africa,Burundi,Meat,Online,L,5/22/2010,194350135,6/5/2010,1379,421.89,364.69,581786.31,502907.51,78878.80
+Asia,Malaysia,Household,Online,L,4/12/2013,242353951,4/13/2013,6775,668.27,502.54,4527529.25,3404708.50,1122820.75
+Central America and the Caribbean,Haiti,Vegetables,Offline,C,10/17/2012,831722819,10/26/2012,4120,154.06,90.93,634727.20,374631.60,260095.60
+Europe,Liechtenstein,Cosmetics,Online,L,7/15/2012,229693067,7/15/2012,138,437.20,263.33,60333.60,36339.54,23994.06
+Sub-Saharan Africa,Zambia,Cereal,Offline,H,5/19/2013,373813521,6/15/2013,8583,205.70,117.11,1765523.10,1005155.13,760367.97
+Europe,United Kingdom,Beverages,Online,C,4/8/2017,121945512,4/12/2017,5242,47.45,31.79,248732.90,166643.18,82089.72
+Australia and Oceania,Vanuatu,Fruits,Offline,L,11/6/2015,202262866,12/14/2015,2932,9.33,6.92,27355.56,20289.44,7066.12
+Australia and Oceania,Tuvalu,Personal Care,Offline,M,12/21/2016,963251912,2/1/2017,6501,81.73,56.67,531326.73,368411.67,162915.06
+Central America and the Caribbean,Antigua and Barbuda ,Household,Online,M,8/21/2010,123711478,9/13/2010,7830,668.27,502.54,5232554.10,3934888.20,1297665.90
+Central America and the Caribbean,Haiti,Clothes,Offline,L,8/12/2010,422752892,8/12/2010,830,109.28,35.84,90702.40,29747.20,60955.20
+Europe,Slovenia,Fruits,Online,H,10/22/2012,169799983,11/20/2012,6443,9.33,6.92,60113.19,44585.56,15527.63
+Europe,Malta,Vegetables,Online,M,3/11/2014,894589078,4/10/2014,7643,154.06,90.93,1177480.58,694977.99,482502.59
+Asia,Bhutan,Office Supplies,Offline,M,8/3/2016,597169005,8/14/2016,4434,651.21,524.96,2887465.14,2327672.64,559792.50
+Sub-Saharan Africa,Eritrea,Office Supplies,Offline,H,4/26/2015,497901093,6/11/2015,8853,651.21,524.96,5765162.13,4647470.88,1117691.25
+Europe,Ukraine,Personal Care,Online,M,7/16/2010,987459170,8/27/2010,9967,81.73,56.67,814602.91,564829.89,249773.02
+Asia,Singapore,Personal Care,Offline,M,1/22/2011,276829564,2/13/2011,8875,81.73,56.67,725353.75,502946.25,222407.50
+Sub-Saharan Africa,Cameroon,Household,Offline,H,5/22/2015,247311103,7/11/2015,3706,668.27,502.54,2476608.62,1862413.24,614195.38
+Europe,Cyprus,Fruits,Offline,M,7/12/2015,600515115,8/30/2015,4622,9.33,6.92,43123.26,31984.24,11139.02
+Europe,Poland,Office Supplies,Offline,M,11/27/2015,208365428,12/29/2015,8815,651.21,524.96,5740416.15,4627522.40,1112893.75
+Europe,Monaco,Personal Care,Online,L,6/8/2014,263098371,7/4/2014,5509,81.73,56.67,450250.57,312195.03,138055.54
+Australia and Oceania,Vanuatu,Office Supplies,Online,L,11/21/2013,227262771,1/6/2014,959,651.21,524.96,624510.39,503436.64,121073.75
+Sub-Saharan Africa,Gabon,Office Supplies,Offline,H,7/14/2010,983719956,8/1/2010,3450,651.21,524.96,2246674.50,1811112.00,435562.50
+Sub-Saharan Africa,Djibouti,Baby Food,Offline,H,1/17/2013,785643756,1/26/2013,8301,255.28,159.42,2119079.28,1323345.42,795733.86
+Sub-Saharan Africa,Namibia,Office Supplies,Online,C,1/15/2016,206520497,3/5/2016,2859,651.21,524.96,1861809.39,1500860.64,360948.75
+Europe,Estonia,Cosmetics,Online,C,5/23/2011,790149009,5/29/2011,1505,437.20,263.33,657986.00,396311.65,261674.35
+Europe,Norway,Cereal,Online,M,10/8/2014,100640618,10/18/2014,650,205.70,117.11,133705.00,76121.50,57583.50
+Sub-Saharan Africa,Ethiopia,Personal Care,Online,L,5/27/2016,272419154,6/27/2016,3736,81.73,56.67,305343.28,211719.12,93624.16
+Sub-Saharan Africa,Burundi,Meat,Offline,M,2/27/2015,360220944,2/27/2015,6237,421.89,364.69,2631327.93,2274571.53,356756.40
+Asia,Thailand,Beverages,Offline,C,10/1/2014,389094817,11/11/2014,658,47.45,31.79,31222.10,20917.82,10304.28
+Sub-Saharan Africa,Mauritius ,Meat,Offline,L,5/19/2012,904402101,6/23/2012,1534,421.89,364.69,647179.26,559434.46,87744.80
+Sub-Saharan Africa,Uganda,Vegetables,Online,H,2/13/2010,721816623,2/17/2010,434,154.06,90.93,66862.04,39463.62,27398.42
+Europe,Luxembourg,Snacks,Online,H,2/1/2011,977324712,3/10/2011,955,152.58,97.44,145713.90,93055.20,52658.70
+Sub-Saharan Africa,The Gambia,Beverages,Online,C,9/7/2015,177225196,9/12/2015,3729,47.45,31.79,176941.05,118544.91,58396.14
+Middle East and North Africa,United Arab Emirates,Beverages,Online,M,3/27/2010,948129403,5/14/2010,1415,47.45,31.79,67141.75,44982.85,22158.90
+Central America and the Caribbean,Haiti,Meat,Offline,M,3/15/2016,586961162,4/22/2016,3706,421.89,364.69,1563524.34,1351541.14,211983.20
+Europe,Luxembourg,Snacks,Online,H,9/7/2010,510956799,9/23/2010,2326,152.58,97.44,354901.08,226645.44,128255.64
+Central America and the Caribbean,Saint Lucia,Meat,Online,L,6/26/2013,407665145,7/5/2013,6030,421.89,364.69,2543996.70,2199080.70,344916.00
+Middle East and North Africa,Iraq,Meat,Online,C,3/9/2015,484947526,3/16/2015,5604,421.89,364.69,2364271.56,2043722.76,320548.80
+Europe,Armenia,Fruits,Online,M,3/23/2011,120977771,5/2/2011,8866,9.33,6.92,82719.78,61352.72,21367.06
+Asia,Singapore,Personal Care,Offline,M,3/29/2013,114242208,5/15/2013,5663,81.73,56.67,462836.99,320922.21,141914.78
+Middle East and North Africa,Jordan,Clothes,Online,M,1/5/2015,433539664,1/15/2015,2876,109.28,35.84,314289.28,103075.84,211213.44
+Australia and Oceania,Tonga,Meat,Online,M,5/21/2011,667981469,6/12/2011,9416,421.89,364.69,3972516.24,3433921.04,538595.20
+Europe,Bulgaria,Snacks,Offline,L,3/11/2017,476991450,3/27/2017,1225,152.58,97.44,186910.50,119364.00,67546.50
+Sub-Saharan Africa,Sudan,Office Supplies,Online,C,6/23/2010,940305936,7/29/2010,6277,651.21,524.96,4087645.17,3295173.92,792471.25
+Sub-Saharan Africa,Mali,Baby Food,Online,H,12/28/2011,507973754,1/12/2012,9577,255.28,159.42,2444816.56,1526765.34,918051.22
+Asia,Myanmar,Cosmetics,Online,L,4/6/2013,850356233,5/26/2013,8161,437.20,263.33,3567989.20,2149036.13,1418953.07
+Asia,Sri Lanka,Meat,Offline,L,9/5/2010,108127200,10/1/2010,6096,421.89,364.69,2571841.44,2223150.24,348691.20
+Middle East and North Africa,Azerbaijan,Office Supplies,Online,C,10/27/2016,542272984,12/8/2016,9481,651.21,524.96,6174122.01,4977145.76,1196976.25
+Sub-Saharan Africa,Tanzania,Office Supplies,Offline,C,4/11/2011,884092414,5/13/2011,1447,651.21,524.96,942300.87,759617.12,182683.75
+Sub-Saharan Africa,Swaziland,Household,Offline,C,7/17/2012,385196816,9/3/2012,7153,668.27,502.54,4780135.31,3594668.62,1185466.69
+Asia,Myanmar,Meat,Online,L,9/9/2013,167510020,10/6/2013,8792,421.89,364.69,3709256.88,3206354.48,502902.40
+Europe,Denmark,Beverages,Online,H,6/5/2016,973268353,6/26/2016,589,47.45,31.79,27948.05,18724.31,9223.74
+Sub-Saharan Africa,Seychelles ,Fruits,Offline,M,2/28/2012,915020644,3/18/2012,3797,9.33,6.92,35426.01,26275.24,9150.77
+Sub-Saharan Africa,Madagascar,Cosmetics,Offline,C,1/31/2016,425628221,2/24/2016,1704,437.20,263.33,744988.80,448714.32,296274.48
+Central America and the Caribbean,Saint Lucia,Beverages,Online,L,5/18/2010,908264911,6/14/2010,4626,47.45,31.79,219503.70,147060.54,72443.16
+Sub-Saharan Africa,Mauritius ,Cereal,Online,C,2/25/2016,686417043,3/29/2016,4912,205.70,117.11,1010398.40,575244.32,435154.08
+Asia,Taiwan,Household,Online,H,12/7/2013,853883445,1/10/2014,1941,668.27,502.54,1297112.07,975430.14,321681.93
+Middle East and North Africa,Morocco,Cereal,Online,C,8/8/2015,324775445,9/14/2015,7126,205.70,117.11,1465818.20,834525.86,631292.34
+Middle East and North Africa,Jordan,Cereal,Online,C,3/3/2015,783516871,4/6/2015,8909,205.70,117.11,1832581.30,1043332.99,789248.31
+Asia,China,Cosmetics,Offline,H,4/15/2015,834844052,5/20/2015,7762,437.20,263.33,3393546.40,2043967.46,1349578.94
+Asia,South Korea,Snacks,Offline,H,11/20/2015,953805816,12/25/2015,1191,152.58,97.44,181722.78,116051.04,65671.74
+North America,United States of America,Office Supplies,Online,L,5/22/2010,335763490,7/4/2010,8733,651.21,524.96,5687016.93,4584475.68,1102541.25
+Asia,Uzbekistan,Cosmetics,Online,H,3/18/2012,946390902,3/23/2012,6954,437.20,263.33,3040288.80,1831196.82,1209091.98
+Europe,Finland,Vegetables,Offline,L,2/14/2013,771674382,3/21/2013,4453,154.06,90.93,686029.18,404911.29,281117.89
+Asia,Philippines,Cereal,Online,C,4/23/2017,567912757,5/22/2017,6860,205.70,117.11,1411102.00,803374.60,607727.40
+Middle East and North Africa,Libya,Office Supplies,Offline,L,11/18/2014,711717355,11/18/2014,1836,651.21,524.96,1195621.56,963826.56,231795.00
+Sub-Saharan Africa,South Sudan,Office Supplies,Online,L,12/11/2015,750012004,1/30/2016,4074,651.21,524.96,2653029.54,2138687.04,514342.50
+Middle East and North Africa,Kuwait,Snacks,Online,C,7/9/2016,750033032,8/18/2016,297,152.58,97.44,45316.26,28939.68,16376.58
+Central America and the Caribbean,Saint Lucia,Household,Offline,H,6/28/2017,849329268,7/22/2017,4259,668.27,502.54,2846161.93,2140317.86,705844.07
+Central America and the Caribbean,Grenada,Meat,Online,M,3/22/2013,805762040,4/8/2013,1748,421.89,364.69,737463.72,637478.12,99985.60
+Sub-Saharan Africa,Namibia,Cereal,Online,H,7/4/2010,447505176,7/27/2010,5581,205.70,117.11,1148011.70,653590.91,494420.79
+Australia and Oceania,Solomon Islands,Beverages,Offline,L,3/14/2017,123045003,3/22/2017,606,47.45,31.79,28754.70,19264.74,9489.96
+Asia,Philippines,Household,Offline,H,9/21/2015,251180350,10/20/2015,8702,668.27,502.54,5815285.54,4373103.08,1442182.46
+Asia,Turkmenistan,Household,Online,M,4/10/2012,871022546,4/11/2012,3782,668.27,502.54,2527397.14,1900606.28,626790.86
+Europe,Kosovo,Fruits,Online,L,5/2/2010,291995418,6/6/2010,6788,9.33,6.92,63332.04,46972.96,16359.08
+Asia,Singapore,Clothes,Online,C,6/13/2014,943835294,8/1/2014,692,109.28,35.84,75621.76,24801.28,50820.48
+Sub-Saharan Africa,South Africa,Office Supplies,Offline,L,4/18/2011,826591002,4/18/2011,5501,651.21,524.96,3582306.21,2887804.96,694501.25
+Middle East and North Africa,Lebanon,Cosmetics,Online,M,5/1/2011,260623872,5/12/2011,3250,437.20,263.33,1420900.00,855822.50,565077.50
+Australia and Oceania,Samoa ,Vegetables,Online,L,9/21/2014,536607730,11/3/2014,3007,154.06,90.93,463258.42,273426.51,189831.91
+Australia and Oceania,Samoa ,Personal Care,Offline,L,2/17/2015,765528905,3/6/2015,5870,81.73,56.67,479755.10,332652.90,147102.20
+Europe,Hungary,Baby Food,Online,M,1/25/2011,128686225,3/13/2011,9968,255.28,159.42,2544631.04,1589098.56,955532.48
+Middle East and North Africa,Pakistan,Vegetables,Offline,L,4/1/2017,127691018,4/5/2017,5465,154.06,90.93,841937.90,496932.45,345005.45
+Australia and Oceania,Tonga,Vegetables,Offline,C,5/21/2015,534467113,5/25/2015,9550,154.06,90.93,1471273.00,868381.50,602891.50
+Australia and Oceania,Vanuatu,Personal Care,Online,H,12/18/2010,741250836,1/10/2011,1450,81.73,56.67,118508.50,82171.50,36337.00
+Australia and Oceania,Vanuatu,Snacks,Online,M,5/2/2014,210591018,5/27/2014,7417,152.58,97.44,1131685.86,722712.48,408973.38
+Central America and the Caribbean,Grenada,Vegetables,Online,C,3/6/2014,725348985,4/13/2014,5738,154.06,90.93,883996.28,521756.34,362239.94
+Sub-Saharan Africa,Mozambique,Household,Offline,H,8/11/2011,538698565,9/7/2011,1731,668.27,502.54,1156775.37,869896.74,286878.63
+Central America and the Caribbean,Cuba,Cereal,Offline,H,5/20/2016,224126088,6/12/2016,2745,205.70,117.11,564646.50,321466.95,243179.55
+Middle East and North Africa,Algeria,Beverages,Online,M,10/22/2012,425430381,12/5/2012,3159,47.45,31.79,149894.55,100424.61,49469.94
+Sub-Saharan Africa,Equatorial Guinea,Vegetables,Offline,M,7/20/2016,506722772,8/8/2016,9383,154.06,90.93,1445544.98,853196.19,592348.79
+Sub-Saharan Africa,Uganda,Office Supplies,Offline,C,4/7/2010,802427089,4/26/2010,4862,651.21,524.96,3166183.02,2552355.52,613827.50
+Asia,Thailand,Cosmetics,Offline,H,7/14/2015,367279660,8/9/2015,5068,437.20,263.33,2215729.60,1334556.44,881173.16
+Middle East and North Africa,Turkey,Personal Care,Offline,H,5/10/2013,126329314,5/21/2013,2506,81.73,56.67,204815.38,142015.02,62800.36
+Asia,Kazakhstan,Personal Care,Offline,H,2/1/2016,624937379,2/8/2016,1713,81.73,56.67,140003.49,97075.71,42927.78
+Central America and the Caribbean,Nicaragua,Snacks,Offline,H,8/20/2010,678777682,9/28/2010,4255,152.58,97.44,649227.90,414607.20,234620.70
+Asia,Kazakhstan,Cereal,Online,L,4/12/2015,523836553,5/22/2015,3732,205.70,117.11,767672.40,437054.52,330617.88
+Sub-Saharan Africa,Chad,Cereal,Offline,C,4/8/2015,466412818,5/12/2015,772,205.70,117.11,158800.40,90408.92,68391.48
+Australia and Oceania,East Timor,Fruits,Online,H,1/27/2012,433117806,2/6/2012,8039,9.33,6.92,75003.87,55629.88,19373.99
+Europe,Lithuania,Cosmetics,Offline,L,1/6/2012,420875346,2/18/2012,5223,437.20,263.33,2283495.60,1375372.59,908123.01
+Sub-Saharan Africa,Eritrea,Cosmetics,Online,C,11/26/2014,946921765,12/16/2014,4048,437.20,263.33,1769785.60,1065959.84,703825.76
+Sub-Saharan Africa,Zambia,Household,Offline,H,4/4/2010,798805892,4/25/2010,3270,668.27,502.54,2185242.90,1643305.80,541937.10
+Sub-Saharan Africa,Liberia,Household,Offline,M,5/17/2011,184389054,6/20/2011,3674,668.27,502.54,2455223.98,1846331.96,608892.02
+Central America and the Caribbean,Saint Kitts and Nevis ,Household,Offline,M,9/9/2013,281845080,10/18/2013,3077,668.27,502.54,2056266.79,1546315.58,509951.21
+Central America and the Caribbean,Jamaica,Meat,Online,H,9/14/2013,989660298,10/11/2013,1330,421.89,364.69,561113.70,485037.70,76076.00
+Europe,Albania,Vegetables,Online,C,10/5/2012,476633536,11/3/2012,5310,154.06,90.93,818058.60,482838.30,335220.30
+Asia,Japan,Baby Food,Offline,C,4/13/2013,131876122,5/22/2013,3930,255.28,159.42,1003250.40,626520.60,376729.80
+Sub-Saharan Africa,Equatorial Guinea,Meat,Offline,L,12/15/2014,514811885,1/21/2015,3132,421.89,364.69,1321359.48,1142209.08,179150.40
+Asia,Myanmar,Office Supplies,Online,C,12/20/2010,905177152,1/7/2011,889,651.21,524.96,578925.69,466689.44,112236.25
+Middle East and North Africa,Libya,Personal Care,Offline,H,7/2/2014,653020751,7/19/2014,2207,81.73,56.67,180378.11,125070.69,55307.42
+Asia,Mongolia,Meat,Online,L,1/31/2017,528704011,3/2/2017,4121,421.89,364.69,1738608.69,1502887.49,235721.20
+Asia,Singapore,Snacks,Offline,M,2/5/2015,472900760,3/19/2015,699,152.58,97.44,106653.42,68110.56,38542.86
+Central America and the Caribbean,The Bahamas,Baby Food,Offline,L,7/23/2013,946597325,7/23/2013,8039,255.28,159.42,2052195.92,1281577.38,770618.54
+Asia,Sri Lanka,Office Supplies,Offline,L,10/6/2014,681092536,11/18/2014,9272,651.21,524.96,6038019.12,4867429.12,1170590.00
+Europe,Cyprus,Vegetables,Offline,C,7/2/2014,727997720,7/19/2014,9558,154.06,90.93,1472505.48,869108.94,603396.54
+Middle East and North Africa,Afghanistan,Baby Food,Online,C,5/29/2013,409236705,6/11/2013,1090,255.28,159.42,278255.20,173767.80,104487.40
+Europe,Moldova ,Personal Care,Online,M,3/11/2013,467045819,4/12/2013,8092,81.73,56.67,661359.16,458573.64,202785.52
+Europe,Kosovo,Cosmetics,Offline,C,11/1/2012,813973891,11/13/2012,1818,437.20,263.33,794829.60,478733.94,316095.66
+Middle East and North Africa,Egypt,Household,Online,M,5/22/2012,982882249,5/29/2012,5554,668.27,502.54,3711571.58,2791107.16,920464.42
+Europe,Albania,Cosmetics,Offline,L,9/30/2016,576944720,10/9/2016,9619,437.20,263.33,4205426.80,2532971.27,1672455.53
+Asia,Singapore,Vegetables,Offline,C,9/25/2016,619647634,10/16/2016,6360,154.06,90.93,979821.60,578314.80,401506.80
+Europe,Portugal,Baby Food,Online,L,8/3/2015,404789817,9/8/2015,5157,255.28,159.42,1316478.96,822128.94,494350.02
+Asia,India,Snacks,Offline,M,1/16/2010,646482598,1/25/2010,7422,152.58,97.44,1132448.76,723199.68,409249.08
+Sub-Saharan Africa,Sudan,Meat,Online,C,11/1/2016,329149806,12/8/2016,1597,421.89,364.69,673758.33,582409.93,91348.40
+Australia and Oceania,Vanuatu,Office Supplies,Offline,M,11/25/2015,757527768,12/19/2015,8155,651.21,524.96,5310617.55,4281048.80,1029568.75
+Sub-Saharan Africa,Democratic Republic of the Congo,Cosmetics,Online,C,9/24/2014,606665313,10/13/2014,4602,437.20,263.33,2011994.40,1211844.66,800149.74
+Europe,Bosnia and Herzegovina,Baby Food,Online,C,4/30/2014,871923768,5/30/2014,474,255.28,159.42,121002.72,75565.08,45437.64
+Europe,Kosovo,Vegetables,Offline,C,12/18/2012,818976962,12/21/2012,2337,154.06,90.93,360038.22,212503.41,147534.81
+Europe,Switzerland,Cosmetics,Online,C,7/20/2017,233811223,7/20/2017,8792,437.20,263.33,3843862.40,2315197.36,1528665.04
+Central America and the Caribbean,Cuba,Beverages,Offline,L,2/16/2017,772725379,3/9/2017,5466,47.45,31.79,259361.70,173764.14,85597.56
+Europe,Lithuania,Office Supplies,Offline,C,12/15/2016,112330758,1/11/2017,22,651.21,524.96,14326.62,11549.12,2777.50
+Middle East and North Africa,Lebanon,Clothes,Online,M,12/28/2011,499551188,1/14/2012,7153,109.28,35.84,781679.84,256363.52,525316.32
+Asia,North Korea,Clothes,Online,M,5/28/2013,201622998,6/5/2013,3581,109.28,35.84,391331.68,128343.04,262988.64
+Europe,Montenegro,Office Supplies,Offline,H,7/2/2014,256095016,8/21/2014,3061,651.21,524.96,1993353.81,1606902.56,386451.25
+Sub-Saharan Africa,Eritrea,Fruits,Offline,M,3/21/2017,420828568,3/29/2017,1380,9.33,6.92,12875.40,9549.60,3325.80
+Sub-Saharan Africa,Democratic Republic of the Congo,Cereal,Online,L,3/17/2013,523997485,4/23/2013,1355,205.70,117.11,278723.50,158684.05,120039.45
+Asia,India,Office Supplies,Online,C,4/30/2010,914088094,5/3/2010,7835,651.21,524.96,5102230.35,4113061.60,989168.75
+Sub-Saharan Africa,Republic of the Congo,Snacks,Online,M,9/16/2013,209899222,9/28/2013,2699,152.58,97.44,411813.42,262990.56,148822.86
+Sub-Saharan Africa,Comoros,Clothes,Offline,M,5/30/2014,250542199,7/1/2014,9859,109.28,35.84,1077391.52,353346.56,724044.96
+Europe,France,Meat,Online,L,11/28/2015,245440852,12/17/2015,257,421.89,364.69,108425.73,93725.33,14700.40
+Sub-Saharan Africa,Rwanda,Vegetables,Online,L,3/7/2015,824331510,4/21/2015,6867,154.06,90.93,1057930.02,624416.31,433513.71
+Sub-Saharan Africa,Malawi,Meat,Online,M,1/15/2014,887263000,1/31/2014,9693,421.89,364.69,4089379.77,3534940.17,554439.60
+Sub-Saharan Africa,Cote d'Ivoire,Cereal,Offline,H,5/22/2015,754596650,5/27/2015,772,205.70,117.11,158800.40,90408.92,68391.48
+Europe,Spain,Fruits,Online,H,10/22/2011,817006289,11/14/2011,9172,9.33,6.92,85574.76,63470.24,22104.52
+Sub-Saharan Africa,Uganda,Clothes,Offline,H,2/8/2012,185478246,3/20/2012,5989,109.28,35.84,654477.92,214645.76,439832.16
+Asia,Taiwan,Personal Care,Offline,C,10/16/2014,741311347,11/5/2014,9356,81.73,56.67,764665.88,530204.52,234461.36
+Middle East and North Africa,Israel,Personal Care,Offline,M,11/14/2011,386116921,12/22/2011,9432,81.73,56.67,770877.36,534511.44,236365.92
+Central America and the Caribbean,Costa Rica,Meat,Offline,L,5/3/2015,691818797,5/7/2015,3411,421.89,364.69,1439066.79,1243957.59,195109.20
+Central America and the Caribbean,Honduras,Snacks,Online,C,7/16/2015,150653302,9/2/2015,515,152.58,97.44,78578.70,50181.60,28397.10
+Asia,South Korea,Vegetables,Offline,M,4/1/2015,925169265,5/3/2015,7000,154.06,90.93,1078420.00,636510.00,441910.00
+Europe,Sweden,Vegetables,Online,H,9/20/2010,298228013,10/25/2010,1151,154.06,90.93,177323.06,104660.43,72662.63
+Australia and Oceania,Tonga,Office Supplies,Online,L,8/24/2010,123003375,9/16/2010,8287,651.21,524.96,5396577.27,4350343.52,1046233.75
+Europe,Latvia,Snacks,Online,C,3/15/2017,972981679,4/9/2017,5755,152.58,97.44,878097.90,560767.20,317330.70
+Asia,Indonesia,Beverages,Online,M,9/12/2014,791961753,9/21/2014,7937,47.45,31.79,376610.65,252317.23,124293.42
+Asia,Myanmar,Household,Online,C,3/25/2011,744054925,3/31/2011,1242,668.27,502.54,829991.34,624154.68,205836.66
+Asia,Turkmenistan,Office Supplies,Offline,L,3/3/2012,263685023,4/8/2012,9113,651.21,524.96,5934476.73,4783960.48,1150516.25
+Central America and the Caribbean,Panama,Baby Food,Online,H,5/19/2016,205588376,6/18/2016,7024,255.28,159.42,1793086.72,1119766.08,673320.64
+Europe,Norway,Personal Care,Offline,M,6/8/2012,594813811,6/17/2012,7480,81.73,56.67,611340.40,423891.60,187448.80
+Europe,Estonia,Clothes,Online,H,9/8/2012,176722657,9/16/2012,5016,109.28,35.84,548148.48,179773.44,368375.04
+Europe,Malta,Personal Care,Offline,M,8/16/2011,466988742,8/16/2011,1201,81.73,56.67,98157.73,68060.67,30097.06
+Sub-Saharan Africa,Eritrea,Personal Care,Offline,L,5/14/2012,801598393,6/2/2012,9633,81.73,56.67,787305.09,545902.11,241402.98
+Sub-Saharan Africa,Republic of the Congo,Meat,Offline,M,4/28/2015,586850440,6/8/2015,941,421.89,364.69,396998.49,343173.29,53825.20
+Central America and the Caribbean,Trinidad and Tobago,Snacks,Offline,H,5/21/2014,649356210,5/21/2014,7787,152.58,97.44,1188140.46,758765.28,429375.18
+Middle East and North Africa,Yemen,Cereal,Offline,H,11/15/2015,986039531,12/10/2015,9864,205.70,117.11,2029024.80,1155173.04,873851.76
+Asia,Turkmenistan,Household,Offline,H,1/10/2012,314136731,1/12/2012,8894,668.27,502.54,5943593.38,4469590.76,1474002.62
+Middle East and North Africa,Somalia,Beverages,Offline,H,1/28/2015,121196639,2/7/2015,3634,47.45,31.79,172433.30,115524.86,56908.44
+Europe,Portugal,Cereal,Online,C,8/11/2015,615080583,9/19/2015,4868,205.70,117.11,1001347.60,570091.48,431256.12
+Asia,Kyrgyzstan,Fruits,Offline,L,8/19/2016,273962390,9/5/2016,414,9.33,6.92,3862.62,2864.88,997.74
+Middle East and North Africa,Lebanon,Personal Care,Offline,H,8/22/2014,796328389,9/27/2014,121,81.73,56.67,9889.33,6857.07,3032.26
+Europe,Macedonia,Cosmetics,Online,C,12/26/2010,350977408,1/22/2011,869,437.20,263.33,379926.80,228833.77,151093.03
+Middle East and North Africa,Algeria,Clothes,Offline,M,8/27/2015,327020776,9/29/2015,1570,109.28,35.84,171569.60,56268.80,115300.80
+Middle East and North Africa,Qatar,Vegetables,Online,H,3/11/2013,383882319,4/15/2013,8164,154.06,90.93,1257745.84,742352.52,515393.32
+Europe,Greece,Personal Care,Offline,M,12/8/2011,701298367,1/6/2012,8626,81.73,56.67,705002.98,488835.42,216167.56
+Sub-Saharan Africa,Benin,Fruits,Online,M,6/27/2017,629317748,8/14/2017,7961,9.33,6.92,74276.13,55090.12,19186.01
+Asia,Uzbekistan,Baby Food,Offline,C,10/21/2013,938301789,11/29/2013,3205,255.28,159.42,818172.40,510941.10,307231.30
+Middle East and North Africa,Azerbaijan,Vegetables,Online,L,6/1/2012,668924319,7/7/2012,8426,154.06,90.93,1298109.56,766176.18,531933.38
+Asia,Cambodia,Clothes,Online,C,10/8/2010,282171666,11/15/2010,9721,109.28,35.84,1062310.88,348400.64,713910.24
+Europe,Italy,Personal Care,Online,C,2/25/2011,309342658,3/28/2011,222,81.73,56.67,18144.06,12580.74,5563.32
+Sub-Saharan Africa,Mauritius ,Cosmetics,Online,H,12/5/2016,902048623,12/20/2016,5088,437.20,263.33,2224473.60,1339823.04,884650.56
+Middle East and North Africa,Yemen,Clothes,Online,H,8/6/2013,482213389,9/3/2013,6513,109.28,35.84,711740.64,233425.92,478314.72
+Central America and the Caribbean,Cuba,Vegetables,Offline,C,6/7/2010,692073285,6/28/2010,8719,154.06,90.93,1343249.14,792818.67,550430.47
+Australia and Oceania,Tonga,Fruits,Online,L,12/27/2013,544177138,1/30/2014,2963,9.33,6.92,27644.79,20503.96,7140.83
+Central America and the Caribbean,Guatemala,Vegetables,Online,M,9/28/2016,471386277,10/17/2016,2530,154.06,90.93,389771.80,230052.90,159718.90
+Australia and Oceania,New Zealand,Personal Care,Online,L,1/8/2016,976874530,1/27/2016,7737,81.73,56.67,632345.01,438455.79,193889.22
+Europe,Norway,Household,Offline,M,3/20/2010,384128224,4/26/2010,933,668.27,502.54,623495.91,468869.82,154626.09
+Sub-Saharan Africa,South Africa,Personal Care,Online,H,2/21/2010,686946189,3/8/2010,1498,81.73,56.67,122431.54,84891.66,37539.88
+Sub-Saharan Africa,Zambia,Snacks,Offline,M,7/14/2012,799439752,7/24/2012,843,152.58,97.44,128624.94,82141.92,46483.02
+Central America and the Caribbean,Saint Kitts and Nevis ,Cereal,Online,M,5/29/2011,606032741,6/15/2011,7410,205.70,117.11,1524237.00,867785.10,656451.90
+Asia,Indonesia,Beverages,Offline,H,12/25/2016,511461484,2/5/2017,1674,47.45,31.79,79431.30,53216.46,26214.84
+Europe,Netherlands,Household,Offline,C,1/17/2014,990774810,2/18/2014,1138,668.27,502.54,760491.26,571890.52,188600.74
+Asia,Thailand,Snacks,Offline,M,3/2/2011,339334046,4/16/2011,5340,152.58,97.44,814777.20,520329.60,294447.60
+Sub-Saharan Africa,Republic of the Congo,Personal Care,Offline,C,3/10/2014,522813022,4/8/2014,846,81.73,56.67,69143.58,47942.82,21200.76
+Sub-Saharan Africa,Equatorial Guinea,Fruits,Offline,M,11/17/2014,427198064,1/2/2015,6255,9.33,6.92,58359.15,43284.60,15074.55
+Asia,Tajikistan,Beverages,Offline,C,6/3/2017,808788001,7/15/2017,7197,47.45,31.79,341497.65,228792.63,112705.02
+Sub-Saharan Africa,Botswana,Meat,Offline,L,12/7/2011,244194161,1/7/2012,1334,421.89,364.69,562801.26,486496.46,76304.80
+Central America and the Caribbean,Dominican Republic,Fruits,Offline,L,2/1/2016,980340373,2/15/2016,3357,9.33,6.92,31320.81,23230.44,8090.37
+Australia and Oceania,Samoa ,Beverages,Online,M,10/6/2010,384462964,10/10/2010,9990,47.45,31.79,474025.50,317582.10,156443.40
+Europe,Belgium,Vegetables,Offline,C,12/26/2011,394110763,12/29/2011,4988,154.06,90.93,768451.28,453558.84,314892.44
+Australia and Oceania,Federated States of Micronesia,Cosmetics,Online,L,2/12/2014,767145097,3/11/2014,4137,437.20,263.33,1808696.40,1089396.21,719300.19
+Sub-Saharan Africa,Botswana,Fruits,Online,L,5/21/2016,431739795,6/19/2016,254,9.33,6.92,2369.82,1757.68,612.14
+Asia,Vietnam,Cereal,Online,L,7/2/2011,636381185,7/28/2011,8189,205.70,117.11,1684477.30,959013.79,725463.51
+Europe,Kosovo,Fruits,Online,C,3/2/2012,899868094,3/26/2012,9821,9.33,6.92,91629.93,67961.32,23668.61
+Europe,Germany,Baby Food,Offline,L,1/6/2017,361311852,2/15/2017,9061,255.28,159.42,2313092.08,1444504.62,868587.46
+Europe,Hungary,Beverages,Online,L,5/20/2014,930136287,6/21/2014,6852,47.45,31.79,325127.40,217825.08,107302.32
+Central America and the Caribbean,Saint Lucia,Cereal,Online,L,5/19/2016,536077725,6/7/2016,6167,205.70,117.11,1268551.90,722217.37,546334.53
+Sub-Saharan Africa,Madagascar,Snacks,Online,M,4/6/2017,779184997,4/17/2017,7011,152.58,97.44,1069738.38,683151.84,386586.54
+Europe,Bulgaria,Cosmetics,Online,C,5/5/2012,179819428,6/2/2012,1420,437.20,263.33,620824.00,373928.60,246895.40
+Asia,Myanmar,Vegetables,Online,H,12/7/2016,928654849,1/7/2017,8461,154.06,90.93,1303501.66,769358.73,534142.93
+Sub-Saharan Africa,Togo,Baby Food,Offline,H,2/14/2017,336677587,3/28/2017,9234,255.28,159.42,2357255.52,1472084.28,885171.24
+Australia and Oceania,Australia,Vegetables,Online,C,6/2/2011,285186469,6/25/2011,1869,154.06,90.93,287938.14,169948.17,117989.97
+Middle East and North Africa,Morocco,Baby Food,Offline,M,7/15/2014,475792825,9/3/2014,6525,255.28,159.42,1665702.00,1040215.50,625486.50
+Middle East and North Africa,Qatar,Clothes,Offline,L,10/6/2015,680420482,11/8/2015,396,109.28,35.84,43274.88,14192.64,29082.24
+Europe,Bosnia and Herzegovina,Fruits,Online,H,1/5/2013,291305768,1/6/2013,2705,9.33,6.92,25237.65,18718.60,6519.05
+Middle East and North Africa,Iraq,Baby Food,Offline,L,8/19/2016,570997512,9/6/2016,9707,255.28,159.42,2478002.96,1547489.94,930513.02
+Europe,Russia,Personal Care,Online,L,4/24/2015,602357041,5/5/2015,9689,81.73,56.67,791881.97,549075.63,242806.34
+Middle East and North Africa,Lebanon,Meat,Online,M,2/26/2010,438558185,4/14/2010,7967,421.89,364.69,3361197.63,2905485.23,455712.40
+Europe,Albania,Snacks,Online,H,12/2/2010,653087270,12/7/2010,1891,152.58,97.44,288528.78,184259.04,104269.74
+Australia and Oceania,Samoa ,Cereal,Offline,C,1/23/2017,989743125,1/25/2017,5840,205.70,117.11,1201288.00,683922.40,517365.60
+Europe,Slovenia,Fruits,Offline,M,12/15/2013,812637078,1/5/2014,6225,9.33,6.92,58079.25,43077.00,15002.25
+Europe,Macedonia,Personal Care,Online,L,7/19/2014,456192958,8/18/2014,6489,81.73,56.67,530345.97,367731.63,162614.34
+Middle East and North Africa,Lebanon,Cereal,Online,L,2/17/2010,775147092,2/28/2010,2105,205.70,117.11,432998.50,246516.55,186481.95
+Sub-Saharan Africa,Comoros,Household,Offline,M,12/28/2011,894548308,2/2/2012,5578,668.27,502.54,3727610.06,2803168.12,924441.94
+Sub-Saharan Africa,Cameroon,Cosmetics,Offline,H,5/3/2017,459757936,6/10/2017,1445,437.20,263.33,631754.00,380511.85,251242.15
+Europe,Albania,Meat,Offline,H,1/31/2013,986449801,3/13/2013,1272,421.89,364.69,536644.08,463885.68,72758.40
+Europe,Sweden,Cosmetics,Online,L,7/3/2017,910610234,7/31/2017,8659,437.20,263.33,3785714.80,2280174.47,1505540.33
+Sub-Saharan Africa,Liberia,Cereal,Offline,H,11/8/2015,538538062,12/3/2015,4235,205.70,117.11,871139.50,495960.85,375178.65
+Europe,Norway,Meat,Online,M,3/3/2017,696844613,3/22/2017,661,421.89,364.69,278869.29,241060.09,37809.20
+Middle East and North Africa,Israel,Fruits,Online,H,8/18/2012,482453715,9/22/2012,7630,9.33,6.92,71187.90,52799.60,18388.30
+Central America and the Caribbean,Cuba,Office Supplies,Offline,L,3/11/2017,412601697,3/23/2017,6866,651.21,524.96,4471207.86,3604375.36,866832.50
+Central America and the Caribbean,Nicaragua,Meat,Offline,M,10/17/2012,174837386,11/14/2012,7123,421.89,364.69,3005122.47,2597686.87,407435.60
+Middle East and North Africa,Kuwait,Personal Care,Offline,L,9/29/2012,877022111,10/21/2012,9187,81.73,56.67,750853.51,520627.29,230226.22
+North America,United States of America,Cereal,Offline,M,6/22/2012,997329699,7/15/2012,876,205.70,117.11,180193.20,102588.36,77604.84
+Sub-Saharan Africa,Rwanda,Snacks,Offline,M,1/19/2016,434246480,2/11/2016,2038,152.58,97.44,310958.04,198582.72,112375.32
+Central America and the Caribbean,Jamaica,Cereal,Online,C,4/3/2017,956571280,4/5/2017,9554,205.70,117.11,1965257.80,1118868.94,846388.86
+Europe,Czech Republic,Personal Care,Online,M,12/4/2010,353415429,12/8/2010,2334,81.73,56.67,190757.82,132267.78,58490.04
+Sub-Saharan Africa,Kenya,Vegetables,Online,H,11/27/2011,984202754,12/8/2011,6321,154.06,90.93,973813.26,574768.53,399044.73
+Sub-Saharan Africa,Central African Republic,Beverages,Offline,H,5/16/2013,328669583,6/2/2013,9488,47.45,31.79,450205.60,301623.52,148582.08
+Middle East and North Africa,Jordan,Cosmetics,Offline,C,5/16/2013,436864745,5/22/2013,6841,437.20,263.33,2990885.20,1801440.53,1189444.67
+Middle East and North Africa,Tunisia ,Household,Offline,M,1/1/2011,279149568,1/26/2011,5415,668.27,502.54,3618682.05,2721254.10,897427.95
+Europe,Andorra,Cereal,Online,H,3/19/2010,696197879,3/26/2010,9278,205.70,117.11,1908484.60,1086546.58,821938.02
+North America,United States of America,Household,Offline,M,1/9/2016,348996007,1/12/2016,4529,668.27,502.54,3026594.83,2276003.66,750591.17
+Sub-Saharan Africa,Cote d'Ivoire,Beverages,Offline,L,8/3/2015,668842780,9/20/2015,4297,47.45,31.79,203892.65,136601.63,67291.02
+Europe,Iceland,Cosmetics,Online,C,4/5/2012,907349526,5/16/2012,3743,437.20,263.33,1636439.60,985644.19,650795.41
+Europe,Poland,Personal Care,Offline,C,4/5/2014,386440074,4/25/2014,5060,81.73,56.67,413553.80,286750.20,126803.60
+Sub-Saharan Africa,Madagascar,Vegetables,Offline,C,9/19/2015,748350751,10/27/2015,2472,154.06,90.93,380836.32,224778.96,156057.36
+Central America and the Caribbean,Saint Kitts and Nevis ,Personal Care,Online,L,8/12/2015,105630385,9/15/2015,7233,81.73,56.67,591153.09,409894.11,181258.98
+Asia,Sri Lanka,Cosmetics,Offline,L,12/30/2013,691140305,1/8/2014,2630,437.20,263.33,1149836.00,692557.90,457278.10
+Sub-Saharan Africa,Comoros,Cosmetics,Offline,H,10/8/2015,308054339,10/15/2015,8980,437.20,263.33,3926056.00,2364703.40,1561352.60
+Sub-Saharan Africa,Senegal,Fruits,Offline,H,9/29/2011,879858815,10/30/2011,8631,9.33,6.92,80527.23,59726.52,20800.71
+Europe,Finland,Vegetables,Online,H,9/28/2012,800352561,10/21/2012,963,154.06,90.93,148359.78,87565.59,60794.19
+Sub-Saharan Africa,Sao Tome and Principe,Baby Food,Online,L,7/1/2015,783646905,8/10/2015,7388,255.28,159.42,1886008.64,1177794.96,708213.68
+Europe,Poland,Beverages,Offline,C,1/8/2014,714165675,2/2/2014,6348,47.45,31.79,301212.60,201802.92,99409.68
+Asia,Turkmenistan,Meat,Offline,H,12/20/2010,996645200,1/27/2011,8317,421.89,364.69,3508859.13,3033126.73,475732.40
+Middle East and North Africa,Saudi Arabia,Office Supplies,Offline,M,11/2/2013,306134307,11/24/2013,799,651.21,524.96,520316.79,419443.04,100873.75
+Asia,Brunei,Snacks,Offline,M,1/20/2016,537994325,2/28/2016,3331,152.58,97.44,508243.98,324572.64,183671.34
+Asia,Philippines,Cereal,Online,M,11/20/2015,957899081,12/23/2015,2480,205.70,117.11,510136.00,290432.80,219703.20
+Asia,India,Office Supplies,Online,M,9/4/2012,451834905,9/21/2012,6844,651.21,524.96,4456881.24,3592826.24,864055.00
+Sub-Saharan Africa,Cote d'Ivoire,Baby Food,Online,H,8/13/2010,676100623,9/23/2010,2054,255.28,159.42,524345.12,327448.68,196896.44
+Australia and Oceania,Vanuatu,Snacks,Offline,M,12/15/2014,207307565,12/29/2014,5770,152.58,97.44,880386.60,562228.80,318157.80
+Asia,Japan,Baby Food,Offline,H,1/29/2013,392379558,3/9/2013,2685,255.28,159.42,685426.80,428042.70,257384.10
+Australia and Oceania,Nauru,Cosmetics,Online,M,3/1/2016,398552930,3/29/2016,9524,437.20,263.33,4163892.80,2507954.92,1655937.88
+Middle East and North Africa,Pakistan,Office Supplies,Offline,L,7/6/2017,363376510,8/10/2017,39,651.21,524.96,25397.19,20473.44,4923.75
+Middle East and North Africa,Morocco,Vegetables,Offline,H,6/29/2011,944711625,7/23/2011,18,154.06,90.93,2773.08,1636.74,1136.34
+Sub-Saharan Africa,Cameroon,Household,Online,C,6/18/2012,170732104,8/7/2012,2279,668.27,502.54,1522987.33,1145288.66,377698.67
+Europe,Croatia,Beverages,Offline,L,2/22/2013,189924275,3/21/2013,1668,47.45,31.79,79146.60,53025.72,26120.88
+Asia,Thailand,Clothes,Offline,L,2/6/2011,521086966,2/19/2011,68,109.28,35.84,7431.04,2437.12,4993.92
+Asia,Kyrgyzstan,Meat,Online,M,7/11/2012,303331506,8/6/2012,1388,421.89,364.69,585583.32,506189.72,79393.60
+Europe,Poland,Meat,Online,H,4/30/2013,546081721,5/22/2013,6571,421.89,364.69,2772239.19,2396377.99,375861.20
+Europe,Switzerland,Baby Food,Online,C,6/26/2010,979073941,7/18/2010,8591,255.28,159.42,2193110.48,1369577.22,823533.26
+Sub-Saharan Africa,Sao Tome and Principe,Vegetables,Offline,L,5/21/2013,502356994,6/24/2013,7453,154.06,90.93,1148209.18,677701.29,470507.89
+Australia and Oceania,New Zealand,Meat,Online,H,5/7/2017,336292207,6/5/2017,5192,421.89,364.69,2190452.88,1893470.48,296982.40
+Sub-Saharan Africa,Equatorial Guinea,Personal Care,Online,H,12/19/2014,871553409,1/5/2015,876,81.73,56.67,71595.48,49642.92,21952.56
+Australia and Oceania,New Zealand,Personal Care,Offline,H,1/16/2015,319126927,2/6/2015,5604,81.73,56.67,458014.92,317578.68,140436.24
+Sub-Saharan Africa,Liberia,Vegetables,Online,H,2/2/2016,560311591,2/5/2016,7506,154.06,90.93,1156374.36,682520.58,473853.78
+Europe,Bosnia and Herzegovina,Personal Care,Offline,L,2/7/2010,396718728,3/18/2010,6742,81.73,56.67,551023.66,382069.14,168954.52
+Australia and Oceania,Marshall Islands,Fruits,Online,H,8/30/2016,500272166,10/9/2016,506,9.33,6.92,4720.98,3501.52,1219.46
+Asia,South Korea,Snacks,Online,L,12/18/2010,263208234,1/20/2011,8020,152.58,97.44,1223691.60,781468.80,442222.80
+Europe,Hungary,Beverages,Offline,M,12/3/2010,948075759,1/4/2011,5540,47.45,31.79,262873.00,176116.60,86756.40
+Europe,Sweden,Cereal,Offline,L,10/19/2012,737736070,11/3/2012,1352,205.70,117.11,278106.40,158332.72,119773.68
+Europe,Slovakia,Household,Offline,L,2/20/2010,585362994,4/11/2010,773,668.27,502.54,516572.71,388463.42,128109.29
+Middle East and North Africa,Morocco,Baby Food,Offline,M,9/7/2012,164442861,9/20/2012,1152,255.28,159.42,294082.56,183651.84,110430.72
+Australia and Oceania,Samoa ,Office Supplies,Online,M,4/29/2012,118774497,5/24/2012,6868,651.21,524.96,4472510.28,3605425.28,867085.00
+Australia and Oceania,Papua New Guinea,Baby Food,Online,M,2/26/2017,712469232,3/12/2017,4333,255.28,159.42,1106128.24,690766.86,415361.38
+Sub-Saharan Africa,Ghana,Baby Food,Offline,C,5/26/2017,479950892,5/28/2017,6989,255.28,159.42,1784151.92,1114186.38,669965.54
+Sub-Saharan Africa,Niger,Vegetables,Online,H,12/4/2011,275955808,12/25/2011,311,154.06,90.93,47912.66,28279.23,19633.43
+Asia,India,Baby Food,Offline,M,1/7/2012,125532805,2/17/2012,6802,255.28,159.42,1736414.56,1084374.84,652039.72
+Asia,Philippines,Clothes,Online,C,11/20/2014,574043214,1/5/2015,998,109.28,35.84,109061.44,35768.32,73293.12
+Middle East and North Africa,Jordan,Personal Care,Online,H,1/8/2015,437160861,1/16/2015,4468,81.73,56.67,365169.64,253201.56,111968.08
+Europe,Czech Republic,Baby Food,Offline,H,7/18/2015,850872075,8/1/2015,810,255.28,159.42,206776.80,129130.20,77646.60
+Australia and Oceania,East Timor,Snacks,Offline,H,11/8/2016,321475684,12/16/2016,654,152.58,97.44,99787.32,63725.76,36061.56
+Europe,Bosnia and Herzegovina,Office Supplies,Offline,C,11/8/2012,575583016,11/24/2012,6660,651.21,524.96,4337058.60,3496233.60,840825.00
+Middle East and North Africa,Bahrain,Meat,Offline,M,6/8/2017,710117900,7/2/2017,8522,421.89,364.69,3595346.58,3107888.18,487458.40
+Asia,Nepal,Fruits,Offline,L,4/5/2015,342316663,4/5/2015,7962,9.33,6.92,74285.46,55097.04,19188.42
+Asia,Maldives,Cosmetics,Offline,C,12/27/2010,959728133,1/20/2011,3737,437.20,263.33,1633816.40,984064.21,649752.19
+Australia and Oceania,Tuvalu,Vegetables,Offline,C,5/10/2010,970213639,6/12/2010,6631,154.06,90.93,1021571.86,602956.83,418615.03
+Asia,Philippines,Cereal,Offline,M,5/11/2016,651947009,5/18/2016,4463,205.70,117.11,918039.10,522661.93,395377.17
+North America,United States of America,Vegetables,Offline,H,5/12/2010,803414571,6/19/2010,7080,154.06,90.93,1090744.80,643784.40,446960.40
+Sub-Saharan Africa,Tanzania,Fruits,Offline,M,6/3/2016,493415153,6/9/2016,1363,9.33,6.92,12716.79,9431.96,3284.83
+Central America and the Caribbean,Barbados,Household,Offline,L,3/30/2014,211060082,4/3/2014,6223,668.27,502.54,4158644.21,3127306.42,1031337.79
+Europe,Kosovo,Meat,Offline,H,2/1/2011,515773189,2/17/2011,7603,421.89,364.69,3207629.67,2772738.07,434891.60
+Asia,Nepal,Office Supplies,Offline,H,4/15/2015,687290799,5/19/2015,3475,651.21,524.96,2262954.75,1824236.00,438718.75
+Sub-Saharan Africa,Guinea-Bissau,Fruits,Online,C,4/21/2017,975661742,6/3/2017,8846,9.33,6.92,82533.18,61214.32,21318.86
+Europe,Monaco,Personal Care,Online,H,3/29/2016,351247346,5/8/2016,750,81.73,56.67,61297.50,42502.50,18795.00
+Europe,Portugal,Beverages,Offline,H,1/20/2016,554721438,1/28/2016,3256,47.45,31.79,154497.20,103508.24,50988.96
+Asia,Turkmenistan,Clothes,Online,M,3/7/2014,247070348,4/23/2014,2461,109.28,35.84,268938.08,88202.24,180735.84
+Asia,Thailand,Meat,Online,M,12/2/2012,859592902,1/14/2013,1497,421.89,364.69,631569.33,545940.93,85628.40
+Australia and Oceania,Vanuatu,Vegetables,Online,L,8/22/2015,743900430,10/6/2015,5523,154.06,90.93,850873.38,502206.39,348666.99
+Sub-Saharan Africa,Central African Republic,Household,Online,C,5/25/2015,121916759,7/5/2015,6733,668.27,502.54,4499461.91,3383601.82,1115860.09
+Asia,Maldives,Personal Care,Online,C,11/26/2013,635878217,12/30/2013,9350,81.73,56.67,764175.50,529864.50,234311.00
+Europe,Germany,Cereal,Offline,C,2/19/2010,398333632,3/2/2010,4629,205.70,117.11,952185.30,542102.19,410083.11
+Sub-Saharan Africa,Botswana,Cosmetics,Online,H,9/22/2011,742144334,10/20/2011,5855,437.20,263.33,2559806.00,1541797.15,1018008.85
+Europe,Vatican City,Beverages,Online,C,12/27/2015,370484149,1/19/2016,3348,47.45,31.79,158862.60,106432.92,52429.68
+Europe,Denmark,Baby Food,Offline,H,9/29/2013,306839406,10/1/2013,9454,255.28,159.42,2413417.12,1507156.68,906260.44
+Sub-Saharan Africa,South Sudan,Fruits,Online,L,10/26/2015,745008933,11/3/2015,3554,9.33,6.92,33158.82,24593.68,8565.14
+Sub-Saharan Africa,Senegal,Vegetables,Online,M,5/12/2011,599104058,6/28/2011,7059,154.06,90.93,1087509.54,641874.87,445634.67
+Europe,Estonia,Beverages,Offline,C,2/9/2017,653548610,2/21/2017,8412,47.45,31.79,399149.40,267417.48,131731.92
+Europe,Belarus,Vegetables,Online,L,12/31/2012,413078916,1/11/2013,8086,154.06,90.93,1245729.16,735259.98,510469.18
+Asia,Myanmar,Vegetables,Online,H,2/6/2014,352743804,3/19/2014,3585,154.06,90.93,552305.10,325984.05,226321.05
+Australia and Oceania,New Zealand,Baby Food,Online,L,11/2/2013,567904603,11/12/2013,4447,255.28,159.42,1135230.16,708940.74,426289.42
+North America,United States of America,Snacks,Online,C,6/27/2010,324235141,7/12/2010,7238,152.58,97.44,1104374.04,705270.72,399103.32
+Europe,Italy,Snacks,Online,M,12/14/2010,307721745,1/1/2011,558,152.58,97.44,85139.64,54371.52,30768.12
+Europe,Kosovo,Office Supplies,Online,C,11/9/2011,374663245,11/26/2011,35,651.21,524.96,22792.35,18373.60,4418.75
+Europe,Ireland,Vegetables,Offline,C,11/16/2010,901670968,12/11/2010,3331,154.06,90.93,513173.86,302887.83,210286.03
+Central America and the Caribbean,Antigua and Barbuda ,Snacks,Online,H,7/20/2010,535668742,8/31/2010,5139,152.58,97.44,784108.62,500744.16,283364.46
+Asia,Bangladesh,Household,Offline,C,6/21/2014,243892896,7/22/2014,2183,668.27,502.54,1458833.41,1097044.82,361788.59
+Middle East and North Africa,Lebanon,Clothes,Offline,C,12/11/2015,163892257,1/25/2016,8216,109.28,35.84,897844.48,294461.44,603383.04
+North America,Greenland,Household,Offline,H,11/28/2016,953528153,1/16/2017,9025,668.27,502.54,6031136.75,4535423.50,1495713.25
+Sub-Saharan Africa,Guinea,Fruits,Online,M,8/3/2016,640974414,9/20/2016,7428,9.33,6.92,69303.24,51401.76,17901.48
+North America,United States of America,Baby Food,Offline,C,4/8/2015,474717366,4/14/2015,8273,255.28,159.42,2111931.44,1318881.66,793049.78
+Australia and Oceania,East Timor,Meat,Online,C,7/4/2010,873555839,8/4/2010,3440,421.89,364.69,1451301.60,1254533.60,196768.00
+Sub-Saharan Africa,Niger,Cereal,Online,M,1/30/2016,976601159,3/11/2016,6840,205.70,117.11,1406988.00,801032.40,605955.60
+Central America and the Caribbean,El Salvador,Fruits,Offline,C,10/1/2012,893277156,11/12/2012,9416,9.33,6.92,87851.28,65158.72,22692.56
+Europe,Montenegro,Cosmetics,Offline,L,8/19/2012,353320157,8/22/2012,4141,437.20,263.33,1810445.20,1090449.53,719995.67
+Australia and Oceania,Palau,Baby Food,Offline,H,7/21/2017,956778991,8/25/2017,1020,255.28,159.42,260385.60,162608.40,97777.20
+Sub-Saharan Africa,Botswana,Baby Food,Offline,L,4/3/2015,324014985,4/10/2015,2089,255.28,159.42,533279.92,333028.38,200251.54
+Europe,Norway,Cereal,Offline,L,6/20/2013,645701968,7/21/2013,6416,205.70,117.11,1319771.20,751377.76,568393.44
+Asia,Maldives,Fruits,Offline,L,6/8/2013,132826268,7/7/2013,5099,9.33,6.92,47573.67,35285.08,12288.59
+Sub-Saharan Africa,Cote d'Ivoire,Meat,Offline,L,8/29/2013,666686713,9/10/2013,6269,421.89,364.69,2644828.41,2286241.61,358586.80
+Europe,Poland,Office Supplies,Online,H,9/19/2013,148894631,9/25/2013,85,651.21,524.96,55352.85,44621.60,10731.25
+Sub-Saharan Africa,Democratic Republic of the Congo,Beverages,Online,L,6/18/2010,151373851,7/12/2010,3741,47.45,31.79,177510.45,118926.39,58584.06
+Sub-Saharan Africa,Sierra Leone,Personal Care,Offline,L,12/16/2016,966360700,1/27/2017,6461,81.73,56.67,528057.53,366144.87,161912.66
+Central America and the Caribbean,Honduras,Baby Food,Online,M,4/4/2013,256404006,4/27/2013,4498,255.28,159.42,1148249.44,717071.16,431178.28
+Central America and the Caribbean,Grenada,Household,Online,C,10/6/2010,704365098,11/23/2010,6140,668.27,502.54,4103177.80,3085595.60,1017582.20
+Sub-Saharan Africa,Namibia,Baby Food,Online,C,8/5/2010,563417804,9/3/2010,6703,255.28,159.42,1711141.84,1068592.26,642549.58
+Middle East and North Africa,Morocco,Vegetables,Offline,H,12/4/2014,407048451,1/23/2015,3537,154.06,90.93,544910.22,321619.41,223290.81
+Asia,Japan,Beverages,Offline,M,8/21/2015,879055869,9/14/2015,1021,47.45,31.79,48446.45,32457.59,15988.86
+Europe,Sweden,Baby Food,Online,L,4/3/2013,443551385,5/9/2013,5566,255.28,159.42,1420888.48,887331.72,533556.76
+Middle East and North Africa,Iran,Personal Care,Online,L,2/25/2013,334958827,2/28/2013,615,81.73,56.67,50263.95,34852.05,15411.90
+Europe,Vatican City,Clothes,Offline,H,3/11/2014,508014523,3/20/2014,1642,109.28,35.84,179437.76,58849.28,120588.48
+Europe,Lithuania,Office Supplies,Online,C,7/8/2012,987767302,8/1/2012,1150,651.21,524.96,748891.50,603704.00,145187.50
+Central America and the Caribbean,Costa Rica,Meat,Offline,L,11/28/2012,519578492,12/29/2012,3677,421.89,364.69,1551289.53,1340965.13,210324.40
+Middle East and North Africa,Egypt,Snacks,Offline,M,6/6/2017,619121921,6/10/2017,789,152.58,97.44,120385.62,76880.16,43505.46
+Middle East and North Africa,Libya,Baby Food,Offline,H,1/20/2014,622383916,2/18/2014,6086,255.28,159.42,1553634.08,970230.12,583403.96
+Asia,Thailand,Clothes,Offline,L,10/5/2010,835663306,11/3/2010,197,109.28,35.84,21528.16,7060.48,14467.68
+Middle East and North Africa,Pakistan,Personal Care,Online,C,8/3/2016,285571420,9/13/2016,5784,81.73,56.67,472726.32,327779.28,144947.04
+Middle East and North Africa,Libya,Baby Food,Online,C,2/21/2015,769032084,4/3/2015,2538,255.28,159.42,647900.64,404607.96,243292.68
+Sub-Saharan Africa,Botswana,Vegetables,Offline,L,10/19/2013,103281629,11/5/2013,2184,154.06,90.93,336467.04,198591.12,137875.92
+Central America and the Caribbean,El Salvador,Cereal,Online,L,3/24/2017,675868880,5/11/2017,3476,205.70,117.11,715013.20,407074.36,307938.84
+Sub-Saharan Africa,Sao Tome and Principe,Fruits,Offline,M,1/4/2016,894655168,1/26/2016,7200,9.33,6.92,67176.00,49824.00,17352.00
+Sub-Saharan Africa,Comoros,Fruits,Online,M,2/23/2013,137814319,3/14/2013,1174,9.33,6.92,10953.42,8124.08,2829.34
+Europe,Croatia,Baby Food,Offline,H,9/19/2012,103832662,10/20/2012,5247,255.28,159.42,1339454.16,836476.74,502977.42
+Middle East and North Africa,Pakistan,Personal Care,Offline,H,1/25/2016,761509025,3/3/2016,6298,81.73,56.67,514735.54,356907.66,157827.88
+Sub-Saharan Africa,Sierra Leone,Beverages,Online,M,6/18/2010,799954736,7/21/2010,3238,47.45,31.79,153643.10,102936.02,50707.08
+Asia,Malaysia,Snacks,Offline,L,9/29/2010,778593623,11/17/2010,2010,152.58,97.44,306685.80,195854.40,110831.40
+Central America and the Caribbean,Antigua and Barbuda ,Cosmetics,Offline,M,2/6/2010,877162015,3/7/2010,588,437.20,263.33,257073.60,154838.04,102235.56
+Europe,Malta,Personal Care,Online,H,2/19/2014,445708739,2/27/2014,3975,81.73,56.67,324876.75,225263.25,99613.50
+Sub-Saharan Africa,Botswana,Household,Offline,M,5/20/2014,254595124,6/21/2014,9210,668.27,502.54,6154766.70,4628393.40,1526373.30
+Sub-Saharan Africa,Chad,Baby Food,Online,H,10/16/2014,244494998,11/21/2014,358,255.28,159.42,91390.24,57072.36,34317.88
+Sub-Saharan Africa,Lesotho,Cereal,Online,M,10/22/2012,876394689,11/9/2012,3519,205.70,117.11,723858.30,412110.09,311748.21
+Central America and the Caribbean,Dominican Republic,Fruits,Online,L,9/24/2010,881593024,10/9/2010,1822,9.33,6.92,16999.26,12608.24,4391.02
+Sub-Saharan Africa,Burundi,Clothes,Online,C,12/1/2011,411701333,12/27/2011,428,109.28,35.84,46771.84,15339.52,31432.32
+Asia,Brunei,Baby Food,Online,M,1/2/2017,588643443,2/11/2017,1531,255.28,159.42,390833.68,244072.02,146761.66
+Europe,Macedonia,Beverages,Offline,M,7/24/2012,354655683,7/31/2012,9353,47.45,31.79,443799.85,297331.87,146467.98
+Asia,Uzbekistan,Clothes,Offline,L,9/16/2012,522286880,10/3/2012,5149,109.28,35.84,562682.72,184540.16,378142.56
+Europe,Belarus,Office Supplies,Offline,C,6/30/2017,624398362,7/24/2017,2206,651.21,524.96,1436569.26,1158061.76,278507.50
+Europe,Liechtenstein,Beverages,Online,C,9/5/2016,264163959,9/22/2016,840,47.45,31.79,39858.00,26703.60,13154.40
+Sub-Saharan Africa,Seychelles ,Beverages,Offline,M,3/21/2016,465069997,3/23/2016,3402,47.45,31.79,161424.90,108149.58,53275.32
+Europe,Russia,Office Supplies,Offline,H,10/16/2011,520915305,11/7/2011,9270,651.21,524.96,6036716.70,4866379.20,1170337.50
+Australia and Oceania,Australia,Beverages,Offline,H,4/9/2015,245811212,5/11/2015,9855,47.45,31.79,467619.75,313290.45,154329.30
+Europe,Armenia,Cereal,Online,H,2/5/2013,424181544,3/4/2013,3600,205.70,117.11,740520.00,421596.00,318924.00
+Europe,United Kingdom,Office Supplies,Online,H,7/3/2015,560762631,7/16/2015,979,651.21,524.96,637534.59,513935.84,123598.75
+Australia and Oceania,Vanuatu,Office Supplies,Offline,H,11/2/2014,230603301,12/10/2014,9496,651.21,524.96,6183890.16,4985020.16,1198870.00
+Australia and Oceania,Palau,Vegetables,Online,H,2/6/2012,429064881,2/15/2012,8688,154.06,90.93,1338473.28,789999.84,548473.44
+Asia,South Korea,Household,Offline,C,2/17/2013,421821200,3/15/2013,5122,668.27,502.54,3422878.94,2574009.88,848869.06
+Sub-Saharan Africa,Malawi,Office Supplies,Online,C,4/10/2017,894858586,5/27/2017,7396,651.21,524.96,4816349.16,3882604.16,933745.00
+Asia,Tajikistan,Beverages,Offline,C,7/27/2013,804475867,8/18/2013,1141,47.45,31.79,54140.45,36272.39,17868.06
+Sub-Saharan Africa,Niger,Baby Food,Offline,M,11/5/2014,527284371,11/18/2014,4018,255.28,159.42,1025715.04,640549.56,385165.48
+Asia,Turkmenistan,Beverages,Offline,M,1/24/2016,510207927,2/15/2016,718,47.45,31.79,34069.10,22825.22,11243.88
+Asia,Sri Lanka,Vegetables,Offline,C,3/31/2013,820482861,4/11/2013,7967,154.06,90.93,1227396.02,724439.31,502956.71
+Middle East and North Africa,Tunisia ,Cosmetics,Online,M,11/5/2014,695658004,12/8/2014,9517,437.20,263.33,4160832.40,2506111.61,1654720.79
+Australia and Oceania,Fiji,Cosmetics,Offline,H,3/25/2015,793594682,3/27/2015,1157,437.20,263.33,505840.40,304672.81,201167.59
+Sub-Saharan Africa,Zambia,Baby Food,Online,M,8/12/2013,942466723,9/4/2013,5702,255.28,159.42,1455606.56,909012.84,546593.72
+Sub-Saharan Africa,Sao Tome and Principe,Fruits,Offline,L,4/15/2010,590760457,4/28/2010,8002,9.33,6.92,74658.66,55373.84,19284.82
+Sub-Saharan Africa,Liberia,Office Supplies,Offline,M,5/21/2010,157274711,6/17/2010,9937,651.21,524.96,6471073.77,5216527.52,1254546.25
+Sub-Saharan Africa,Benin,Beverages,Offline,L,7/14/2012,581120812,8/16/2012,5417,47.45,31.79,257036.65,172206.43,84830.22
+Sub-Saharan Africa,Mali,Fruits,Offline,H,8/23/2012,171722590,9/30/2012,5385,9.33,6.92,50242.05,37264.20,12977.85
+Europe,Moldova ,Office Supplies,Offline,L,4/4/2015,458816373,4/16/2015,2815,651.21,524.96,1833156.15,1477762.40,355393.75
+Asia,Vietnam,Beverages,Offline,H,8/16/2014,342450988,8/29/2014,7712,47.45,31.79,365934.40,245164.48,120769.92
+Europe,Netherlands,Household,Offline,L,8/18/2013,142987763,9/1/2013,2112,668.27,502.54,1411386.24,1061364.48,350021.76
+Middle East and North Africa,Pakistan,Clothes,Offline,L,6/12/2012,251100528,7/5/2012,5081,109.28,35.84,555251.68,182103.04,373148.64
+Middle East and North Africa,Turkey,Cosmetics,Online,L,4/20/2012,677775609,5/5/2012,7719,437.20,263.33,3374746.80,2032644.27,1342102.53
+Sub-Saharan Africa,Democratic Republic of the Congo,Snacks,Offline,M,9/15/2011,604311835,11/4/2011,8156,152.58,97.44,1244442.48,794720.64,449721.84
+Sub-Saharan Africa,Botswana,Office Supplies,Online,H,3/26/2010,632320535,3/28/2010,6553,651.21,524.96,4267379.13,3440062.88,827316.25
+Central America and the Caribbean,Barbados,Snacks,Online,L,4/23/2012,533725535,5/30/2012,101,152.58,97.44,15410.58,9841.44,5569.14
+Sub-Saharan Africa,Equatorial Guinea,Personal Care,Online,L,11/9/2015,600763165,12/8/2015,8026,81.73,56.67,655964.98,454833.42,201131.56
+Australia and Oceania,East Timor,Vegetables,Offline,L,1/24/2016,295982253,3/8/2016,6581,154.06,90.93,1013868.86,598410.33,415458.53
+Sub-Saharan Africa,The Gambia,Meat,Offline,M,10/10/2016,502244126,10/17/2016,4053,421.89,364.69,1709920.17,1478088.57,231831.60
+Middle East and North Africa,Somalia,Personal Care,Offline,L,7/11/2011,372722613,8/18/2011,5759,81.73,56.67,470683.07,326362.53,144320.54
+Europe,Andorra,Snacks,Offline,C,1/23/2010,480904042,2/5/2010,9048,152.58,97.44,1380543.84,881637.12,498906.72
+Middle East and North Africa,Egypt,Household,Offline,L,11/6/2011,570587241,11/8/2011,8299,668.27,502.54,5545972.73,4170579.46,1375393.27
+Asia,Singapore,Cereal,Offline,H,5/27/2017,905883538,7/2/2017,9925,205.70,117.11,2041572.50,1162316.75,879255.75
+Central America and the Caribbean,Saint Vincent and the Grenadines,Vegetables,Offline,L,12/13/2016,921216762,1/14/2017,7366,154.06,90.93,1134805.96,669790.38,465015.58
+Europe,Armenia,Vegetables,Online,M,12/7/2016,571323239,1/1/2017,6097,154.06,90.93,939303.82,554400.21,384903.61
+Sub-Saharan Africa,Senegal,Cosmetics,Online,M,6/28/2013,781251800,8/2/2013,8623,437.20,263.33,3769975.60,2270694.59,1499281.01
+Asia,Taiwan,Meat,Offline,C,5/29/2011,296363770,7/13/2011,9480,421.89,364.69,3999517.20,3457261.20,542256.00
+Middle East and North Africa,Libya,Vegetables,Online,H,9/26/2012,632332980,10/25/2012,236,154.06,90.93,36358.16,21459.48,14898.68
+Middle East and North Africa,Azerbaijan,Cosmetics,Offline,H,1/14/2013,225145757,2/5/2013,4487,437.20,263.33,1961716.40,1181561.71,780154.69
+Europe,Italy,Snacks,Online,H,9/16/2012,281100928,11/3/2012,2866,152.58,97.44,437294.28,279263.04,158031.24
+Middle East and North Africa,Libya,Snacks,Online,H,3/22/2013,726809823,5/5/2013,8033,152.58,97.44,1225675.14,782735.52,442939.62
+Europe,Croatia,Household,Online,L,4/26/2013,659196269,6/1/2013,9680,668.27,502.54,6468853.60,4864587.20,1604266.40
+Europe,Bulgaria,Personal Care,Offline,H,10/24/2012,595496594,11/4/2012,9530,81.73,56.67,778886.90,540065.10,238821.80
+Middle East and North Africa,Egypt,Cosmetics,Offline,C,5/14/2016,223259627,7/3/2016,6340,437.20,263.33,2771848.00,1669512.20,1102335.80
+Sub-Saharan Africa,Guinea-Bissau,Vegetables,Online,H,7/25/2014,650346696,9/3/2014,894,154.06,90.93,137729.64,81291.42,56438.22
+Europe,Ireland,Personal Care,Offline,H,5/30/2010,354931628,6/8/2010,1011,81.73,56.67,82629.03,57293.37,25335.66
+Middle East and North Africa,Afghanistan,Snacks,Online,M,7/19/2015,135500752,7/21/2015,6539,152.58,97.44,997720.62,637160.16,360560.46
+Central America and the Caribbean,Honduras,Cereal,Online,H,3/7/2016,860852897,4/25/2016,4357,205.70,117.11,896234.90,510248.27,385986.63
+Middle East and North Africa,Qatar,Vegetables,Offline,H,9/23/2014,320099389,11/2/2014,3377,154.06,90.93,520260.62,307070.61,213190.01
+Sub-Saharan Africa,Mali,Office Supplies,Offline,M,11/16/2010,872664058,11/25/2010,9542,651.21,524.96,6213845.82,5009168.32,1204677.50
+Asia,Malaysia,Cereal,Offline,H,12/16/2012,898283231,12/18/2012,825,205.70,117.11,169702.50,96615.75,73086.75
+Asia,Turkmenistan,Cereal,Online,L,6/11/2011,647005736,6/12/2011,2230,205.70,117.11,458711.00,261155.30,197555.70
+Australia and Oceania,Solomon Islands,Beverages,Online,C,12/30/2012,889192903,1/1/2013,795,47.45,31.79,37722.75,25273.05,12449.70
+Asia,Bhutan,Fruits,Online,L,1/2/2014,665518558,2/14/2014,585,9.33,6.92,5458.05,4048.20,1409.85
+Europe,Spain,Meat,Offline,C,11/29/2011,436969029,12/17/2011,7701,421.89,364.69,3248974.89,2808477.69,440497.20
+Asia,Taiwan,Cosmetics,Online,H,8/1/2016,734843146,8/17/2016,5272,437.20,263.33,2304918.40,1388275.76,916642.64
+Europe,Moldova ,Vegetables,Online,L,3/28/2016,810752236,5/4/2016,8458,154.06,90.93,1303039.48,769085.94,533953.54
+Europe,Italy,Office Supplies,Offline,C,7/8/2011,886620128,7/25/2011,9453,651.21,524.96,6155888.13,4962446.88,1193441.25
+Sub-Saharan Africa,Mozambique,Meat,Online,M,9/11/2011,804683148,9/19/2011,2480,421.89,364.69,1046287.20,904431.20,141856.00
+Australia and Oceania,Solomon Islands,Household,Online,L,10/2/2015,477490127,10/3/2015,8794,668.27,502.54,5876766.38,4419336.76,1457429.62
+Australia and Oceania,Tonga,Snacks,Online,H,3/3/2016,337902390,4/21/2016,1681,152.58,97.44,256486.98,163796.64,92690.34
+Europe,Finland,Cereal,Offline,M,4/10/2010,889093768,5/20/2010,1458,205.70,117.11,299910.60,170746.38,129164.22
+Europe,Poland,Cereal,Online,C,8/6/2011,454550588,9/6/2011,475,205.70,117.11,97707.50,55627.25,42080.25
+Asia,Turkmenistan,Clothes,Offline,H,10/24/2015,128071677,11/7/2015,8110,109.28,35.84,886260.80,290662.40,595598.40
+Asia,North Korea,Personal Care,Online,M,1/30/2012,623768365,3/16/2012,5776,81.73,56.67,472072.48,327325.92,144746.56
+Europe,Austria,Office Supplies,Online,L,2/18/2017,926064479,3/10/2017,1913,651.21,524.96,1245764.73,1004248.48,241516.25
+Sub-Saharan Africa,Mali,Personal Care,Online,H,11/28/2010,539696347,1/11/2011,6997,81.73,56.67,571864.81,396519.99,175344.82
+Australia and Oceania,Samoa ,Household,Offline,L,1/18/2016,839712798,1/31/2016,8532,668.27,502.54,5701679.64,4287671.28,1414008.36
+Asia,Indonesia,Beverages,Offline,C,10/31/2010,121475160,12/8/2010,6054,47.45,31.79,287262.30,192456.66,94805.64
+Central America and the Caribbean,Jamaica,Clothes,Online,H,4/1/2016,350657260,4/15/2016,6130,109.28,35.84,669886.40,219699.20,450187.20
+Europe,Andorra,Fruits,Offline,C,6/29/2016,413245427,7/2/2016,7360,9.33,6.92,68668.80,50931.20,17737.60
+Sub-Saharan Africa,Zimbabwe,Household,Offline,M,10/3/2015,165538489,10/8/2015,5372,668.27,502.54,3589946.44,2699644.88,890301.56
+Europe,Finland,Beverages,Online,H,9/18/2011,884147775,10/19/2011,7829,47.45,31.79,371486.05,248883.91,122602.14
+Sub-Saharan Africa,Guinea,Cosmetics,Online,C,6/24/2014,315997111,7/25/2014,9422,437.20,263.33,4119298.40,2481095.26,1638203.14
+Europe,Andorra,Cosmetics,Online,C,6/30/2012,328322827,7/19/2012,6876,437.20,263.33,3006187.20,1810657.08,1195530.12
+Europe,Germany,Snacks,Online,H,3/22/2014,158673751,5/10/2014,3944,152.58,97.44,601775.52,384303.36,217472.16
+Europe,Italy,Snacks,Offline,L,1/7/2014,464911210,2/10/2014,6413,152.58,97.44,978495.54,624882.72,353612.82
+Asia,Taiwan,Baby Food,Online,L,2/10/2011,175209033,3/10/2011,7101,255.28,159.42,1812743.28,1132041.42,680701.86
+Middle East and North Africa,Morocco,Household,Online,L,5/9/2013,538053548,6/27/2013,856,668.27,502.54,572039.12,430174.24,141864.88
+Sub-Saharan Africa,Republic of the Congo,Personal Care,Online,H,9/26/2010,172243583,9/27/2010,9559,81.73,56.67,781257.07,541708.53,239548.54
+Central America and the Caribbean,The Bahamas,Baby Food,Offline,H,1/13/2017,916890466,1/16/2017,7119,255.28,159.42,1817338.32,1134910.98,682427.34
+Asia,Maldives,Office Supplies,Online,M,1/4/2013,181418025,1/17/2013,4480,651.21,524.96,2917420.80,2351820.80,565600.00
+Europe,Serbia,Beverages,Online,C,10/12/2010,395562589,12/1/2010,4615,47.45,31.79,218981.75,146710.85,72270.90
+Europe,Italy,Baby Food,Offline,H,3/1/2012,459372985,3/22/2012,7529,255.28,159.42,1922003.12,1200273.18,721729.94
+Europe,Armenia,Meat,Online,L,6/25/2012,693210542,8/13/2012,5259,421.89,364.69,2218719.51,1917904.71,300814.80
+Asia,Kyrgyzstan,Personal Care,Offline,L,11/24/2011,587749087,1/7/2012,6871,81.73,56.67,561566.83,389379.57,172187.26
+Europe,Sweden,Fruits,Offline,L,8/22/2011,153974950,9/20/2011,3464,9.33,6.92,32319.12,23970.88,8348.24
+Sub-Saharan Africa,Kenya,Vegetables,Online,L,3/23/2010,373186957,4/7/2010,3169,154.06,90.93,488216.14,288157.17,200058.97
+Australia and Oceania,Federated States of Micronesia,Personal Care,Offline,M,10/17/2014,946996438,11/13/2014,6145,81.73,56.67,502230.85,348237.15,153993.70
+Europe,Romania,Snacks,Online,H,8/18/2014,747327220,9/15/2014,9587,152.58,97.44,1462784.46,934157.28,528627.18
+Sub-Saharan Africa,Botswana,Household,Offline,H,3/23/2015,966415631,5/7/2015,2716,668.27,502.54,1815021.32,1364898.64,450122.68
+Europe,Bosnia and Herzegovina,Clothes,Online,M,10/10/2011,166810500,11/21/2011,1789,109.28,35.84,195501.92,64117.76,131384.16
+Australia and Oceania,Samoa ,Meat,Offline,H,9/8/2015,131373155,10/24/2015,5091,421.89,364.69,2147841.99,1856636.79,291205.20
+Sub-Saharan Africa,Comoros,Vegetables,Online,L,12/4/2012,913277423,12/28/2012,7939,154.06,90.93,1223082.34,721893.27,501189.07
+Europe,Lithuania,Personal Care,Offline,M,3/31/2013,386009633,4/5/2013,7683,81.73,56.67,627931.59,435395.61,192535.98
+Europe,Germany,Personal Care,Offline,H,2/8/2016,993368613,2/16/2016,8702,81.73,56.67,711214.46,493142.34,218072.12
+Sub-Saharan Africa,Ghana,Office Supplies,Offline,H,6/13/2014,299465692,6/26/2014,7408,651.21,524.96,4824163.68,3888903.68,935260.00
+Middle East and North Africa,Israel,Vegetables,Offline,L,8/26/2013,438724696,10/5/2013,7242,154.06,90.93,1115702.52,658515.06,457187.46
+Asia,Philippines,Cosmetics,Offline,H,7/29/2012,465881955,8/17/2012,3678,437.20,263.33,1608021.60,968527.74,639493.86
+Europe,Germany,Baby Food,Online,L,12/9/2014,405986297,1/2/2015,9222,255.28,159.42,2354192.16,1470171.24,884020.92
+Sub-Saharan Africa,Republic of the Congo,Household,Online,M,5/17/2010,804399049,6/23/2010,8409,668.27,502.54,5619482.43,4225858.86,1393623.57
+Europe,Bulgaria,Beverages,Online,H,2/4/2016,476794040,3/7/2016,2807,47.45,31.79,133192.15,89234.53,43957.62
+Middle East and North Africa,Egypt,Personal Care,Offline,L,6/30/2012,559157598,8/12/2012,6014,81.73,56.67,491524.22,340813.38,150710.84
+Sub-Saharan Africa,Comoros,Cosmetics,Online,H,2/18/2015,457788550,4/4/2015,8660,437.20,263.33,3786152.00,2280437.80,1505714.20
+Middle East and North Africa,Tunisia ,Vegetables,Online,L,4/30/2010,999298226,5/25/2010,3407,154.06,90.93,524882.42,309798.51,215083.91
+Europe,Serbia,Meat,Offline,C,12/21/2011,380610454,12/29/2011,9946,421.89,364.69,4196117.94,3627206.74,568911.20
+Asia,Brunei,Baby Food,Online,C,4/19/2012,918961560,5/24/2012,2,255.28,159.42,510.56,318.84,191.72
+Sub-Saharan Africa,Mauritania,Office Supplies,Online,H,12/25/2015,501900374,1/24/2016,2329,651.21,524.96,1516668.09,1222631.84,294036.25
+Sub-Saharan Africa,The Gambia,Household,Online,M,8/5/2013,237288224,9/9/2013,7713,668.27,502.54,5154366.51,3876091.02,1278275.49
+Asia,Taiwan,Cosmetics,Online,C,9/19/2015,403298938,10/17/2015,3973,437.20,263.33,1736995.60,1046210.09,690785.51
+Asia,Japan,Snacks,Offline,H,4/12/2011,898418843,4/14/2011,955,152.58,97.44,145713.90,93055.20,52658.70
+Asia,Malaysia,Snacks,Offline,L,10/8/2016,791446769,11/13/2016,5541,152.58,97.44,845445.78,539915.04,305530.74
+Central America and the Caribbean,Trinidad and Tobago,Beverages,Offline,M,11/22/2011,571494042,12/16/2011,6642,47.45,31.79,315162.90,211149.18,104013.72
+Central America and the Caribbean,Haiti,Cosmetics,Offline,M,6/25/2011,797984492,8/13/2011,199,437.20,263.33,87002.80,52402.67,34600.13
+Central America and the Caribbean,Trinidad and Tobago,Cosmetics,Offline,C,4/16/2016,750654447,4/19/2016,4187,437.20,263.33,1830556.40,1102562.71,727993.69
+Sub-Saharan Africa,Uganda,Clothes,Offline,L,10/17/2016,679552733,11/8/2016,3610,109.28,35.84,394500.80,129382.40,265118.40
+Europe,France,Vegetables,Offline,L,2/1/2012,455040681,2/2/2012,5504,154.06,90.93,847946.24,500478.72,347467.52
+Europe,Iceland,Clothes,Online,M,9/10/2013,917792117,10/7/2013,3938,109.28,35.84,430344.64,141137.92,289206.72
+Europe,Albania,Cosmetics,Offline,L,6/27/2011,728793370,8/12/2011,5009,437.20,263.33,2189934.80,1319019.97,870914.83
+Sub-Saharan Africa,Chad,Fruits,Offline,C,5/4/2015,419343268,6/19/2015,1847,9.33,6.92,17232.51,12781.24,4451.27
+Middle East and North Africa,Somalia,Cereal,Online,M,6/18/2013,141053140,7/13/2013,9613,205.70,117.11,1977394.10,1125778.43,851615.67
+Sub-Saharan Africa,Mauritius ,Cereal,Online,C,1/27/2014,115846812,2/18/2014,501,205.70,117.11,103055.70,58672.11,44383.59
+Europe,Austria,Fruits,Offline,M,4/20/2011,185960614,5/28/2011,8733,9.33,6.92,81478.89,60432.36,21046.53
+Sub-Saharan Africa,Swaziland,Household,Offline,C,9/12/2011,263943374,9/25/2011,5565,668.27,502.54,3718922.55,2796635.10,922287.45
+Sub-Saharan Africa,Djibouti,Office Supplies,Offline,M,4/26/2015,782656419,4/26/2015,4282,651.21,524.96,2788481.22,2247878.72,540602.50
+Europe,Finland,Office Supplies,Offline,H,11/29/2011,445273578,1/9/2012,5201,651.21,524.96,3386943.21,2730316.96,656626.25
+Asia,Taiwan,Office Supplies,Online,C,1/7/2015,275281178,2/14/2015,673,651.21,524.96,438264.33,353298.08,84966.25
+Sub-Saharan Africa,Senegal,Fruits,Online,M,9/24/2012,466478049,10/29/2012,76,9.33,6.92,709.08,525.92,183.16
+Middle East and North Africa,Somalia,Meat,Offline,H,12/8/2016,832975518,1/15/2017,4821,421.89,364.69,2033931.69,1758170.49,275761.20
+Europe,Georgia,Baby Food,Online,L,1/26/2014,359197413,3/8/2014,3352,255.28,159.42,855698.56,534375.84,321322.72
+Middle East and North Africa,Azerbaijan,Baby Food,Online,M,5/11/2014,349880063,5/12/2014,6141,255.28,159.42,1567674.48,978998.22,588676.26
+Asia,Brunei,Cosmetics,Online,M,2/27/2010,380072295,3/15/2010,693,437.20,263.33,302979.60,182487.69,120491.91
+Middle East and North Africa,Egypt,Household,Online,C,1/14/2010,545135438,2/27/2010,6545,668.27,502.54,4373827.15,3289124.30,1084702.85
+Middle East and North Africa,United Arab Emirates,Baby Food,Offline,C,4/8/2012,110743319,5/9/2012,264,255.28,159.42,67393.92,42086.88,25307.04
+Sub-Saharan Africa,Mauritius ,Cosmetics,Offline,C,3/9/2016,662882268,4/17/2016,449,437.20,263.33,196302.80,118235.17,78067.63
+Sub-Saharan Africa,Guinea,Meat,Offline,C,11/4/2010,257851111,11/20/2010,2729,421.89,364.69,1151337.81,995239.01,156098.80
+Sub-Saharan Africa,Zimbabwe,Baby Food,Offline,M,8/18/2016,172261178,9/13/2016,4765,255.28,159.42,1216409.20,759636.30,456772.90
+Europe,Romania,Personal Care,Offline,L,5/14/2013,853036296,6/1/2013,1251,81.73,56.67,102244.23,70894.17,31350.06
+Europe,Switzerland,Fruits,Offline,M,3/21/2012,567412793,3/27/2012,8910,9.33,6.92,83130.30,61657.20,21473.10
+North America,Canada,Clothes,Offline,H,1/26/2014,352939498,3/10/2014,1495,109.28,35.84,163373.60,53580.80,109792.80
+Sub-Saharan Africa,Togo,Clothes,Online,M,4/14/2013,867477738,5/27/2013,4795,109.28,35.84,523997.60,171852.80,352144.80
+Europe,Ireland,Cosmetics,Offline,H,8/27/2016,139201343,9/6/2016,1625,437.20,263.33,710450.00,427911.25,282538.75
+Central America and the Caribbean,Panama,Fruits,Offline,C,11/22/2016,316596639,12/4/2016,6836,9.33,6.92,63779.88,47305.12,16474.76
+Sub-Saharan Africa,Central African Republic,Beverages,Online,H,7/25/2011,918462455,7/28/2011,2305,47.45,31.79,109372.25,73275.95,36096.30
+Europe,Ukraine,Cosmetics,Online,C,6/9/2014,183910119,6/11/2014,1946,437.20,263.33,850791.20,512440.18,338351.02
+Europe,Luxembourg,Clothes,Online,H,11/7/2013,922363460,11/23/2013,6700,109.28,35.84,732176.00,240128.00,492048.00
+Central America and the Caribbean,El Salvador,Household,Online,M,5/8/2014,163558804,5/22/2014,9540,668.27,502.54,6375295.80,4794231.60,1581064.20
+Sub-Saharan Africa,Cameroon,Fruits,Offline,L,3/7/2010,407544982,3/12/2010,472,9.33,6.92,4403.76,3266.24,1137.52
+Middle East and North Africa,Iraq,Meat,Online,H,10/22/2011,174683320,11/3/2011,1531,421.89,364.69,645913.59,558340.39,87573.20
+Australia and Oceania,New Zealand,Household,Offline,H,10/27/2011,755647647,12/9/2011,1786,668.27,502.54,1193530.22,897536.44,295993.78
+Sub-Saharan Africa,Mali,Meat,Online,H,6/15/2011,361424291,7/5/2011,2334,421.89,364.69,984691.26,851186.46,133504.80
+Sub-Saharan Africa,Togo,Baby Food,Online,H,10/14/2016,873312079,10/22/2016,1306,255.28,159.42,333395.68,208202.52,125193.16
+Europe,Austria,Beverages,Offline,C,4/2/2012,192922341,5/1/2012,8863,47.45,31.79,420549.35,281754.77,138794.58
+Europe,Monaco,Cereal,Online,L,6/3/2017,792178905,7/21/2017,2197,205.70,117.11,451922.90,257290.67,194632.23
+Sub-Saharan Africa,Botswana,Baby Food,Online,C,1/24/2015,263318097,3/4/2015,531,255.28,159.42,135553.68,84652.02,50901.66
+Sub-Saharan Africa,Equatorial Guinea,Office Supplies,Online,H,7/12/2015,768888747,7/29/2015,122,651.21,524.96,79447.62,64045.12,15402.50
+Middle East and North Africa,Turkey,Household,Offline,H,1/25/2015,491752183,2/6/2015,9254,668.27,502.54,6184170.58,4650505.16,1533665.42
+Middle East and North Africa,Somalia,Fruits,Offline,H,10/20/2014,385082232,11/28/2014,3245,9.33,6.92,30275.85,22455.40,7820.45
+Central America and the Caribbean,El Salvador,Meat,Offline,C,11/26/2016,122365224,12/22/2016,9444,421.89,364.69,3984329.16,3444132.36,540196.80
+Central America and the Caribbean,Haiti,Household,Online,H,4/6/2013,347399985,5/19/2013,2231,668.27,502.54,1490910.37,1121166.74,369743.63
+Europe,Serbia,Beverages,Online,M,12/20/2011,424297845,1/8/2012,8016,47.45,31.79,380359.20,254828.64,125530.56
+Sub-Saharan Africa,Lesotho,Office Supplies,Offline,M,10/28/2010,687482631,11/21/2010,243,651.21,524.96,158244.03,127565.28,30678.75
+Australia and Oceania,Solomon Islands,Cosmetics,Offline,H,4/6/2016,191690671,5/18/2016,4384,437.20,263.33,1916684.80,1154438.72,762246.08
+Australia and Oceania,Fiji,Cereal,Online,C,11/9/2016,761970794,12/20/2016,2945,205.70,117.11,605786.50,344888.95,260897.55
+Europe,Ireland,Baby Food,Online,H,5/23/2017,243684327,5/30/2017,462,255.28,159.42,117939.36,73652.04,44287.32
+Europe,San Marino,Clothes,Offline,M,5/7/2012,152505099,5/19/2012,8503,109.28,35.84,929207.84,304747.52,624460.32
+Middle East and North Africa,Somalia,Cereal,Online,M,6/4/2012,724419438,7/16/2012,665,205.70,117.11,136790.50,77878.15,58912.35
+Asia,Nepal,Household,Offline,M,6/16/2010,465726172,7/6/2010,7579,668.27,502.54,5064818.33,3808750.66,1256067.67
+Europe,Georgia,Baby Food,Online,L,6/24/2015,203036630,7/28/2015,1905,255.28,159.42,486308.40,303695.10,182613.30
+Sub-Saharan Africa,Republic of the Congo,Meat,Online,M,2/4/2011,833274638,2/13/2011,3337,421.89,364.69,1407846.93,1216970.53,190876.40
+Sub-Saharan Africa,Guinea-Bissau,Household,Offline,H,4/5/2012,173676526,5/10/2012,3598,668.27,502.54,2404435.46,1808138.92,596296.54
+Europe,Ukraine,Snacks,Offline,C,1/25/2016,611791121,3/3/2016,1443,152.58,97.44,220172.94,140605.92,79567.02
+Sub-Saharan Africa,Mali,Cosmetics,Offline,C,2/4/2013,555479753,2/12/2013,7658,437.20,263.33,3348077.60,2016581.14,1331496.46
+Sub-Saharan Africa,Zimbabwe,Beverages,Offline,H,12/4/2013,282916247,12/29/2013,59,47.45,31.79,2799.55,1875.61,923.94
+Australia and Oceania,Vanuatu,Cereal,Online,C,1/20/2015,592586934,2/19/2015,8497,205.70,117.11,1747832.90,995083.67,752749.23
+Central America and the Caribbean,Dominican Republic,Clothes,Online,M,4/5/2010,553290641,4/7/2010,9851,109.28,35.84,1076517.28,353059.84,723457.44
+Asia,Vietnam,Clothes,Online,C,2/6/2017,654138696,3/16/2017,3031,109.28,35.84,331227.68,108631.04,222596.64
+Europe,San Marino,Cereal,Offline,C,7/22/2012,554554927,8/6/2012,3981,205.70,117.11,818891.70,466214.91,352676.79
+Europe,Bosnia and Herzegovina,Office Supplies,Offline,H,7/11/2012,434275662,8/13/2012,674,651.21,524.96,438915.54,353823.04,85092.50
+Sub-Saharan Africa,Equatorial Guinea,Personal Care,Online,L,1/17/2015,543349730,2/7/2015,8115,81.73,56.67,663238.95,459877.05,203361.90
+Sub-Saharan Africa,Guinea-Bissau,Baby Food,Offline,C,8/24/2011,752138459,9/22/2011,3339,255.28,159.42,852379.92,532303.38,320076.54
+Sub-Saharan Africa,Mali,Vegetables,Online,L,11/7/2013,101315677,12/17/2013,415,154.06,90.93,63934.90,37735.95,26198.95
+Asia,Sri Lanka,Cereal,Online,C,7/15/2011,851867711,7/17/2011,5441,205.70,117.11,1119213.70,637195.51,482018.19
+Europe,Germany,Personal Care,Offline,H,7/27/2014,835093390,7/29/2014,1547,81.73,56.67,126436.31,87668.49,38767.82
+Asia,Sri Lanka,Cereal,Online,L,2/28/2011,202604043,4/10/2011,3893,205.70,117.11,800790.10,455909.23,344880.87
+Europe,Croatia,Beverages,Online,M,2/6/2017,976323497,2/10/2017,4674,47.45,31.79,221781.30,148586.46,73194.84
+Sub-Saharan Africa,Mauritius ,Cosmetics,Online,C,5/18/2011,298488080,7/3/2011,8111,437.20,263.33,3546129.20,2135869.63,1410259.57
+Sub-Saharan Africa,Senegal,Beverages,Online,M,9/9/2015,781646621,9/12/2015,5460,47.45,31.79,259077.00,173573.40,85503.60
+North America,United States of America,Fruits,Online,M,12/9/2014,158660447,1/9/2015,7,9.33,6.92,65.31,48.44,16.87
+Europe,Lithuania,Beverages,Online,H,1/9/2014,732703387,1/28/2014,2069,47.45,31.79,98174.05,65773.51,32400.54
+Sub-Saharan Africa,Nigeria,Beverages,Offline,H,5/4/2011,827261769,5/26/2011,3996,47.45,31.79,189610.20,127032.84,62577.36
+Central America and the Caribbean,Saint Kitts and Nevis ,Beverages,Online,C,2/15/2010,636134421,3/20/2010,5166,47.45,31.79,245126.70,164227.14,80899.56
+Europe,Slovenia,Household,Online,C,9/10/2014,873432672,9/17/2014,6992,668.27,502.54,4672543.84,3513759.68,1158784.16
+Europe,Serbia,Clothes,Online,C,6/25/2011,523580348,8/4/2011,7915,109.28,35.84,864951.20,283673.60,581277.60
+Central America and the Caribbean,Belize,Personal Care,Online,H,9/17/2010,891313779,10/25/2010,8409,81.73,56.67,687267.57,476538.03,210729.54
+Asia,Taiwan,Clothes,Offline,M,4/25/2012,651681792,6/12/2012,5979,109.28,35.84,653385.12,214287.36,439097.76
+Europe,Greece,Personal Care,Online,M,4/16/2017,800045716,5/14/2017,161,81.73,56.67,13158.53,9123.87,4034.66
+Australia and Oceania,New Zealand,Office Supplies,Online,L,5/1/2016,602079379,5/26/2016,7523,651.21,524.96,4899052.83,3949274.08,949778.75
+Europe,Malta,Vegetables,Online,M,5/10/2016,743769109,5/11/2016,6662,154.06,90.93,1026347.72,605775.66,420572.06
+Sub-Saharan Africa,Cameroon,Household,Online,C,12/22/2013,181413733,12/27/2013,3210,668.27,502.54,2145146.70,1613153.40,531993.30
+Central America and the Caribbean,Antigua and Barbuda ,Fruits,Online,C,6/12/2014,191624581,8/1/2014,4827,9.33,6.92,45035.91,33402.84,11633.07
+Middle East and North Africa,Qatar,Fruits,Offline,L,9/22/2012,321325480,10/25/2012,6205,9.33,6.92,57892.65,42938.60,14954.05
+Sub-Saharan Africa,Mali,Office Supplies,Online,H,6/1/2012,637752759,6/22/2012,4069,651.21,524.96,2649773.49,2136062.24,513711.25
+Sub-Saharan Africa,Ghana,Clothes,Online,L,5/24/2014,378455245,6/8/2014,2172,109.28,35.84,237356.16,77844.48,159511.68
+Europe,San Marino,Snacks,Offline,L,1/9/2013,201294267,2/9/2013,6302,152.58,97.44,961559.16,614066.88,347492.28
+Sub-Saharan Africa,Comoros,Meat,Offline,C,2/6/2015,834443652,2/27/2015,9275,421.89,364.69,3913029.75,3382499.75,530530.00
+Asia,Tajikistan,Cereal,Online,M,5/2/2013,826389729,5/5/2013,5940,205.70,117.11,1221858.00,695633.40,526224.60
+Sub-Saharan Africa,Gabon,Vegetables,Offline,M,11/11/2012,595931327,12/15/2012,8177,154.06,90.93,1259748.62,743534.61,516214.01
+North America,Greenland,Personal Care,Offline,H,4/24/2012,182179772,5/23/2012,9898,81.73,56.67,808963.54,560919.66,248043.88
+Sub-Saharan Africa,Mali,Fruits,Offline,M,3/2/2015,594558894,4/19/2015,2044,9.33,6.92,19070.52,14144.48,4926.04
+Sub-Saharan Africa,Guinea-Bissau,Meat,Online,M,10/26/2010,662805020,11/2/2010,7589,421.89,364.69,3201723.21,2767632.41,434090.80
+Asia,South Korea,Household,Offline,L,3/29/2016,186966979,4/17/2016,6539,668.27,502.54,4369817.53,3286109.06,1083708.47
+Asia,Vietnam,Clothes,Online,C,8/9/2011,387406098,8/11/2011,928,109.28,35.84,101411.84,33259.52,68152.32
+Australia and Oceania,Australia,Beverages,Online,C,3/20/2012,754796206,4/8/2012,9826,47.45,31.79,466243.70,312368.54,153875.16
+Middle East and North Africa,Iraq,Beverages,Offline,C,9/27/2011,400123631,11/7/2011,4329,47.45,31.79,205411.05,137618.91,67792.14
+Asia,Mongolia,Beverages,Online,C,4/2/2016,304687201,5/1/2016,2569,47.45,31.79,121899.05,81668.51,40230.54
+Sub-Saharan Africa,Cape Verde,Meat,Offline,L,3/10/2010,170098245,3/19/2010,4705,421.89,364.69,1984992.45,1715866.45,269126.00
+Europe,Portugal,Meat,Online,L,2/11/2013,668280589,3/28/2013,7932,421.89,364.69,3346431.48,2892721.08,453710.40
+Sub-Saharan Africa,Djibouti,Personal Care,Offline,C,5/20/2015,291470563,5/30/2015,1472,81.73,56.67,120306.56,83418.24,36888.32
+Middle East and North Africa,Somalia,Fruits,Offline,M,3/7/2012,302216994,3/29/2012,1579,9.33,6.92,14732.07,10926.68,3805.39
+Central America and the Caribbean,Grenada,Cereal,Offline,L,12/4/2014,683381211,12/11/2014,6542,205.70,117.11,1345689.40,766133.62,579555.78
+Sub-Saharan Africa,Niger,Office Supplies,Online,L,2/24/2017,588137042,3/28/2017,1675,651.21,524.96,1090776.75,879308.00,211468.75
+Sub-Saharan Africa,Rwanda,Personal Care,Offline,C,6/18/2013,589970815,7/13/2013,4329,81.73,56.67,353809.17,245324.43,108484.74
+Australia and Oceania,Fiji,Baby Food,Offline,M,11/23/2010,432681357,11/28/2010,8884,255.28,159.42,2267907.52,1416287.28,851620.24
+Europe,Albania,Household,Online,C,7/14/2017,380379998,7/16/2017,1749,668.27,502.54,1168804.23,878942.46,289861.77
+Europe,Netherlands,Clothes,Online,H,1/16/2016,767490565,2/23/2016,6368,109.28,35.84,695895.04,228229.12,467665.92
+Australia and Oceania,East Timor,Vegetables,Online,M,11/6/2012,648749387,12/18/2012,8215,154.06,90.93,1265602.90,746989.95,518612.95
+Central America and the Caribbean,Barbados,Fruits,Online,L,9/5/2011,949205291,10/11/2011,9794,9.33,6.92,91378.02,67774.48,23603.54
+Asia,Sri Lanka,Meat,Offline,H,4/22/2017,414219605,4/27/2017,5641,421.89,364.69,2379881.49,2057216.29,322665.20
+Sub-Saharan Africa,Chad,Snacks,Offline,C,8/25/2016,559466159,9/15/2016,7324,152.58,97.44,1117495.92,713650.56,403845.36
+Europe,Iceland,Snacks,Offline,L,10/30/2012,720931279,11/18/2012,8441,152.58,97.44,1287927.78,822491.04,465436.74
+North America,Mexico,Office Supplies,Offline,H,10/29/2013,304913794,11/21/2013,9623,651.21,524.96,6266593.83,5051690.08,1214903.75
+Europe,United Kingdom,Snacks,Online,L,7/13/2013,138025033,8/3/2013,3529,152.58,97.44,538454.82,343865.76,194589.06
+Asia,Brunei,Clothes,Offline,H,9/10/2010,217188823,10/19/2010,9854,109.28,35.84,1076845.12,353167.36,723677.76
+Central America and the Caribbean,Grenada,Meat,Online,M,9/10/2012,159641492,9/24/2012,320,421.89,364.69,135004.80,116700.80,18304.00
+Europe,Andorra,Meat,Offline,H,8/16/2016,552931869,9/9/2016,3682,421.89,364.69,1553398.98,1342788.58,210610.40
+Sub-Saharan Africa,Zimbabwe,Snacks,Offline,L,1/26/2013,704921281,2/5/2013,727,152.58,97.44,110925.66,70838.88,40086.78
+Sub-Saharan Africa,Guinea-Bissau,Snacks,Online,L,8/9/2012,893783557,9/28/2012,9271,152.58,97.44,1414569.18,903366.24,511202.94
+Asia,Brunei,Office Supplies,Online,H,9/25/2011,118005025,10/30/2011,9164,651.21,524.96,5967688.44,4810733.44,1156955.00
+Middle East and North Africa,Iran,Snacks,Offline,M,10/18/2011,146384513,12/4/2011,7285,152.58,97.44,1111545.30,709850.40,401694.90
+Sub-Saharan Africa,Cape Verde,Clothes,Online,C,3/20/2015,568033349,4/17/2015,2546,109.28,35.84,278226.88,91248.64,186978.24
+Europe,Liechtenstein,Fruits,Online,L,2/8/2014,142375361,2/19/2014,888,9.33,6.92,8285.04,6144.96,2140.08
+Asia,Brunei,Beverages,Online,C,10/21/2016,849146878,11/30/2016,286,47.45,31.79,13570.70,9091.94,4478.76
+Central America and the Caribbean,Panama,Personal Care,Online,H,10/9/2013,238396728,11/27/2013,5744,81.73,56.67,469457.12,325512.48,143944.64
+Middle East and North Africa,Yemen,Snacks,Online,H,9/6/2011,880486238,10/10/2011,4299,152.58,97.44,655941.42,418894.56,237046.86
+Europe,Belgium,Cosmetics,Offline,C,6/27/2014,916089236,7/28/2014,17,437.20,263.33,7432.40,4476.61,2955.79
+Asia,Brunei,Cereal,Online,H,1/22/2012,806192052,2/28/2012,8998,205.70,117.11,1850888.60,1053755.78,797132.82
+Asia,Malaysia,Cereal,Online,M,4/9/2014,182093513,5/17/2014,4372,205.70,117.11,899320.40,512004.92,387315.48
+Asia,Japan,Fruits,Offline,H,11/26/2016,995404946,12/31/2016,1299,9.33,6.92,12119.67,8989.08,3130.59
+Sub-Saharan Africa,South Sudan,Beverages,Online,C,1/12/2013,768050181,1/28/2013,1971,47.45,31.79,93523.95,62658.09,30865.86
+Europe,Luxembourg,Fruits,Offline,L,12/6/2011,242265546,1/7/2012,614,9.33,6.92,5728.62,4248.88,1479.74
+Sub-Saharan Africa,Swaziland,Office Supplies,Offline,M,7/31/2012,230599868,8/22/2012,8480,651.21,524.96,5522260.80,4451660.80,1070600.00
+Europe,Malta,Cosmetics,Online,M,1/12/2015,265914475,2/21/2015,8857,437.20,263.33,3872280.40,2332313.81,1539966.59
+North America,Canada,Household,Offline,M,8/10/2016,851383197,9/5/2016,2062,668.27,502.54,1377972.74,1036237.48,341735.26
+Central America and the Caribbean,Jamaica,Personal Care,Offline,L,9/16/2015,310492360,10/21/2015,444,81.73,56.67,36288.12,25161.48,11126.64
+Europe,Slovakia,Snacks,Online,L,7/26/2015,637040793,8/4/2015,3382,152.58,97.44,516025.56,329542.08,186483.48
+Sub-Saharan Africa,Mauritania,Beverages,Online,H,12/3/2012,745139825,12/8/2012,2288,47.45,31.79,108565.60,72735.52,35830.08
+Sub-Saharan Africa,Burkina Faso,Household,Online,M,12/7/2016,519213283,12/24/2016,5603,668.27,502.54,3744316.81,2815731.62,928585.19
+Asia,Kazakhstan,Vegetables,Online,C,2/9/2015,363997495,2/11/2015,3802,154.06,90.93,585736.12,345715.86,240020.26
+Europe,Andorra,Personal Care,Offline,L,12/12/2014,754541289,12/19/2014,4390,81.73,56.67,358794.70,248781.30,110013.40
+Central America and the Caribbean,Jamaica,Household,Online,H,6/11/2017,886205995,7/21/2017,6902,668.27,502.54,4612399.54,3468531.08,1143868.46
+Sub-Saharan Africa,Republic of the Congo,Baby Food,Online,C,4/19/2013,924665439,6/7/2013,7906,255.28,159.42,2018243.68,1260374.52,757869.16
+Asia,Myanmar,Household,Online,H,12/30/2016,655905950,2/11/2017,6001,668.27,502.54,4010288.27,3015742.54,994545.73
+Sub-Saharan Africa,Benin,Beverages,Offline,H,1/3/2010,836226356,1/26/2010,6816,47.45,31.79,323419.20,216680.64,106738.56
+Middle East and North Africa,Turkey,Household,Offline,C,9/25/2012,942237985,9/25/2012,8013,668.27,502.54,5354847.51,4026853.02,1327994.49
+Asia,South Korea,Cereal,Online,H,7/24/2012,520864665,8/20/2012,4284,205.70,117.11,881218.80,501699.24,379519.56
+Middle East and North Africa,Bahrain,Snacks,Offline,H,2/1/2013,539342725,2/15/2013,2353,152.58,97.44,359020.74,229276.32,129744.42
+Asia,Kyrgyzstan,Baby Food,Offline,M,3/11/2015,235220992,3/26/2015,5974,255.28,159.42,1525042.72,952375.08,572667.64
+Asia,Tajikistan,Cereal,Online,C,3/27/2013,266360795,5/13/2013,933,205.70,117.11,191918.10,109263.63,82654.47
+Asia,Singapore,Baby Food,Online,H,1/6/2014,460935962,1/16/2014,49,255.28,159.42,12508.72,7811.58,4697.14
+Sub-Saharan Africa,Botswana,Cereal,Online,M,3/31/2010,267432820,4/24/2010,8169,205.70,117.11,1680363.30,956671.59,723691.71
+Sub-Saharan Africa,Seychelles ,Cereal,Offline,H,8/20/2014,104650199,10/1/2014,7174,205.70,117.11,1475691.80,840147.14,635544.66
+Central America and the Caribbean,Honduras,Cosmetics,Online,L,8/30/2010,911699426,10/3/2010,975,437.20,263.33,426270.00,256746.75,169523.25
+Middle East and North Africa,Yemen,Baby Food,Offline,L,12/14/2016,998004329,12/20/2016,514,255.28,159.42,131213.92,81941.88,49272.04
+Asia,Cambodia,Personal Care,Online,L,5/3/2015,993301236,6/1/2015,8764,81.73,56.67,716281.72,496655.88,219625.84
+Europe,Serbia,Vegetables,Offline,L,3/16/2015,697638976,3/26/2015,5731,154.06,90.93,882917.86,521119.83,361798.03
+Middle East and North Africa,Bahrain,Cosmetics,Online,C,11/16/2011,431378877,12/8/2011,3451,437.20,263.33,1508777.20,908751.83,600025.37
+Australia and Oceania,Federated States of Micronesia,Vegetables,Offline,C,2/1/2013,585194766,2/25/2013,990,154.06,90.93,152519.40,90020.70,62498.70
+Central America and the Caribbean,Haiti,Personal Care,Offline,C,7/1/2012,270072972,8/9/2012,9449,81.73,56.67,772266.77,535474.83,236791.94
+Europe,Czech Republic,Baby Food,Online,C,3/10/2016,467312324,4/8/2016,6956,255.28,159.42,1775727.68,1108925.52,666802.16
+Middle East and North Africa,Azerbaijan,Fruits,Offline,C,3/2/2016,878524148,3/20/2016,3673,9.33,6.92,34269.09,25417.16,8851.93
+Central America and the Caribbean,Antigua and Barbuda ,Cosmetics,Online,C,11/8/2016,375632274,11/28/2016,6792,437.20,263.33,2969462.40,1788537.36,1180925.04
+Sub-Saharan Africa,Senegal,Fruits,Offline,M,3/3/2016,150873029,3/13/2016,5537,9.33,6.92,51660.21,38316.04,13344.17
+Sub-Saharan Africa,Malawi,Vegetables,Offline,C,11/18/2016,566795241,11/22/2016,6162,154.06,90.93,949317.72,560310.66,389007.06
+Asia,Bhutan,Personal Care,Online,M,4/4/2015,706260240,5/4/2015,6954,81.73,56.67,568350.42,394083.18,174267.24
+Europe,Slovenia,Clothes,Online,L,5/26/2012,622441852,5/28/2012,3231,109.28,35.84,353083.68,115799.04,237284.64
+Middle East and North Africa,Azerbaijan,Beverages,Offline,H,6/30/2010,888826406,7/1/2010,2340,47.45,31.79,111033.00,74388.60,36644.40
+Europe,Bulgaria,Meat,Online,C,7/27/2016,349212729,9/11/2016,8662,421.89,364.69,3654411.18,3158944.78,495466.40
+Asia,Tajikistan,Meat,Offline,L,1/1/2016,167712152,1/16/2016,8607,421.89,364.69,3631207.23,3138886.83,492320.40
+Middle East and North Africa,Egypt,Fruits,Offline,M,2/28/2014,678748500,3/29/2014,5619,9.33,6.92,52425.27,38883.48,13541.79
+Australia and Oceania,Fiji,Household,Online,C,6/26/2017,937058103,7/16/2017,5171,668.27,502.54,3455624.17,2598634.34,856989.83
+Middle East and North Africa,Turkey,Clothes,Online,M,7/19/2014,967689788,7/28/2014,9767,109.28,35.84,1067337.76,350049.28,717288.48
+Sub-Saharan Africa,Togo,Cosmetics,Offline,L,2/14/2010,416004884,3/17/2010,3945,437.20,263.33,1724754.00,1038836.85,685917.15
+Australia and Oceania,Tuvalu,Baby Food,Offline,C,11/7/2013,797677218,11/14/2013,9270,255.28,159.42,2366445.60,1477823.40,888622.20
+Central America and the Caribbean,Belize,Snacks,Online,C,9/16/2013,548693120,10/10/2013,9342,152.58,97.44,1425402.36,910284.48,515117.88
+Asia,South Korea,Fruits,Online,H,2/4/2010,875351417,2/8/2010,4791,9.33,6.92,44700.03,33153.72,11546.31
+Sub-Saharan Africa,Gabon,Snacks,Online,H,1/22/2012,804263436,2/28/2012,8278,152.58,97.44,1263057.24,806608.32,456448.92
+Europe,Hungary,Cosmetics,Online,H,10/6/2010,332353007,11/22/2010,9495,437.20,263.33,4151214.00,2500318.35,1650895.65
+Europe,Slovakia,Meat,Offline,H,8/8/2013,876856458,8/29/2013,166,421.89,364.69,70033.74,60538.54,9495.20
+Asia,Singapore,Vegetables,Online,M,2/1/2010,325322616,3/12/2010,9046,154.06,90.93,1393626.76,822552.78,571073.98
+Asia,Myanmar,Household,Online,L,7/8/2013,685612809,8/17/2013,6921,668.27,502.54,4625096.67,3478079.34,1147017.33
+Sub-Saharan Africa,Central African Republic,Beverages,Offline,M,10/5/2011,435900866,10/7/2011,1608,47.45,31.79,76299.60,51118.32,25181.28
+Asia,Nepal,Baby Food,Online,C,6/15/2016,374673116,7/4/2016,2956,255.28,159.42,754607.68,471245.52,283362.16
+Sub-Saharan Africa,Mauritius ,Cereal,Offline,L,10/21/2013,470728385,11/9/2013,7845,205.70,117.11,1613716.50,918727.95,694988.55
+Europe,Bulgaria,Beverages,Offline,C,10/19/2013,313178002,12/6/2013,5185,47.45,31.79,246028.25,164831.15,81197.10
+Europe,Kosovo,Personal Care,Online,L,2/17/2016,461445796,3/22/2016,920,81.73,56.67,75191.60,52136.40,23055.20
+Sub-Saharan Africa,Lesotho,Personal Care,Online,L,12/26/2013,195268094,1/21/2014,3023,81.73,56.67,247069.79,171313.41,75756.38
+Central America and the Caribbean,El Salvador,Snacks,Offline,C,12/20/2012,664693725,12/24/2012,6499,152.58,97.44,991617.42,633262.56,358354.86
+Sub-Saharan Africa,Mozambique,Snacks,Online,C,3/9/2012,840084016,3/26/2012,8384,152.58,97.44,1279230.72,816936.96,462293.76
+Sub-Saharan Africa,Senegal,Cosmetics,Offline,L,8/5/2015,662112796,9/24/2015,2745,437.20,263.33,1200114.00,722840.85,477273.15
+Australia and Oceania,Samoa ,Vegetables,Online,C,1/20/2013,591766393,3/10/2013,5681,154.06,90.93,875214.86,516573.33,358641.53
+Sub-Saharan Africa,Sao Tome and Principe,Clothes,Online,H,6/11/2014,260343635,6/12/2014,322,109.28,35.84,35188.16,11540.48,23647.68
+Asia,Japan,Meat,Offline,C,7/20/2015,719455850,7/27/2015,1829,421.89,364.69,771636.81,667018.01,104618.80
+Europe,Spain,Cosmetics,Offline,C,1/3/2017,391026866,1/8/2017,2394,437.20,263.33,1046656.80,630412.02,416244.78
+Asia,Laos,Personal Care,Offline,L,12/15/2012,917293012,1/30/2013,6241,81.73,56.67,510076.93,353677.47,156399.46
+Australia and Oceania,Solomon Islands,Baby Food,Offline,L,7/8/2017,410803115,7/27/2017,4626,255.28,159.42,1180925.28,737476.92,443448.36
+Europe,Germany,Vegetables,Offline,C,8/7/2015,204418504,9/3/2015,833,154.06,90.93,128331.98,75744.69,52587.29
+Sub-Saharan Africa,Democratic Republic of the Congo,Personal Care,Online,C,2/5/2012,801313006,2/15/2012,5180,81.73,56.67,423361.40,293550.60,129810.80
+Europe,Romania,Meat,Offline,L,12/22/2012,524972951,1/17/2013,17,421.89,364.69,7172.13,6199.73,972.40
+Europe,Latvia,Beverages,Online,C,11/27/2013,469197165,12/11/2013,4723,47.45,31.79,224106.35,150144.17,73962.18
+Middle East and North Africa,Jordan,Office Supplies,Offline,L,8/17/2011,448096978,9/18/2011,708,651.21,524.96,461056.68,371671.68,89385.00
+Australia and Oceania,Fiji,Clothes,Online,H,4/17/2015,346096217,5/10/2015,6417,109.28,35.84,701249.76,229985.28,471264.48
+Central America and the Caribbean,Cuba,Fruits,Online,H,5/28/2012,567931210,7/12/2012,2321,9.33,6.92,21654.93,16061.32,5593.61
+Europe,Sweden,Household,Offline,H,6/23/2010,688650786,8/7/2010,5926,668.27,502.54,3960168.02,2978052.04,982115.98
+Australia and Oceania,Marshall Islands,Baby Food,Online,M,6/30/2010,803616273,7/30/2010,6768,255.28,159.42,1727735.04,1078954.56,648780.48
+North America,Greenland,Snacks,Offline,M,9/26/2010,178501498,11/15/2010,1415,152.58,97.44,215900.70,137877.60,78023.10
+Sub-Saharan Africa,Mauritius ,Cosmetics,Offline,H,7/16/2010,399292790,7/28/2010,8465,437.20,263.33,3700898.00,2229088.45,1471809.55
+Sub-Saharan Africa,Comoros,Office Supplies,Online,L,2/2/2014,422288978,2/21/2014,3548,651.21,524.96,2310493.08,1862558.08,447935.00
+Asia,Cambodia,Vegetables,Offline,C,7/1/2011,624101388,7/31/2011,4324,154.06,90.93,666155.44,393181.32,272974.12
+Australia and Oceania,Marshall Islands,Cereal,Online,C,11/14/2012,551653850,1/1/2013,5488,205.70,117.11,1128881.60,642699.68,486181.92
+Central America and the Caribbean,Dominica,Meat,Online,L,3/26/2014,272182691,4/30/2014,3762,421.89,364.69,1587150.18,1371963.78,215186.40
+Europe,Macedonia,Office Supplies,Online,M,6/17/2016,823236739,8/1/2016,2900,651.21,524.96,1888509.00,1522384.00,366125.00
+Sub-Saharan Africa,Mozambique,Personal Care,Offline,L,12/2/2013,162677323,1/11/2014,8690,81.73,56.67,710233.70,492462.30,217771.40
+Central America and the Caribbean,The Bahamas,Household,Online,M,5/29/2013,818678271,6/25/2013,3948,668.27,502.54,2638329.96,1984027.92,654302.04
+Europe,Armenia,Fruits,Offline,L,3/17/2015,439725911,4/7/2015,3524,9.33,6.92,32878.92,24386.08,8492.84
+Asia,Japan,Beverages,Offline,H,11/17/2016,344619071,12/16/2016,9296,47.45,31.79,441095.20,295519.84,145575.36
+Sub-Saharan Africa,Ghana,Baby Food,Offline,M,1/20/2017,572469079,2/6/2017,5177,255.28,159.42,1321584.56,825317.34,496267.22
+Sub-Saharan Africa,Lesotho,Beverages,Offline,M,8/22/2011,332699763,10/5/2011,2108,47.45,31.79,100024.60,67013.32,33011.28
+Europe,Cyprus,Snacks,Online,H,10/1/2012,255047452,10/30/2012,3064,152.58,97.44,467505.12,298556.16,168948.96
+Australia and Oceania,Samoa ,Cosmetics,Online,H,8/22/2014,139560973,9/21/2014,8048,437.20,263.33,3518585.60,2119279.84,1399305.76
+Middle East and North Africa,Tunisia ,Clothes,Online,M,8/14/2012,306601655,9/2/2012,9098,109.28,35.84,994229.44,326072.32,668157.12
+Asia,Indonesia,Beverages,Offline,M,6/6/2014,246843326,6/12/2014,5280,47.45,31.79,250536.00,167851.20,82684.80
+Asia,Singapore,Office Supplies,Online,M,9/24/2013,871272313,10/9/2013,7694,651.21,524.96,5010409.74,4039042.24,971367.50
+Central America and the Caribbean,Panama,Fruits,Online,M,8/8/2016,461187446,8/14/2016,4469,9.33,6.92,41695.77,30925.48,10770.29
+Sub-Saharan Africa,Burundi,Cosmetics,Offline,M,1/18/2015,518200051,1/22/2015,5766,437.20,263.33,2520895.20,1518360.78,1002534.42
+Sub-Saharan Africa,Chad,Beverages,Offline,M,6/30/2013,814233958,7/23/2013,8777,47.45,31.79,416468.65,279020.83,137447.82
+Asia,Japan,Cosmetics,Offline,H,6/7/2017,741525495,7/16/2017,2727,437.20,263.33,1192244.40,718100.91,474143.49
+Europe,Malta,Meat,Offline,C,6/26/2014,662623488,7/11/2014,3870,421.89,364.69,1632714.30,1411350.30,221364.00
+Europe,San Marino,Vegetables,Offline,M,1/22/2016,560389268,2/22/2016,492,154.06,90.93,75797.52,44737.56,31059.96
+Middle East and North Africa,Morocco,Fruits,Offline,C,9/12/2015,487996661,9/13/2015,7911,9.33,6.92,73809.63,54744.12,19065.51
+North America,Greenland,Vegetables,Online,L,7/29/2015,118931996,8/4/2015,3475,154.06,90.93,535358.50,315981.75,219376.75
+Sub-Saharan Africa,Ethiopia,Cosmetics,Online,L,2/24/2015,996994102,3/10/2015,1565,437.20,263.33,684218.00,412111.45,272106.55
+Asia,India,Personal Care,Online,C,12/10/2014,686294305,12/15/2014,8591,81.73,56.67,702142.43,486851.97,215290.46
+Australia and Oceania,New Zealand,Baby Food,Offline,C,10/2/2012,421256434,11/20/2012,7995,255.28,159.42,2040963.60,1274562.90,766400.70
+Asia,Bangladesh,Fruits,Online,L,1/8/2015,156616818,2/4/2015,5252,9.33,6.92,49001.16,36343.84,12657.32
+Asia,Brunei,Vegetables,Online,C,4/25/2010,817424285,5/6/2010,2866,154.06,90.93,441535.96,260605.38,180930.58
+Sub-Saharan Africa,Ethiopia,Cereal,Offline,M,12/27/2010,249040162,2/1/2011,5373,205.70,117.11,1105226.10,629232.03,475994.07
+Europe,France,Office Supplies,Offline,C,7/12/2011,867138278,8/4/2011,4341,651.21,524.96,2826902.61,2278851.36,548051.25
+Sub-Saharan Africa,Niger,Beverages,Offline,L,1/22/2015,207704961,1/29/2015,3368,47.45,31.79,159811.60,107068.72,52742.88
+Central America and the Caribbean,Nicaragua,Vegetables,Offline,H,5/31/2014,377039039,6/14/2014,3085,154.06,90.93,475275.10,280519.05,194756.05
+Asia,Kazakhstan,Cereal,Offline,H,1/21/2011,401751840,2/21/2011,6152,205.70,117.11,1265466.40,720460.72,545005.68
+Sub-Saharan Africa,Lesotho,Clothes,Offline,L,4/23/2011,278767192,5/25/2011,2262,109.28,35.84,247191.36,81070.08,166121.28
+Europe,Montenegro,Household,Online,H,12/25/2014,525321424,12/31/2014,3138,668.27,502.54,2097031.26,1576970.52,520060.74
+Australia and Oceania,Vanuatu,Vegetables,Online,H,8/5/2011,828963363,9/6/2011,7535,154.06,90.93,1160842.10,685157.55,475684.55
+Europe,Cyprus,Clothes,Online,H,6/10/2014,497554337,7/28/2014,6240,109.28,35.84,681907.20,223641.60,458265.60
+Sub-Saharan Africa,Burundi,Fruits,Offline,M,5/22/2011,709268176,6/25/2011,7070,9.33,6.92,65963.10,48924.40,17038.70
+Middle East and North Africa,Saudi Arabia,Snacks,Offline,L,1/29/2014,462591207,3/1/2014,9873,152.58,97.44,1506422.34,962025.12,544397.22
+Europe,Vatican City,Personal Care,Offline,M,4/15/2016,626322257,5/5/2016,1529,81.73,56.67,124965.17,86648.43,38316.74
+Australia and Oceania,Tonga,Vegetables,Offline,M,11/9/2012,789572656,12/24/2012,950,154.06,90.93,146357.00,86383.50,59973.50
+Europe,Netherlands,Baby Food,Offline,C,1/21/2011,611766231,2/26/2011,4077,255.28,159.42,1040776.56,649955.34,390821.22
+Central America and the Caribbean,Honduras,Office Supplies,Offline,C,8/21/2011,272639310,9/29/2011,8885,651.21,524.96,5786000.85,4664269.60,1121731.25
+Central America and the Caribbean,Honduras,Fruits,Online,H,8/22/2012,922240722,9/29/2012,379,9.33,6.92,3536.07,2622.68,913.39
+Europe,Montenegro,Baby Food,Offline,H,3/3/2013,630931794,4/1/2013,5593,255.28,159.42,1427781.04,891636.06,536144.98
+Europe,San Marino,Office Supplies,Offline,L,3/4/2017,239386355,4/20/2017,8597,651.21,524.96,5598452.37,4513081.12,1085371.25
+Asia,Bangladesh,Clothes,Online,C,7/11/2014,208590734,8/19/2014,5488,109.28,35.84,599728.64,196689.92,403038.72
+Sub-Saharan Africa,Cameroon,Personal Care,Offline,M,2/3/2015,169843757,3/19/2015,9397,81.73,56.67,768016.81,532527.99,235488.82
+Asia,Philippines,Cereal,Online,H,9/1/2014,274756753,9/9/2014,5484,205.70,117.11,1128058.80,642231.24,485827.56
+Middle East and North Africa,Iraq,Personal Care,Online,H,11/19/2013,745253551,12/12/2013,5942,81.73,56.67,485639.66,336733.14,148906.52
+Sub-Saharan Africa,Lesotho,Cereal,Online,C,6/15/2014,523570477,7/23/2014,4994,205.70,117.11,1027265.80,584847.34,442418.46
+Asia,Uzbekistan,Snacks,Online,H,5/10/2015,422256362,6/23/2015,3896,152.58,97.44,594451.68,379626.24,214825.44
+Europe,Germany,Household,Offline,M,8/21/2016,874172532,10/2/2016,5933,668.27,502.54,3964845.91,2981569.82,983276.09
+Australia and Oceania,Papua New Guinea,Household,Offline,C,8/18/2015,582492816,9/11/2015,1423,668.27,502.54,950948.21,715114.42,235833.79
+Europe,Iceland,Personal Care,Offline,C,9/19/2010,570703542,11/3/2010,2715,81.73,56.67,221896.95,153859.05,68037.90
+Europe,Hungary,Cosmetics,Online,M,9/20/2012,132603538,11/6/2012,9188,437.20,263.33,4016993.60,2419476.04,1597517.56
+Central America and the Caribbean,Panama,Cereal,Offline,M,10/20/2010,882304131,11/25/2010,2254,205.70,117.11,463647.80,263965.94,199681.86
+Middle East and North Africa,Tunisia ,Baby Food,Online,M,2/13/2014,904229152,2/19/2014,355,255.28,159.42,90624.40,56594.10,34030.30
+Middle East and North Africa,Iraq,Office Supplies,Offline,L,3/6/2010,603114926,3/22/2010,3964,651.21,524.96,2581396.44,2080941.44,500455.00
+Sub-Saharan Africa,Liberia,Snacks,Online,H,1/20/2014,454010283,1/30/2014,587,152.58,97.44,89564.46,57197.28,32367.18
+Europe,Czech Republic,Meat,Offline,L,8/6/2011,552276551,9/24/2011,9759,421.89,364.69,4117224.51,3559009.71,558214.80
+Europe,Macedonia,Snacks,Offline,M,3/22/2016,163587558,4/19/2016,8048,152.58,97.44,1227963.84,784197.12,443766.72
+Central America and the Caribbean,Haiti,Beverages,Offline,M,2/16/2012,873929631,2/25/2012,4053,47.45,31.79,192314.85,128844.87,63469.98
+Sub-Saharan Africa,Mauritania,Cereal,Online,L,1/26/2011,739601600,3/10/2011,3404,205.70,117.11,700202.80,398642.44,301560.36
+Sub-Saharan Africa,Nigeria,Cosmetics,Online,M,9/25/2010,137214791,11/2/2010,3761,437.20,263.33,1644309.20,990384.13,653925.07
+Sub-Saharan Africa,Tanzania,Fruits,Offline,C,8/26/2013,413693034,10/13/2013,9817,9.33,6.92,91592.61,67933.64,23658.97
+Asia,Laos,Fruits,Offline,H,11/7/2015,736272656,12/12/2015,8296,9.33,6.92,77401.68,57408.32,19993.36
+Sub-Saharan Africa,Nigeria,Baby Food,Offline,L,8/18/2010,342502486,8/18/2010,2952,255.28,159.42,753586.56,470607.84,282978.72
+Central America and the Caribbean,Dominica,Cosmetics,Offline,L,1/29/2015,790243852,2/10/2015,9572,437.20,263.33,4184878.40,2520594.76,1664283.64
+Asia,Malaysia,Personal Care,Online,M,4/9/2013,107670581,5/1/2013,972,81.73,56.67,79441.56,55083.24,24358.32
+Australia and Oceania,Nauru,Household,Online,H,1/24/2013,443269002,3/13/2013,2003,668.27,502.54,1338544.81,1006587.62,331957.19
+Europe,Andorra,Baby Food,Offline,M,1/10/2012,415837943,2/23/2012,4543,255.28,159.42,1159737.04,724245.06,435491.98
+Australia and Oceania,Papua New Guinea,Beverages,Offline,L,5/8/2016,964488732,6/6/2016,2504,47.45,31.79,118814.80,79602.16,39212.64
+Europe,Hungary,Baby Food,Offline,H,5/17/2014,398645198,5/26/2014,6828,255.28,159.42,1743051.84,1088519.76,654532.08
+Sub-Saharan Africa,Burundi,Fruits,Online,C,8/23/2010,248043668,8/29/2010,488,9.33,6.92,4553.04,3376.96,1176.08
+North America,Canada,Cosmetics,Online,C,7/20/2014,312732970,8/17/2014,3490,437.20,263.33,1525828.00,919021.70,606806.30
+Europe,Latvia,Personal Care,Offline,H,11/2/2013,913074433,12/17/2013,7870,81.73,56.67,643215.10,445992.90,197222.20
+Middle East and North Africa,Iraq,Household,Offline,C,3/31/2016,639741885,4/18/2016,2695,668.27,502.54,1800987.65,1354345.30,446642.35
+Sub-Saharan Africa,Angola,Office Supplies,Online,C,6/9/2015,403721654,6/29/2015,9064,651.21,524.96,5902567.44,4758237.44,1144330.00
+Asia,Bhutan,Clothes,Offline,H,6/27/2017,286312568,7/9/2017,5106,109.28,35.84,557983.68,182999.04,374984.64
+Europe,Andorra,Fruits,Offline,H,5/27/2014,889125955,6/15/2014,983,9.33,6.92,9171.39,6802.36,2369.03
+Australia and Oceania,Australia,Beverages,Offline,M,8/10/2010,184085643,8/14/2010,3887,47.45,31.79,184438.15,123567.73,60870.42
+Europe,Austria,Fruits,Offline,H,8/6/2011,263427960,9/20/2011,3042,9.33,6.92,28381.86,21050.64,7331.22
+Asia,Sri Lanka,Beverages,Offline,H,7/23/2012,589701735,7/26/2012,4703,47.45,31.79,223157.35,149508.37,73648.98
+Asia,Bhutan,Vegetables,Offline,C,5/3/2017,245768296,5/12/2017,7155,154.06,90.93,1102299.30,650604.15,451695.15
+Australia and Oceania,Vanuatu,Beverages,Offline,L,11/22/2011,184801471,12/20/2011,5717,47.45,31.79,271271.65,181743.43,89528.22
+Australia and Oceania,Solomon Islands,Baby Food,Online,M,7/21/2013,980287587,8/30/2013,7736,255.28,159.42,1974846.08,1233273.12,741572.96
+Middle East and North Africa,Tunisia ,Baby Food,Online,C,3/14/2014,576025474,3/25/2014,7593,255.28,159.42,1938341.04,1210476.06,727864.98
+Asia,Bangladesh,Snacks,Online,H,5/10/2014,136126458,6/2/2014,1699,152.58,97.44,259233.42,165550.56,93682.86
+Sub-Saharan Africa,Mali,Beverages,Online,L,10/26/2011,895014369,12/11/2011,3496,47.45,31.79,165885.20,111137.84,54747.36
+Asia,Turkmenistan,Beverages,Online,C,1/10/2013,107425534,1/21/2013,8458,47.45,31.79,401332.10,268879.82,132452.28
+Sub-Saharan Africa,Niger,Cosmetics,Offline,M,2/15/2014,498408782,3/28/2014,9089,437.20,263.33,3973710.80,2393406.37,1580304.43
+Sub-Saharan Africa,Benin,Cosmetics,Online,M,4/27/2012,813325440,5/15/2012,9927,437.20,263.33,4340084.40,2614076.91,1726007.49
+Sub-Saharan Africa,The Gambia,Baby Food,Offline,M,4/1/2017,767849338,4/17/2017,2537,255.28,159.42,647645.36,404448.54,243196.82
+Middle East and North Africa,Algeria,Fruits,Offline,L,11/18/2016,597966802,12/7/2016,520,9.33,6.92,4851.60,3598.40,1253.20
+Middle East and North Africa,United Arab Emirates,Personal Care,Online,C,8/18/2011,609976661,8/20/2011,4504,81.73,56.67,368111.92,255241.68,112870.24
+Europe,Liechtenstein,Meat,Online,H,7/12/2010,730490243,7/14/2010,7151,421.89,364.69,3016935.39,2607898.19,409037.20
+Middle East and North Africa,Yemen,Personal Care,Online,H,4/29/2012,956431376,6/14/2012,8153,81.73,56.67,666344.69,462030.51,204314.18
+Europe,Poland,Cereal,Online,L,11/1/2016,905036389,11/20/2016,9234,205.70,117.11,1899433.80,1081393.74,818040.06
+Australia and Oceania,Federated States of Micronesia,Meat,Offline,H,7/28/2013,263854110,7/30/2013,9149,421.89,364.69,3859871.61,3336548.81,523322.80
+Central America and the Caribbean,Honduras,Baby Food,Online,C,11/2/2015,140745866,12/6/2015,8684,255.28,159.42,2216851.52,1384403.28,832448.24
+Sub-Saharan Africa,Djibouti,Clothes,Online,C,6/28/2011,813885486,8/10/2011,5656,109.28,35.84,618087.68,202711.04,415376.64
+Europe,Montenegro,Clothes,Online,C,3/4/2012,381759297,3/25/2012,9914,109.28,35.84,1083401.92,355317.76,728084.16
+Europe,Belarus,Cosmetics,Offline,M,9/2/2011,613166129,10/21/2011,8338,437.20,263.33,3645373.60,2195645.54,1449728.06
+Sub-Saharan Africa,Democratic Republic of the Congo,Snacks,Offline,H,5/22/2012,197217309,6/11/2012,9839,152.58,97.44,1501234.62,958712.16,542522.46
+Central America and the Caribbean,The Bahamas,Clothes,Offline,M,1/9/2014,593336665,1/24/2014,359,109.28,35.84,39231.52,12866.56,26364.96
+Europe,Ukraine,Office Supplies,Offline,M,5/3/2017,181260526,6/3/2017,7872,651.21,524.96,5126325.12,4132485.12,993840.00
+Sub-Saharan Africa,Chad,Snacks,Online,L,10/14/2012,111037719,12/3/2012,7383,152.58,97.44,1126498.14,719399.52,407098.62
+Asia,Tajikistan,Office Supplies,Online,M,8/16/2014,253029572,9/3/2014,5928,651.21,524.96,3860372.88,3111962.88,748410.00
+Middle East and North Africa,Algeria,Clothes,Offline,H,8/27/2011,547909915,9/17/2011,7574,109.28,35.84,827686.72,271452.16,556234.56
+Asia,Myanmar,Vegetables,Online,M,6/19/2016,556665074,6/26/2016,8421,154.06,90.93,1297339.26,765721.53,531617.73
+Central America and the Caribbean,Dominican Republic,Household,Offline,L,3/19/2016,810593879,4/1/2016,1597,668.27,502.54,1067227.19,802556.38,264670.81
+Middle East and North Africa,Oman,Clothes,Offline,L,4/4/2014,561307656,5/12/2014,2264,109.28,35.84,247409.92,81141.76,166268.16
+Australia and Oceania,Fiji,Cosmetics,Offline,L,3/27/2011,930730235,4/15/2011,2614,437.20,263.33,1142840.80,688344.62,454496.18
+Central America and the Caribbean,Barbados,Clothes,Online,L,6/4/2016,861097943,6/12/2016,6872,109.28,35.84,750972.16,246292.48,504679.68
+Europe,Georgia,Snacks,Online,C,9/1/2013,264959609,10/18/2013,6291,152.58,97.44,959880.78,612995.04,346885.74
+Europe,Malta,Fruits,Online,L,7/31/2010,475176560,9/4/2010,4159,9.33,6.92,38803.47,28780.28,10023.19
+Europe,Armenia,Baby Food,Offline,H,1/23/2012,194922626,2/7/2012,791,255.28,159.42,201926.48,126101.22,75825.26
+Europe,France,Snacks,Offline,M,7/3/2016,447684133,8/14/2016,8538,152.58,97.44,1302728.04,831942.72,470785.32
+Europe,Liechtenstein,Personal Care,Online,H,1/4/2012,527259910,1/11/2012,6779,81.73,56.67,554047.67,384165.93,169881.74
+Asia,Uzbekistan,Beverages,Online,M,6/15/2010,247761285,7/3/2010,6925,47.45,31.79,328591.25,220145.75,108445.50
+Central America and the Caribbean,Nicaragua,Meat,Offline,C,6/3/2013,393612086,6/21/2013,7418,421.89,364.69,3129580.02,2705270.42,424309.60
+Sub-Saharan Africa,Rwanda,Clothes,Offline,M,12/30/2015,469548642,1/13/2016,8732,109.28,35.84,954232.96,312954.88,641278.08
+Asia,Vietnam,Fruits,Online,M,7/13/2010,950619781,7/17/2010,8373,9.33,6.92,78120.09,57941.16,20178.93
+Sub-Saharan Africa,Guinea,Cosmetics,Offline,M,3/2/2013,132186830,4/16/2013,5875,437.20,263.33,2568550.00,1547063.75,1021486.25
+Europe,Hungary,Baby Food,Online,M,8/10/2014,879923617,9/15/2014,7807,255.28,159.42,1992970.96,1244591.94,748379.02
+Europe,Portugal,Snacks,Offline,H,3/9/2014,279816472,4/14/2014,2767,152.58,97.44,422188.86,269616.48,152572.38
+Australia and Oceania,Solomon Islands,Beverages,Offline,C,2/4/2016,888164222,3/20/2016,6385,47.45,31.79,302968.25,202979.15,99989.10
+Sub-Saharan Africa,Cote d'Ivoire,Cosmetics,Online,H,6/11/2010,381578195,7/5/2010,6322,437.20,263.33,2763978.40,1664772.26,1099206.14
+Sub-Saharan Africa,Uganda,Household,Online,M,11/27/2014,106982219,12/22/2014,7271,668.27,502.54,4858991.17,3653968.34,1205022.83
+Central America and the Caribbean,Haiti,Fruits,Offline,H,5/14/2010,131612622,5/25/2010,5954,9.33,6.92,55550.82,41201.68,14349.14
+Europe,Cyprus,Snacks,Online,M,11/5/2012,593018233,12/11/2012,6128,152.58,97.44,935010.24,597112.32,337897.92
+Europe,Macedonia,Baby Food,Online,H,9/16/2016,349060380,9/28/2016,3578,255.28,159.42,913391.84,570404.76,342987.08
+Central America and the Caribbean,Trinidad and Tobago,Household,Online,M,8/11/2013,127912890,9/26/2013,1122,668.27,502.54,749798.94,563849.88,185949.06
+Sub-Saharan Africa,Cape Verde,Cosmetics,Offline,C,5/27/2011,278062093,5/28/2011,3607,437.20,263.33,1576980.40,949831.31,627149.09
+Central America and the Caribbean,Costa Rica,Fruits,Offline,H,3/21/2015,318306815,4/26/2015,2915,9.33,6.92,27196.95,20171.80,7025.15
+Middle East and North Africa,Somalia,Cereal,Online,H,2/13/2016,287758386,3/2/2016,2956,205.70,117.11,608049.20,346177.16,261872.04
+Asia,Brunei,Fruits,Offline,L,1/3/2010,295840632,1/6/2010,4672,9.33,6.92,43589.76,32330.24,11259.52
+Asia,Taiwan,Beverages,Online,H,7/30/2016,972289884,8/11/2016,1038,47.45,31.79,49253.10,32998.02,16255.08
+Middle East and North Africa,Afghanistan,Vegetables,Online,C,12/6/2014,317154967,12/9/2014,2058,154.06,90.93,317055.48,187133.94,129921.54
+Central America and the Caribbean,Guatemala,Meat,Offline,H,7/12/2015,450797212,8/30/2015,9767,421.89,364.69,4120599.63,3561927.23,558672.40
+Europe,Latvia,Household,Offline,C,12/18/2010,863890445,12/25/2010,3235,668.27,502.54,2161853.45,1625716.90,536136.55
+Europe,Armenia,Personal Care,Online,C,1/16/2010,667420995,1/18/2010,3559,81.73,56.67,290877.07,201688.53,89188.54
+Europe,Montenegro,Vegetables,Offline,H,4/10/2011,842687690,5/26/2011,8869,154.06,90.93,1366358.14,806458.17,559899.97
+Australia and Oceania,East Timor,Personal Care,Offline,H,3/25/2014,191301858,4/6/2014,9326,81.73,56.67,762213.98,528504.42,233709.56
+Middle East and North Africa,Lebanon,Cereal,Online,L,10/8/2015,285187327,10/22/2015,2123,205.70,117.11,436701.10,248624.53,188076.57
+Central America and the Caribbean,Grenada,Meat,Offline,M,10/20/2013,516580426,11/18/2013,6483,421.89,364.69,2735112.87,2364285.27,370827.60
+Sub-Saharan Africa,Seychelles ,Meat,Offline,L,2/9/2011,348029983,3/2/2011,8661,421.89,364.69,3653989.29,3158580.09,495409.20
+Central America and the Caribbean,Grenada,Office Supplies,Offline,L,7/7/2011,662397325,7/23/2011,6943,651.21,524.96,4521351.03,3644797.28,876553.75
+Sub-Saharan Africa,Nigeria,Snacks,Offline,L,2/19/2016,612856280,3/24/2016,6647,152.58,97.44,1014199.26,647683.68,366515.58
+Europe,San Marino,Beverages,Offline,L,1/2/2012,772893178,1/2/2012,5122,47.45,31.79,243038.90,162828.38,80210.52
+Sub-Saharan Africa,Mauritius ,Baby Food,Online,H,9/21/2013,886306846,10/27/2013,6746,255.28,159.42,1722118.88,1075447.32,646671.56
+Asia,Indonesia,Vegetables,Online,C,3/29/2014,317208611,4/17/2014,7932,154.06,90.93,1222003.92,721256.76,500747.16
+Sub-Saharan Africa,Republic of the Congo,Baby Food,Offline,L,5/11/2011,300022304,6/2/2011,2122,255.28,159.42,541704.16,338289.24,203414.92
+Europe,Czech Republic,Snacks,Online,M,7/5/2011,789484250,7/30/2011,4789,152.58,97.44,730705.62,466640.16,264065.46
+Sub-Saharan Africa,Republic of the Congo,Cereal,Offline,M,11/3/2010,910643279,12/22/2010,8438,205.70,117.11,1735696.60,988174.18,747522.42
+Central America and the Caribbean,Saint Kitts and Nevis ,Meat,Offline,L,2/17/2014,308860719,3/18/2014,7605,421.89,364.69,3208473.45,2773467.45,435006.00
+Middle East and North Africa,Somalia,Snacks,Online,M,11/14/2015,499810397,12/21/2015,3858,152.58,97.44,588653.64,375923.52,212730.12
+North America,Greenland,Clothes,Online,C,8/10/2011,819478642,8/18/2011,796,109.28,35.84,86986.88,28528.64,58458.24
+Australia and Oceania,Palau,Baby Food,Offline,L,11/22/2016,674164283,12/10/2016,9048,255.28,159.42,2309773.44,1442432.16,867341.28
+Sub-Saharan Africa,Mauritius ,Cereal,Offline,L,6/22/2010,890478646,6/24/2010,1275,205.70,117.11,262267.50,149315.25,112952.25
+Sub-Saharan Africa,Mauritania,Meat,Online,M,10/26/2013,565345561,12/2/2013,7170,421.89,364.69,3024951.30,2614827.30,410124.00
+North America,Canada,Household,Online,H,8/4/2011,216001355,8/15/2011,8456,668.27,502.54,5650891.12,4249478.24,1401412.88
+Australia and Oceania,Palau,Beverages,Online,M,1/10/2016,429994857,1/11/2016,3888,47.45,31.79,184485.60,123599.52,60886.08
+Australia and Oceania,Solomon Islands,Office Supplies,Online,C,2/17/2010,515187394,4/6/2010,4253,651.21,524.96,2769596.13,2232654.88,536941.25
+Sub-Saharan Africa,Nigeria,Office Supplies,Online,L,1/24/2012,749752795,2/23/2012,7368,651.21,524.96,4798115.28,3867905.28,930210.00
+Sub-Saharan Africa,Comoros,Beverages,Offline,M,9/29/2010,132177388,11/7/2010,3081,47.45,31.79,146193.45,97944.99,48248.46
+Asia,Thailand,Baby Food,Online,L,2/6/2015,431260001,2/11/2015,8273,255.28,159.42,2111931.44,1318881.66,793049.78
+Europe,Vatican City,Personal Care,Offline,M,5/24/2012,336111962,6/16/2012,1854,81.73,56.67,151527.42,105066.18,46461.24
+Sub-Saharan Africa,Equatorial Guinea,Personal Care,Online,M,6/20/2017,406157100,7/13/2017,9766,81.73,56.67,798175.18,553439.22,244735.96
+Europe,San Marino,Household,Offline,H,12/9/2015,821131742,12/9/2015,9985,668.27,502.54,6672675.95,5017861.90,1654814.05
+Sub-Saharan Africa,Sao Tome and Principe,Personal Care,Online,M,5/28/2013,931084716,7/7/2013,7513,81.73,56.67,614037.49,425761.71,188275.78
+Sub-Saharan Africa,Seychelles ,Baby Food,Offline,H,7/20/2016,606377351,8/25/2016,9388,255.28,159.42,2396568.64,1496634.96,899933.68
+Sub-Saharan Africa,Togo,Vegetables,Online,L,3/7/2014,687683475,4/1/2014,9677,154.06,90.93,1490838.62,879929.61,610909.01
+Middle East and North Africa,Somalia,Cosmetics,Offline,C,4/23/2011,735989415,4/27/2011,4478,437.20,263.33,1957781.60,1179191.74,778589.86
+Central America and the Caribbean,Antigua and Barbuda ,Snacks,Offline,M,3/27/2010,382594001,4/7/2010,6922,152.58,97.44,1056158.76,674479.68,381679.08
+Europe,Liechtenstein,Household,Online,M,4/27/2014,679108560,6/11/2014,2169,668.27,502.54,1449477.63,1090009.26,359468.37
+Sub-Saharan Africa,Equatorial Guinea,Beverages,Online,M,8/18/2016,947456920,9/30/2016,2412,47.45,31.79,114449.40,76677.48,37771.92
+Europe,Lithuania,Personal Care,Offline,L,4/19/2011,129875409,4/26/2011,1875,81.73,56.67,153243.75,106256.25,46987.50
+Central America and the Caribbean,Panama,Baby Food,Offline,H,6/14/2012,838912856,7/11/2012,1811,255.28,159.42,462312.08,288709.62,173602.46
+North America,United States of America,Beverages,Offline,C,7/25/2012,807430589,7/30/2012,5509,47.45,31.79,261402.05,175131.11,86270.94
+Sub-Saharan Africa,Angola,Office Supplies,Online,L,7/16/2016,538602435,8/19/2016,3284,651.21,524.96,2138573.64,1723968.64,414605.00
+Europe,Ireland,Fruits,Offline,H,3/12/2015,155914723,3/29/2015,7486,9.33,6.92,69844.38,51803.12,18041.26
+Europe,Spain,Fruits,Online,H,10/9/2011,753166282,11/25/2011,7495,9.33,6.92,69928.35,51865.40,18062.95
+Sub-Saharan Africa,Chad,Baby Food,Online,C,7/30/2010,344468438,8/27/2010,4721,255.28,159.42,1205176.88,752621.82,452555.06
+Asia,Malaysia,Cosmetics,Offline,L,3/13/2013,614245021,3/20/2013,7606,437.20,263.33,3325343.20,2002887.98,1322455.22
+Central America and the Caribbean,Belize,Fruits,Online,L,9/18/2014,167232358,10/30/2014,6626,9.33,6.92,61820.58,45851.92,15968.66
+Central America and the Caribbean,Antigua and Barbuda ,Snacks,Online,C,1/20/2015,378479278,2/15/2015,9284,152.58,97.44,1416552.72,904632.96,511919.76
+Europe,Andorra,Cereal,Offline,M,3/20/2015,443347108,4/9/2015,5116,205.70,117.11,1052361.20,599134.76,453226.44
+Europe,Iceland,Office Supplies,Online,C,6/19/2013,527509677,7/10/2013,691,651.21,524.96,449986.11,362747.36,87238.75
+Europe,Ireland,Beverages,Offline,H,9/20/2016,416953313,10/29/2016,4606,47.45,31.79,218554.70,146424.74,72129.96
+Middle East and North Africa,Libya,Beverages,Online,M,1/8/2014,867976844,2/1/2014,2491,47.45,31.79,118197.95,79188.89,39009.06
+Sub-Saharan Africa,Burkina Faso,Vegetables,Offline,M,8/16/2010,457191598,9/23/2010,2008,154.06,90.93,309352.48,182587.44,126765.04
+Australia and Oceania,Solomon Islands,Fruits,Offline,H,8/19/2016,531521403,9/19/2016,7850,9.33,6.92,73240.50,54322.00,18918.50
+Middle East and North Africa,Oman,Office Supplies,Online,L,12/6/2012,258202588,12/23/2012,6738,651.21,524.96,4387852.98,3537180.48,850672.50
+Sub-Saharan Africa,Sierra Leone,Snacks,Online,M,7/15/2015,674783980,9/2/2015,2430,152.58,97.44,370769.40,236779.20,133990.20
+Europe,Bosnia and Herzegovina,Cereal,Online,C,3/30/2011,639126908,5/10/2011,710,205.70,117.11,146047.00,83148.10,62898.90
+Europe,Belarus,Beverages,Online,L,6/3/2014,879405200,7/20/2014,4396,47.45,31.79,208590.20,139748.84,68841.36
+Europe,Slovenia,Beverages,Offline,H,3/17/2010,844105184,4/20/2010,8337,47.45,31.79,395590.65,265033.23,130557.42
+Australia and Oceania,Kiribati,Household,Offline,C,4/24/2011,952025687,5/1/2011,4412,668.27,502.54,2948407.24,2217206.48,731200.76
+Central America and the Caribbean,Costa Rica,Office Supplies,Online,C,5/11/2016,342278039,6/16/2016,6533,651.21,524.96,4254354.93,3429563.68,824791.25
+Sub-Saharan Africa,Democratic Republic of the Congo,Clothes,Online,H,9/9/2013,924286067,10/4/2013,5642,109.28,35.84,616557.76,202209.28,414348.48
+Central America and the Caribbean,Grenada,Clothes,Offline,L,6/1/2015,627786099,7/18/2015,4712,109.28,35.84,514927.36,168878.08,346049.28
+Sub-Saharan Africa,Mozambique,Household,Online,M,10/15/2015,152826964,10/22/2015,3750,668.27,502.54,2506012.50,1884525.00,621487.50
+Sub-Saharan Africa,Sudan,Household,Online,M,2/13/2010,719769990,3/15/2010,4790,668.27,502.54,3201013.30,2407166.60,793846.70
+Sub-Saharan Africa,Benin,Snacks,Online,H,9/23/2013,919289004,10/17/2013,6900,152.58,97.44,1052802.00,672336.00,380466.00
+Australia and Oceania,Palau,Baby Food,Online,M,9/10/2012,762370336,9/23/2012,1179,255.28,159.42,300975.12,187956.18,113018.94
+Australia and Oceania,Fiji,Cosmetics,Online,M,2/7/2013,330312812,2/14/2013,5756,437.20,263.33,2516523.20,1515727.48,1000795.72
+Central America and the Caribbean,Saint Lucia,Cereal,Online,L,7/13/2014,224727761,8/15/2014,793,205.70,117.11,163120.10,92868.23,70251.87
+North America,Mexico,Meat,Online,H,10/29/2013,217539012,10/31/2013,3483,421.89,364.69,1469442.87,1270215.27,199227.60
+Australia and Oceania,Samoa ,Baby Food,Online,H,6/26/2016,600982892,8/7/2016,3048,255.28,159.42,778093.44,485912.16,292181.28
+Sub-Saharan Africa,Botswana,Vegetables,Online,M,2/16/2010,837608230,3/3/2010,5744,154.06,90.93,884920.64,522301.92,362618.72
+Middle East and North Africa,Turkey,Clothes,Offline,L,9/26/2013,910276353,9/27/2013,9856,109.28,35.84,1077063.68,353239.04,723824.64
+Sub-Saharan Africa,Ethiopia,Snacks,Offline,L,4/11/2013,872161090,4/28/2013,703,152.58,97.44,107263.74,68500.32,38763.42
+Asia,Kazakhstan,Beverages,Offline,H,12/6/2010,396748769,1/15/2011,5632,47.45,31.79,267238.40,179041.28,88197.12
+Europe,Netherlands,Fruits,Offline,C,9/20/2013,127838218,10/29/2013,9024,9.33,6.92,84193.92,62446.08,21747.84
+Asia,Uzbekistan,Beverages,Online,H,8/8/2014,329540765,9/21/2014,7290,47.45,31.79,345910.50,231749.10,114161.40
+Sub-Saharan Africa,Cameroon,Fruits,Offline,H,5/15/2011,436280238,6/10/2011,3872,9.33,6.92,36125.76,26794.24,9331.52
+Central America and the Caribbean,Cuba,Baby Food,Offline,H,6/19/2010,402792966,7/4/2010,4244,255.28,159.42,1083408.32,676578.48,406829.84
+Sub-Saharan Africa,Angola,Vegetables,Online,M,8/8/2015,254127776,9/12/2015,911,154.06,90.93,140348.66,82837.23,57511.43
+Sub-Saharan Africa,Burkina Faso,Beverages,Online,M,5/31/2016,535645997,6/18/2016,8409,47.45,31.79,399007.05,267322.11,131684.94
+Sub-Saharan Africa,Kenya,Clothes,Offline,M,12/19/2014,963021457,1/25/2015,8304,109.28,35.84,907461.12,297615.36,609845.76
+Australia and Oceania,Tonga,Office Supplies,Online,L,5/18/2014,872240483,6/13/2014,4197,651.21,524.96,2733128.37,2203257.12,529871.25
+Sub-Saharan Africa,Democratic Republic of the Congo,Household,Offline,C,1/21/2015,569601905,2/2/2015,6716,668.27,502.54,4488101.32,3375058.64,1113042.68
+Europe,Belgium,Snacks,Online,M,11/22/2010,881717050,12/23/2010,8524,152.58,97.44,1300591.92,830578.56,470013.36
+Europe,Macedonia,Household,Offline,L,10/13/2015,905509746,10/20/2015,9311,668.27,502.54,6222261.97,4679149.94,1543112.03
+Sub-Saharan Africa,Botswana,Office Supplies,Online,H,5/23/2014,258216321,6/23/2014,802,651.21,524.96,522270.42,421017.92,101252.50
+Asia,Japan,Meat,Offline,H,5/18/2011,427385604,6/15/2011,1752,421.89,364.69,739151.28,638936.88,100214.40
+Europe,Liechtenstein,Baby Food,Online,H,6/22/2012,720878922,8/1/2012,2948,255.28,159.42,752565.44,469970.16,282595.28
+Asia,Brunei,Fruits,Offline,L,2/9/2013,516870105,3/27/2013,2205,9.33,6.92,20572.65,15258.60,5314.05
+Asia,Japan,Fruits,Offline,H,5/12/2017,613845479,6/17/2017,9373,9.33,6.92,87450.09,64861.16,22588.93
+Asia,Cambodia,Cereal,Offline,H,6/6/2011,980603873,7/17/2011,1332,205.70,117.11,273992.40,155990.52,118001.88
+Europe,Italy,Personal Care,Offline,L,11/14/2012,306256616,11/18/2012,6993,81.73,56.67,571537.89,396293.31,175244.58
+Australia and Oceania,Samoa ,Household,Offline,L,10/24/2013,950227534,11/2/2013,2298,668.27,502.54,1535684.46,1154836.92,380847.54
+Europe,Spain,Cereal,Offline,M,1/4/2015,392252957,2/22/2015,5222,205.70,117.11,1074165.40,611548.42,462616.98
+Asia,Kyrgyzstan,Personal Care,Online,M,7/1/2014,682381713,7/8/2014,768,81.73,56.67,62768.64,43522.56,19246.08
+Sub-Saharan Africa,Benin,Clothes,Online,H,5/19/2011,790975129,6/20/2011,5973,109.28,35.84,652729.44,214072.32,438657.12
+Sub-Saharan Africa,Chad,Cosmetics,Offline,L,3/7/2017,658707034,3/13/2017,4904,437.20,263.33,2144028.80,1291370.32,852658.48
+Europe,Norway,Cosmetics,Offline,C,3/14/2014,746563756,4/12/2014,3661,437.20,263.33,1600589.20,964051.13,636538.07
+Central America and the Caribbean,Cuba,Fruits,Offline,M,4/21/2012,685844123,5/28/2012,5372,9.33,6.92,50120.76,37174.24,12946.52
+Central America and the Caribbean,Saint Vincent and the Grenadines,Clothes,Offline,M,11/10/2014,628159463,12/9/2014,5199,109.28,35.84,568146.72,186332.16,381814.56
+Central America and the Caribbean,Haiti,Snacks,Online,L,12/5/2014,795433604,1/19/2015,5335,152.58,97.44,814014.30,519842.40,294171.90
+Europe,Bulgaria,Household,Online,C,3/21/2014,129902875,4/24/2014,2,668.27,502.54,1336.54,1005.08,331.46
+Australia and Oceania,Samoa ,Office Supplies,Offline,M,9/17/2011,344116103,10/23/2011,457,651.21,524.96,297602.97,239906.72,57696.25
+Sub-Saharan Africa,Equatorial Guinea,Snacks,Online,M,1/10/2015,970934617,1/15/2015,9984,152.58,97.44,1523358.72,972840.96,550517.76
+Asia,Philippines,Cereal,Online,L,12/2/2013,713532245,1/3/2014,8902,205.70,117.11,1831141.40,1042513.22,788628.18
+Europe,San Marino,Beverages,Offline,M,5/10/2014,595395314,5/30/2014,9559,47.45,31.79,453574.55,303880.61,149693.94
+Central America and the Caribbean,Trinidad and Tobago,Cereal,Offline,L,1/2/2012,810322654,1/15/2012,1335,205.70,117.11,274609.50,156341.85,118267.65
+Europe,Denmark,Fruits,Online,L,3/4/2011,272425591,3/21/2011,5641,9.33,6.92,52630.53,39035.72,13594.81
+Central America and the Caribbean,Costa Rica,Cereal,Offline,L,6/12/2013,666127955,7/8/2013,920,205.70,117.11,189244.00,107741.20,81502.80
+Europe,Germany,Baby Food,Offline,H,11/27/2013,596166074,1/13/2014,7644,255.28,159.42,1951360.32,1218606.48,732753.84
+Asia,India,Personal Care,Offline,C,6/23/2012,537588775,7/19/2012,3320,81.73,56.67,271343.60,188144.40,83199.20
+Sub-Saharan Africa,Sao Tome and Principe,Cereal,Offline,L,2/28/2010,585757386,3/23/2010,7482,205.70,117.11,1539047.40,876217.02,662830.38
+Europe,Netherlands,Beverages,Offline,C,10/18/2012,906345736,11/21/2012,6699,47.45,31.79,317867.55,212961.21,104906.34
+Europe,Germany,Cosmetics,Offline,M,2/26/2012,385340154,3/18/2012,9569,437.20,263.33,4183566.80,2519804.77,1663762.03
+Europe,Sweden,Cosmetics,Offline,H,6/3/2012,679039466,7/5/2012,1723,437.20,263.33,753295.60,453717.59,299578.01
+Sub-Saharan Africa,Cameroon,Household,Offline,L,4/13/2011,364055001,5/13/2011,820,668.27,502.54,547981.40,412082.80,135898.60
+Asia,Tajikistan,Baby Food,Online,H,4/6/2011,787310588,4/21/2011,1554,255.28,159.42,396705.12,247738.68,148966.44
+Sub-Saharan Africa,Swaziland,Clothes,Online,H,12/20/2015,216042554,12/20/2015,647,109.28,35.84,70704.16,23188.48,47515.68
+Europe,San Marino,Baby Food,Offline,L,2/15/2011,587799727,3/27/2011,1856,255.28,159.42,473799.68,295883.52,177916.16
+Middle East and North Africa,United Arab Emirates,Fruits,Online,L,10/27/2013,760443437,12/13/2013,966,9.33,6.92,9012.78,6684.72,2328.06
+Asia,Bangladesh,Office Supplies,Offline,M,9/15/2015,562147510,10/11/2015,795,651.21,524.96,517711.95,417343.20,100368.75
+Europe,Georgia,Snacks,Offline,L,1/22/2017,341398274,3/7/2017,6191,152.58,97.44,944622.78,603251.04,341371.74
+Europe,Greece,Fruits,Offline,H,6/14/2015,516994559,6/20/2015,9034,9.33,6.92,84287.22,62515.28,21771.94
+Australia and Oceania,Papua New Guinea,Beverages,Offline,C,1/27/2017,228047692,2/27/2017,3235,47.45,31.79,153500.75,102840.65,50660.10
+Europe,Slovenia,Office Supplies,Online,H,4/9/2010,483981502,5/4/2010,9736,651.21,524.96,6340180.56,5111010.56,1229170.00
+Middle East and North Africa,Azerbaijan,Clothes,Offline,M,9/22/2014,114532315,9/30/2014,1512,109.28,35.84,165231.36,54190.08,111041.28
+Central America and the Caribbean,Barbados,Fruits,Offline,H,2/11/2017,719748961,3/23/2017,8567,9.33,6.92,79930.11,59283.64,20646.47
+Middle East and North Africa,Oman,Cereal,Online,H,10/3/2012,819992768,11/13/2012,2937,205.70,117.11,604140.90,343952.07,260188.83
+Asia,Bhutan,Cosmetics,Offline,C,12/18/2016,805937564,1/7/2017,3690,437.20,263.33,1613268.00,971687.70,641580.30
+Sub-Saharan Africa,Chad,Personal Care,Online,C,10/27/2015,688569676,10/29/2015,1924,81.73,56.67,157248.52,109033.08,48215.44
+Europe,Slovakia,Cosmetics,Online,H,5/30/2015,549187934,7/17/2015,5769,437.20,263.33,2522206.80,1519150.77,1003056.03
+Europe,Macedonia,Clothes,Online,M,4/22/2015,989403665,5/25/2015,5386,109.28,35.84,588582.08,193034.24,395547.84
+Australia and Oceania,Federated States of Micronesia,Baby Food,Online,C,5/11/2012,881140697,5/29/2012,7968,255.28,159.42,2034071.04,1270258.56,763812.48
+Europe,Lithuania,Household,Online,H,1/25/2012,516635358,2/26/2012,2738,668.27,502.54,1829723.26,1375954.52,453768.74
+North America,United States of America,Fruits,Online,M,3/12/2017,258436477,4/20/2017,5951,9.33,6.92,55522.83,41180.92,14341.91
+Australia and Oceania,Samoa ,Fruits,Offline,C,6/7/2016,989405381,6/22/2016,5894,9.33,6.92,54991.02,40786.48,14204.54
+Sub-Saharan Africa,Republic of the Congo,Cosmetics,Offline,M,11/23/2010,962715899,12/21/2010,7883,437.20,263.33,3446447.60,2075830.39,1370617.21
+Sub-Saharan Africa,Botswana,Cosmetics,Offline,C,4/30/2010,751854360,5/7/2010,9268,437.20,263.33,4051969.60,2440542.44,1611427.16
+Asia,Uzbekistan,Household,Online,H,3/11/2014,100619590,3/31/2014,4427,668.27,502.54,2958431.29,2224744.58,733686.71
+Europe,Belarus,Clothes,Offline,M,6/8/2015,173122918,7/25/2015,9773,109.28,35.84,1067993.44,350264.32,717729.12
+Sub-Saharan Africa,Cote d'Ivoire,Household,Offline,C,11/9/2011,403788173,11/16/2011,8748,668.27,502.54,5846025.96,4396219.92,1449806.04
+Sub-Saharan Africa,Togo,Fruits,Online,M,6/19/2017,747351682,7/24/2017,6825,9.33,6.92,63677.25,47229.00,16448.25
+Sub-Saharan Africa,Benin,Household,Online,H,4/5/2013,328862273,5/24/2013,6510,668.27,502.54,4350437.70,3271535.40,1078902.30
+Sub-Saharan Africa,Kenya,Personal Care,Online,M,8/7/2011,593681275,9/11/2011,2337,81.73,56.67,191003.01,132437.79,58565.22
+Europe,Ireland,Beverages,Online,C,7/14/2014,357482516,7/28/2014,5875,47.45,31.79,278768.75,186766.25,92002.50
+Europe,Slovenia,Fruits,Online,L,1/18/2010,756252324,2/9/2010,723,9.33,6.92,6745.59,5003.16,1742.43
+North America,United States of America,Office Supplies,Online,M,9/10/2013,296289527,10/14/2013,7510,651.21,524.96,4890587.10,3942449.60,948137.50
+Sub-Saharan Africa,Rwanda,Snacks,Online,M,10/14/2011,704205453,11/20/2011,8897,152.58,97.44,1357504.26,866923.68,490580.58
+Asia,Myanmar,Cereal,Offline,M,8/25/2010,176923930,8/30/2010,4577,205.70,117.11,941488.90,536012.47,405476.43
+Sub-Saharan Africa,South Africa,Vegetables,Online,M,2/2/2010,131681287,3/2/2010,6274,154.06,90.93,966572.44,570494.82,396077.62
+Middle East and North Africa,Iraq,Fruits,Online,C,10/11/2014,256026351,11/13/2014,2742,9.33,6.92,25582.86,18974.64,6608.22
+Sub-Saharan Africa,Sudan,Snacks,Offline,L,4/16/2015,757820451,4/26/2015,4767,152.58,97.44,727348.86,464496.48,262852.38
+Middle East and North Africa,Tunisia ,Vegetables,Offline,H,8/19/2014,115237414,9/27/2014,167,154.06,90.93,25728.02,15185.31,10542.71
+Europe,Monaco,Clothes,Offline,H,11/16/2016,926763570,11/25/2016,8790,109.28,35.84,960571.20,315033.60,645537.60
+Australia and Oceania,Samoa ,Fruits,Online,H,10/21/2015,461197745,10/24/2015,7517,9.33,6.92,70133.61,52017.64,18115.97
+Europe,Croatia,Household,Online,M,10/28/2013,107651269,11/11/2013,5258,668.27,502.54,3513763.66,2642355.32,871408.34
+Europe,Andorra,Beverages,Online,H,8/19/2010,425547969,9/11/2010,7955,47.45,31.79,377464.75,252889.45,124575.30
+Central America and the Caribbean,Cuba,Household,Offline,C,7/22/2014,694624173,8/16/2014,3584,668.27,502.54,2395079.68,1801103.36,593976.32
+Europe,Estonia,Clothes,Offline,L,1/24/2016,264928710,1/27/2016,7147,109.28,35.84,781024.16,256148.48,524875.68
+North America,Greenland,Household,Online,M,4/3/2014,806822907,4/8/2014,5683,668.27,502.54,3797778.41,2855934.82,941843.59
+Central America and the Caribbean,Costa Rica,Cereal,Offline,C,1/29/2013,460980594,2/13/2013,3257,205.70,117.11,669964.90,381427.27,288537.63
+Sub-Saharan Africa,Cote d'Ivoire,Vegetables,Online,H,7/24/2017,588388097,8/25/2017,5968,154.06,90.93,919430.08,542670.24,376759.84
+Sub-Saharan Africa,Benin,Beverages,Offline,L,11/5/2014,820344245,12/16/2014,6947,47.45,31.79,329635.15,220845.13,108790.02
+Australia and Oceania,New Zealand,Baby Food,Online,L,11/14/2015,408460366,12/27/2015,1354,255.28,159.42,345649.12,215854.68,129794.44
+North America,United States of America,Baby Food,Offline,H,9/12/2013,474660289,10/6/2013,1382,255.28,159.42,352796.96,220318.44,132478.52
+Europe,Andorra,Beverages,Offline,L,1/13/2010,861180341,2/20/2010,1255,47.45,31.79,59549.75,39896.45,19653.30
+Europe,Ireland,Beverages,Offline,M,6/10/2011,580569350,7/3/2011,2227,47.45,31.79,105671.15,70796.33,34874.82
+Australia and Oceania,Tonga,Beverages,Offline,M,5/21/2010,965688645,6/23/2010,7585,47.45,31.79,359908.25,241127.15,118781.10
+Central America and the Caribbean,Grenada,Beverages,Offline,C,10/10/2011,719712054,10/17/2011,7645,47.45,31.79,362755.25,243034.55,119720.70
+Central America and the Caribbean,Panama,Household,Online,L,12/28/2013,866125905,12/29/2013,4757,668.27,502.54,3178960.39,2390582.78,788377.61
+Sub-Saharan Africa,South Sudan,Cereal,Offline,M,9/17/2012,698729026,9/25/2012,8301,205.70,117.11,1707515.70,972130.11,735385.59
+Asia,China,Household,Online,L,3/29/2012,931632745,5/2/2012,9687,668.27,502.54,6473531.49,4868104.98,1605426.51
+Asia,Vietnam,Cereal,Offline,H,3/3/2014,549260890,3/25/2014,7358,205.70,117.11,1513540.60,861695.38,651845.22
+Middle East and North Africa,Libya,Beverages,Online,C,7/27/2013,856349790,8/26/2013,1788,47.45,31.79,84840.60,56840.52,28000.08
+Central America and the Caribbean,Belize,Personal Care,Offline,H,5/17/2010,527948272,5/21/2010,481,81.73,56.67,39312.13,27258.27,12053.86
+Europe,Serbia,Vegetables,Offline,M,2/25/2013,559417665,2/28/2013,2973,154.06,90.93,458020.38,270334.89,187685.49
+Central America and the Caribbean,Cuba,Household,Online,C,8/8/2012,216431796,9/3/2012,5833,668.27,502.54,3898018.91,2931315.82,966703.09
+Europe,Liechtenstein,Household,Online,C,8/21/2015,184976994,9/21/2015,7658,668.27,502.54,5117611.66,3848451.32,1269160.34
+Sub-Saharan Africa,Senegal,Personal Care,Offline,M,4/18/2011,321352088,5/6/2011,4079,81.73,56.67,333376.67,231156.93,102219.74
+Sub-Saharan Africa,Ghana,Fruits,Offline,M,5/29/2012,102168405,5/29/2012,2756,9.33,6.92,25713.48,19071.52,6641.96
+Europe,Cyprus,Beverages,Online,M,12/8/2013,874349772,1/4/2014,8383,47.45,31.79,397773.35,266495.57,131277.78
+Central America and the Caribbean,Jamaica,Vegetables,Online,H,11/27/2011,905132520,12/9/2011,7681,154.06,90.93,1183334.86,698433.33,484901.53
+Middle East and North Africa,Afghanistan,Vegetables,Offline,H,10/5/2014,332065474,10/13/2014,4408,154.06,90.93,679096.48,400819.44,278277.04
+Europe,Andorra,Household,Online,H,11/15/2016,713009965,12/16/2016,4348,668.27,502.54,2905637.96,2185043.92,720594.04
+Sub-Saharan Africa,Ghana,Baby Food,Offline,M,6/18/2017,976139819,7/22/2017,319,255.28,159.42,81434.32,50854.98,30579.34
+Europe,Andorra,Baby Food,Online,M,10/24/2016,569941365,11/26/2016,7170,255.28,159.42,1830357.60,1143041.40,687316.20
+Sub-Saharan Africa,Sao Tome and Principe,Cereal,Online,C,6/27/2012,813213431,7/31/2012,6781,205.70,117.11,1394851.70,794122.91,600728.79
+Europe,Malta,Household,Online,H,9/9/2010,845067346,9/13/2010,3062,668.27,502.54,2046242.74,1538777.48,507465.26
+Europe,Czech Republic,Fruits,Offline,M,11/24/2014,774926936,11/27/2014,6956,9.33,6.92,64899.48,48135.52,16763.96
+Sub-Saharan Africa,Guinea,Beverages,Online,L,7/4/2014,332528531,8/22/2014,1437,47.45,31.79,68185.65,45682.23,22503.42
+Europe,Hungary,Baby Food,Online,H,5/6/2011,217920958,6/25/2011,6509,255.28,159.42,1661617.52,1037664.78,623952.74
+Central America and the Caribbean,Honduras,Personal Care,Offline,H,11/14/2015,751465547,12/12/2015,4209,81.73,56.67,344001.57,238524.03,105477.54
+Europe,Lithuania,Clothes,Online,C,2/6/2013,523836123,3/22/2013,3605,109.28,35.84,393954.40,129203.20,264751.20
+Europe,Ukraine,Vegetables,Online,C,11/6/2011,446019017,11/25/2011,5794,154.06,90.93,892623.64,526848.42,365775.22
+Asia,Sri Lanka,Office Supplies,Offline,H,8/13/2010,599313056,8/29/2010,8906,651.21,524.96,5799676.26,4675293.76,1124382.50
+Middle East and North Africa,United Arab Emirates,Personal Care,Online,M,7/20/2016,685329568,7/29/2016,3104,81.73,56.67,253689.92,175903.68,77786.24
+Europe,Luxembourg,Clothes,Online,H,5/14/2011,475992381,5/26/2011,5578,109.28,35.84,609563.84,199915.52,409648.32
+Sub-Saharan Africa,Zambia,Meat,Offline,M,9/12/2015,263537824,9/13/2015,5553,421.89,364.69,2342755.17,2025123.57,317631.60
+Europe,Serbia,Office Supplies,Offline,C,3/1/2017,410514724,4/10/2017,9284,651.21,524.96,6045833.64,4873728.64,1172105.00
+Sub-Saharan Africa,The Gambia,Beverages,Offline,M,1/12/2012,899784409,1/18/2012,5057,47.45,31.79,239954.65,160762.03,79192.62
+Sub-Saharan Africa,Ethiopia,Personal Care,Online,H,7/22/2016,884520709,8/9/2016,8189,81.73,56.67,669286.97,464070.63,205216.34
+Europe,Germany,Personal Care,Offline,C,3/14/2010,938209950,3/16/2010,6028,81.73,56.67,492668.44,341606.76,151061.68
+Sub-Saharan Africa,Swaziland,Fruits,Online,M,2/19/2015,804650962,3/20/2015,2956,9.33,6.92,27579.48,20455.52,7123.96
+Europe,Ukraine,Clothes,Offline,H,9/27/2016,747955071,10/25/2016,5382,109.28,35.84,588144.96,192890.88,395254.08
+Sub-Saharan Africa,Mozambique,Vegetables,Offline,C,10/24/2012,202546107,11/10/2012,6749,154.06,90.93,1039750.94,613686.57,426064.37
+Europe,Andorra,Clothes,Offline,L,5/14/2017,923160398,6/15/2017,2531,109.28,35.84,276587.68,90711.04,185876.64
+Sub-Saharan Africa,Equatorial Guinea,Fruits,Online,C,5/25/2011,234846770,7/6/2011,5233,9.33,6.92,48823.89,36212.36,12611.53
+Australia and Oceania,Federated States of Micronesia,Office Supplies,Offline,L,10/29/2014,482966554,11/28/2014,9391,651.21,524.96,6115513.11,4929899.36,1185613.75
+Asia,Kazakhstan,Fruits,Online,L,7/30/2014,483193576,8/18/2014,6572,9.33,6.92,61316.76,45478.24,15838.52
+Asia,Laos,Vegetables,Online,C,10/7/2013,471514165,11/23/2013,374,154.06,90.93,57618.44,34007.82,23610.62
+Europe,Monaco,Office Supplies,Online,H,10/20/2012,754227149,11/24/2012,1429,651.21,524.96,930579.09,750167.84,180411.25
+Europe,Norway,Baby Food,Offline,L,2/24/2013,357943856,3/17/2013,2396,255.28,159.42,611650.88,381970.32,229680.56
+Sub-Saharan Africa,Mauritius ,Personal Care,Offline,H,7/23/2013,179588115,8/23/2013,2969,81.73,56.67,242656.37,168253.23,74403.14
+Asia,Uzbekistan,Meat,Offline,H,11/2/2013,736396253,11/5/2013,4870,421.89,364.69,2054604.30,1776040.30,278564.00
+Europe,Ireland,Cosmetics,Online,M,1/28/2011,815917098,2/13/2011,6856,437.20,263.33,2997443.20,1805390.48,1192052.72
+Europe,Monaco,Clothes,Offline,L,1/2/2011,626011979,1/11/2011,9711,109.28,35.84,1061218.08,348042.24,713175.84
+North America,United States of America,Personal Care,Offline,L,8/16/2016,444854724,8/26/2016,1253,81.73,56.67,102407.69,71007.51,31400.18
+Sub-Saharan Africa,Swaziland,Meat,Offline,L,11/13/2016,170931661,11/25/2016,1332,421.89,364.69,561957.48,485767.08,76190.40
+Australia and Oceania,Tuvalu,Household,Online,M,1/29/2013,673041617,3/15/2013,6826,668.27,502.54,4561611.02,3430338.04,1131272.98
+Europe,Bosnia and Herzegovina,Baby Food,Online,M,4/1/2015,640295922,4/3/2015,6647,255.28,159.42,1696846.16,1059664.74,637181.42
+Central America and the Caribbean,Saint Kitts and Nevis ,Vegetables,Offline,H,6/30/2015,632118403,7/15/2015,6737,154.06,90.93,1037902.22,612595.41,425306.81
+Sub-Saharan Africa,Cote d'Ivoire,Office Supplies,Online,L,7/29/2014,828245389,8/27/2014,5071,651.21,524.96,3302285.91,2662072.16,640213.75
+Sub-Saharan Africa,Botswana,Cereal,Offline,M,7/12/2010,578725707,8/9/2010,6652,205.70,117.11,1368316.40,779015.72,589300.68
+Europe,Romania,Snacks,Online,C,1/11/2010,653920686,1/18/2010,8517,152.58,97.44,1299523.86,829896.48,469627.38
+Europe,Sweden,Fruits,Online,M,1/10/2017,994504153,1/13/2017,4734,9.33,6.92,44168.22,32759.28,11408.94
+Asia,Laos,Household,Online,C,10/28/2013,261462438,11/10/2013,1400,668.27,502.54,935578.00,703556.00,232022.00
+Sub-Saharan Africa,Mauritius ,Household,Online,M,4/15/2010,786094367,5/8/2010,1647,668.27,502.54,1100640.69,827683.38,272957.31
+Europe,Czech Republic,Meat,Offline,M,5/9/2017,920011270,6/12/2017,634,421.89,364.69,267478.26,231213.46,36264.80
+North America,Mexico,Vegetables,Offline,C,12/9/2012,885136973,1/11/2013,555,154.06,90.93,85503.30,50466.15,35037.15
+Europe,Bosnia and Herzegovina,Vegetables,Online,M,11/25/2013,523707807,12/16/2013,5633,154.06,90.93,867819.98,512208.69,355611.29
+Sub-Saharan Africa,Sao Tome and Principe,Household,Offline,M,8/24/2011,648272597,10/2/2011,7122,668.27,502.54,4759418.94,3579089.88,1180329.06
+Europe,Belgium,Fruits,Online,L,10/17/2013,791692674,11/24/2013,8310,9.33,6.92,77532.30,57505.20,20027.10
+Middle East and North Africa,Bahrain,Baby Food,Offline,M,2/5/2010,557141864,2/16/2010,9513,255.28,159.42,2428478.64,1516562.46,911916.18
+Sub-Saharan Africa,Senegal,Household,Online,M,2/6/2014,968106496,2/17/2014,3080,668.27,502.54,2058271.60,1547823.20,510448.40
+Middle East and North Africa,Bahrain,Fruits,Offline,M,11/22/2013,418385398,12/24/2013,8392,9.33,6.92,78297.36,58072.64,20224.72
+Sub-Saharan Africa,Kenya,Fruits,Online,C,10/14/2013,522089898,11/11/2013,6858,9.33,6.92,63985.14,47457.36,16527.78
+Sub-Saharan Africa,Guinea-Bissau,Vegetables,Online,L,5/14/2015,263643825,6/29/2015,6921,154.06,90.93,1066249.26,629326.53,436922.73
+Asia,Tajikistan,Baby Food,Offline,C,9/16/2013,947783505,10/27/2013,9056,255.28,159.42,2311815.68,1443707.52,868108.16
+Middle East and North Africa,Egypt,Household,Offline,L,4/26/2016,349557769,5/6/2016,767,668.27,502.54,512563.09,385448.18,127114.91
+Middle East and North Africa,Iran,Clothes,Offline,H,8/14/2016,364327943,8/26/2016,1589,109.28,35.84,173645.92,56949.76,116696.16
+Sub-Saharan Africa,Kenya,Personal Care,Online,M,11/18/2012,257767856,1/3/2013,8092,81.73,56.67,661359.16,458573.64,202785.52
+Europe,Sweden,Vegetables,Online,C,1/7/2012,715863835,1/26/2012,8872,154.06,90.93,1366820.32,806730.96,560089.36
+Europe,Albania,Cosmetics,Offline,C,8/23/2010,694914710,9/25/2010,9560,437.20,263.33,4179632.00,2517434.80,1662197.20
+Sub-Saharan Africa,Togo,Baby Food,Offline,M,1/4/2014,571531808,2/22/2014,7818,255.28,159.42,1995779.04,1246345.56,749433.48
+Central America and the Caribbean,Dominica,Cereal,Online,C,1/31/2017,792638957,2/17/2017,8336,205.70,117.11,1714715.20,976228.96,738486.24
+Europe,Macedonia,Baby Food,Online,M,11/21/2015,525472486,11/23/2015,7840,255.28,159.42,2001395.20,1249852.80,751542.40
+Sub-Saharan Africa,Sudan,Snacks,Offline,H,4/19/2011,807581222,4/25/2011,85,152.58,97.44,12969.30,8282.40,4686.90
+Europe,Georgia,Fruits,Online,L,10/28/2012,496826493,12/11/2012,855,9.33,6.92,7977.15,5916.60,2060.55
+Central America and the Caribbean,El Salvador,Snacks,Online,C,2/14/2012,321382129,3/4/2012,2969,152.58,97.44,453010.02,289299.36,163710.66
+Middle East and North Africa,United Arab Emirates,Fruits,Online,M,1/15/2017,629734456,3/6/2017,1274,9.33,6.92,11886.42,8816.08,3070.34
+Europe,Liechtenstein,Cereal,Online,L,1/1/2010,940682303,2/9/2010,7652,205.70,117.11,1574016.40,896125.72,677890.68
+Australia and Oceania,Marshall Islands,Personal Care,Offline,C,5/8/2012,393336999,5/14/2012,6014,81.73,56.67,491524.22,340813.38,150710.84
+Middle East and North Africa,Pakistan,Fruits,Offline,C,6/4/2012,897122371,6/13/2012,7300,9.33,6.92,68109.00,50516.00,17593.00
+Europe,Norway,Fruits,Offline,C,10/6/2014,381774747,10/23/2014,4486,9.33,6.92,41854.38,31043.12,10811.26
+Middle East and North Africa,Saudi Arabia,Baby Food,Online,M,8/14/2013,447342956,9/21/2013,7576,255.28,159.42,1934001.28,1207765.92,726235.36
+Asia,Maldives,Vegetables,Online,M,11/18/2011,514188325,1/2/2012,8607,154.06,90.93,1325994.42,782634.51,543359.91
+Sub-Saharan Africa,Sierra Leone,Meat,Online,H,4/14/2017,972984683,5/30/2017,6644,421.89,364.69,2803037.16,2423000.36,380036.80
+Europe,Ireland,Vegetables,Online,H,12/2/2015,934718358,12/16/2015,2789,154.06,90.93,429673.34,253603.77,176069.57
+Sub-Saharan Africa,Madagascar,Snacks,Offline,M,11/12/2013,480688178,11/24/2013,5169,152.58,97.44,788686.02,503667.36,285018.66
+Middle East and North Africa,Bahrain,Household,Online,C,9/13/2010,212505471,9/28/2010,3946,668.27,502.54,2636993.42,1983022.84,653970.58
+Australia and Oceania,Marshall Islands,Clothes,Online,M,11/5/2010,802094066,12/10/2010,6313,109.28,35.84,689884.64,226257.92,463626.72
+Europe,Romania,Meat,Offline,C,3/23/2012,741690289,5/10/2012,1494,421.89,364.69,630303.66,544846.86,85456.80
+Europe,Serbia,Clothes,Offline,L,1/12/2010,393842971,1/31/2010,5742,109.28,35.84,627485.76,205793.28,421692.48
+Central America and the Caribbean,Grenada,Snacks,Online,M,9/4/2015,641413438,9/30/2015,7345,152.58,97.44,1120700.10,715696.80,405003.30
+Sub-Saharan Africa,Rwanda,Cosmetics,Offline,M,2/13/2015,637575519,3/21/2015,1619,437.20,263.33,707826.80,426331.27,281495.53
+Asia,Taiwan,Cosmetics,Offline,M,7/18/2010,955815541,8/13/2010,5914,437.20,263.33,2585600.80,1557333.62,1028267.18
+Sub-Saharan Africa,Chad,Cereal,Online,H,7/21/2016,439932334,8/6/2016,4609,205.70,117.11,948071.30,539759.99,408311.31
+Sub-Saharan Africa,Malawi,Baby Food,Offline,H,12/12/2010,254037225,1/18/2011,4115,255.28,159.42,1050477.20,656013.30,394463.90
+Australia and Oceania,Tonga,Cosmetics,Online,M,3/31/2014,732554042,4/5/2014,7875,437.20,263.33,3442950.00,2073723.75,1369226.25
+Sub-Saharan Africa,Democratic Republic of the Congo,Office Supplies,Online,M,3/3/2010,930219113,3/10/2010,1362,651.21,524.96,886948.02,714995.52,171952.50
+Sub-Saharan Africa,Sierra Leone,Beverages,Online,H,1/1/2010,872081267,1/12/2010,7081,47.45,31.79,335993.45,225104.99,110888.46
+Middle East and North Africa,Iran,Office Supplies,Offline,H,12/16/2010,203501832,12/18/2010,9569,651.21,524.96,6231428.49,5023342.24,1208086.25
+Sub-Saharan Africa,Guinea-Bissau,Clothes,Online,L,2/3/2015,440154635,2/6/2015,393,109.28,35.84,42947.04,14085.12,28861.92
+Sub-Saharan Africa,Chad,Personal Care,Online,M,5/21/2010,918026006,7/9/2010,3151,81.73,56.67,257531.23,178567.17,78964.06
+Europe,Ireland,Household,Offline,H,5/21/2012,143414771,6/3/2012,8473,668.27,502.54,5662251.71,4258021.42,1404230.29
+Asia,Taiwan,Vegetables,Offline,M,12/28/2014,742932260,1/30/2015,9020,154.06,90.93,1389621.20,820188.60,569432.60
+Central America and the Caribbean,Haiti,Vegetables,Offline,L,12/10/2016,913502299,1/14/2017,4485,154.06,90.93,690959.10,407821.05,283138.05
+Europe,Portugal,Snacks,Offline,C,6/26/2010,272361218,7/3/2010,6592,152.58,97.44,1005807.36,642324.48,363482.88
+Central America and the Caribbean,Saint Lucia,Vegetables,Offline,C,6/4/2015,307057845,7/2/2015,4095,154.06,90.93,630875.70,372358.35,258517.35
+Asia,Japan,Beverages,Online,C,10/7/2014,325453507,11/12/2014,7780,47.45,31.79,369161.00,247326.20,121834.80
+Sub-Saharan Africa,Zambia,Baby Food,Online,L,7/10/2011,605722033,7/20/2011,5465,255.28,159.42,1395105.20,871230.30,523874.90
+Europe,Lithuania,Vegetables,Online,M,5/1/2017,146349751,6/13/2017,6999,154.06,90.93,1078265.94,636419.07,441846.87
+Asia,Malaysia,Fruits,Online,C,10/30/2010,716135489,11/13/2010,9260,9.33,6.92,86395.80,64079.20,22316.60
+Europe,Georgia,Meat,Offline,C,2/22/2017,104190576,3/12/2017,1162,421.89,364.69,490236.18,423769.78,66466.40
+Asia,Laos,Baby Food,Offline,M,4/4/2013,669938838,5/10/2013,8645,255.28,159.42,2206895.60,1378185.90,828709.70
+Australia and Oceania,Kiribati,Office Supplies,Offline,L,1/26/2015,793116605,2/7/2015,9683,651.21,524.96,6305666.43,5083187.68,1222478.75
+Asia,Laos,Household,Offline,M,1/15/2013,723772704,2/15/2013,9282,668.27,502.54,6202882.14,4664576.28,1538305.86
+Europe,Poland,Cereal,Online,C,11/6/2013,332268464,12/14/2013,4477,205.70,117.11,920918.90,524301.47,396617.43
+Europe,Spain,Meat,Online,M,11/15/2013,459277713,12/4/2013,9336,421.89,364.69,3938765.04,3404745.84,534019.20
+Europe,Romania,Fruits,Offline,L,7/24/2010,665786778,8/15/2010,9958,9.33,6.92,92908.14,68909.36,23998.78
+Asia,Indonesia,Household,Online,M,10/10/2013,583094489,11/13/2013,9472,668.27,502.54,6329853.44,4760058.88,1569794.56
+Sub-Saharan Africa,Ghana,Cereal,Offline,M,9/27/2011,362812173,9/30/2011,3039,205.70,117.11,625122.30,355897.29,269225.01
+Central America and the Caribbean,Grenada,Snacks,Online,C,8/28/2012,226863658,9/16/2012,2853,152.58,97.44,435310.74,277996.32,157314.42
+Europe,Latvia,Baby Food,Online,L,9/1/2010,917485272,10/3/2010,3136,255.28,159.42,800558.08,499941.12,300616.96
+Europe,Ireland,Personal Care,Offline,L,4/28/2012,547225844,5/30/2012,5143,81.73,56.67,420337.39,291453.81,128883.58
+Sub-Saharan Africa,Botswana,Household,Offline,M,2/6/2010,448946702,2/28/2010,2161,668.27,502.54,1444131.47,1085988.94,358142.53
+Sub-Saharan Africa,Liberia,Cosmetics,Online,H,6/21/2016,225821673,8/3/2016,4506,437.20,263.33,1970023.20,1186564.98,783458.22
+Asia,Uzbekistan,Beverages,Online,L,9/6/2014,901337087,10/25/2014,4529,47.45,31.79,214901.05,143976.91,70924.14
+Europe,Switzerland,Household,Offline,L,7/19/2015,869291770,8/21/2015,1607,668.27,502.54,1073909.89,807581.78,266328.11
+Central America and the Caribbean,El Salvador,Baby Food,Offline,L,10/20/2015,843797051,10/21/2015,7153,255.28,159.42,1826017.84,1140331.26,685686.58
+Europe,Romania,Clothes,Offline,L,1/12/2017,709276759,3/1/2017,9610,109.28,35.84,1050180.80,344422.40,705758.40
+Asia,Nepal,Fruits,Online,M,4/27/2014,870467221,5/28/2014,9449,9.33,6.92,88159.17,65387.08,22772.09
+Sub-Saharan Africa,Niger,Baby Food,Online,M,3/1/2015,902417266,4/15/2015,4178,255.28,159.42,1066559.84,666056.76,400503.08
+Australia and Oceania,Kiribati,Office Supplies,Offline,M,12/26/2012,900488221,2/14/2013,3330,651.21,524.96,2168529.30,1748116.80,420412.50
+Asia,Indonesia,Clothes,Online,H,8/19/2013,130353915,10/1/2013,3475,109.28,35.84,379748.00,124544.00,255204.00
+Sub-Saharan Africa,Botswana,Cosmetics,Offline,H,6/11/2016,178000676,7/16/2016,3210,437.20,263.33,1403412.00,845289.30,558122.70
+Sub-Saharan Africa,Gabon,Beverages,Online,L,6/18/2010,899727332,7/13/2010,8166,47.45,31.79,387476.70,259597.14,127879.56
+Asia,Philippines,Baby Food,Offline,C,2/1/2016,872145211,2/26/2016,6004,255.28,159.42,1532701.12,957157.68,575543.44
+Sub-Saharan Africa,Zambia,Office Supplies,Online,C,2/18/2013,542178142,3/26/2013,1415,651.21,524.96,921462.15,742818.40,178643.75
+Europe,Albania,Beverages,Online,C,10/9/2012,877062451,10/29/2012,1124,47.45,31.79,53333.80,35731.96,17601.84
+Sub-Saharan Africa,Burkina Faso,Personal Care,Offline,M,11/18/2015,214346969,12/20/2015,8886,81.73,56.67,726252.78,503569.62,222683.16
+Europe,Slovenia,Baby Food,Online,L,10/28/2016,111893022,12/2/2016,486,255.28,159.42,124066.08,77478.12,46587.96
+Europe,Slovakia,Beverages,Online,M,10/29/2014,397874438,12/1/2014,8743,47.45,31.79,414855.35,277939.97,136915.38
+Europe,Bulgaria,Clothes,Offline,C,3/2/2010,520777547,4/15/2010,8504,109.28,35.84,929317.12,304783.36,624533.76
+Asia,Brunei,Fruits,Offline,C,7/24/2015,899401175,8/15/2015,1649,9.33,6.92,15385.17,11411.08,3974.09
+Europe,Vatican City,Household,Online,C,6/27/2014,672856652,8/3/2014,2091,668.27,502.54,1397352.57,1050811.14,346541.43
+Middle East and North Africa,Iraq,Meat,Offline,L,6/4/2010,850567805,7/18/2010,770,421.89,364.69,324855.30,280811.30,44044.00
+Middle East and North Africa,Jordan,Snacks,Online,L,6/29/2015,262270963,7/12/2015,661,152.58,97.44,100855.38,64407.84,36447.54
+Middle East and North Africa,Bahrain,Cereal,Offline,H,5/14/2016,508014953,5/18/2016,1769,205.70,117.11,363883.30,207167.59,156715.71
+Central America and the Caribbean,Grenada,Fruits,Offline,C,12/9/2015,108161103,1/17/2016,6129,9.33,6.92,57183.57,42412.68,14770.89
+Europe,Kosovo,Office Supplies,Online,L,5/15/2014,353383243,6/9/2014,2809,651.21,524.96,1829248.89,1474612.64,354636.25
+Europe,Croatia,Office Supplies,Offline,L,11/21/2012,354667699,12/29/2012,2908,651.21,524.96,1893718.68,1526583.68,367135.00
+North America,Greenland,Vegetables,Offline,C,1/7/2010,193313300,2/13/2010,4556,154.06,90.93,701897.36,414277.08,287620.28
+Asia,Thailand,Beverages,Online,M,11/22/2012,470931375,1/10/2013,7914,47.45,31.79,375519.30,251586.06,123933.24
+North America,Canada,Snacks,Offline,M,10/19/2010,959445750,11/23/2010,173,152.58,97.44,26396.34,16857.12,9539.22
+Asia,Nepal,Clothes,Online,C,10/19/2016,151092755,11/11/2016,559,109.28,35.84,61087.52,20034.56,41052.96
+North America,Mexico,Fruits,Online,L,12/12/2010,208421218,1/8/2011,5325,9.33,6.92,49682.25,36849.00,12833.25
+Europe,Switzerland,Snacks,Online,L,3/20/2012,214292466,4/13/2012,2758,152.58,97.44,420815.64,268739.52,152076.12
+Asia,Bangladesh,Baby Food,Online,L,2/26/2014,221880328,3/30/2014,8175,255.28,159.42,2086914.00,1303258.50,783655.50
+Australia and Oceania,East Timor,Beverages,Online,H,5/13/2011,804671132,6/10/2011,8924,47.45,31.79,423443.80,283693.96,139749.84
+Central America and the Caribbean,Cuba,Cereal,Online,H,11/14/2010,806463706,12/16/2010,9387,205.70,117.11,1930905.90,1099311.57,831594.33
+Middle East and North Africa,Algeria,Vegetables,Offline,M,3/14/2013,491369378,4/6/2013,5973,154.06,90.93,920200.38,543124.89,377075.49
+Middle East and North Africa,Morocco,Cosmetics,Online,C,2/25/2016,193811976,3/18/2016,2126,437.20,263.33,929487.20,559839.58,369647.62
+Middle East and North Africa,Qatar,Vegetables,Offline,L,1/6/2011,768527829,1/17/2011,3318,154.06,90.93,511171.08,301705.74,209465.34
+Asia,Kyrgyzstan,Beverages,Online,M,8/27/2016,440565764,9/6/2016,2055,47.45,31.79,97509.75,65328.45,32181.30
+Europe,Portugal,Household,Offline,H,2/18/2015,655287110,2/22/2015,2873,668.27,502.54,1919939.71,1443797.42,476142.29
+Central America and the Caribbean,Barbados,Meat,Online,H,1/30/2016,228365695,2/14/2016,7339,421.89,364.69,3096250.71,2676459.91,419790.80
+Europe,Liechtenstein,Baby Food,Online,H,1/18/2015,295787847,2/16/2015,9052,255.28,159.42,2310794.56,1443069.84,867724.72
+Europe,Kosovo,Baby Food,Offline,L,6/10/2012,263852393,6/29/2012,8641,255.28,159.42,2205874.48,1377548.22,828326.26
+Sub-Saharan Africa,Rwanda,Beverages,Offline,M,4/20/2017,959170663,5/14/2017,8769,47.45,31.79,416089.05,278766.51,137322.54
+Europe,Russia,Fruits,Offline,H,3/24/2013,578666484,4/11/2013,9127,9.33,6.92,85154.91,63158.84,21996.07
+Sub-Saharan Africa,Sao Tome and Principe,Vegetables,Online,H,3/7/2015,539576184,4/16/2015,1438,154.06,90.93,221538.28,130757.34,90780.94
+Australia and Oceania,Samoa ,Household,Offline,L,9/1/2012,529448592,9/18/2012,4459,668.27,502.54,2979815.93,2240825.86,738990.07
+Sub-Saharan Africa,Republic of the Congo,Vegetables,Online,L,6/6/2011,756145036,7/17/2011,8974,154.06,90.93,1382534.44,816005.82,566528.62
+Europe,Denmark,Personal Care,Offline,C,6/18/2014,597839343,7/26/2014,2802,81.73,56.67,229007.46,158789.34,70218.12
+Australia and Oceania,Tonga,Office Supplies,Offline,M,9/11/2010,853017842,9/12/2010,5790,651.21,524.96,3770505.90,3039518.40,730987.50
+Middle East and North Africa,Oman,Baby Food,Offline,L,8/16/2016,590479362,8/28/2016,4820,255.28,159.42,1230449.60,768404.40,462045.20
+Europe,Romania,Cosmetics,Offline,M,12/12/2011,299335229,12/24/2011,8801,437.20,263.33,3847797.20,2317567.33,1530229.87
+Central America and the Caribbean,The Bahamas,Clothes,Online,C,7/1/2011,539009273,8/4/2011,3677,109.28,35.84,401822.56,131783.68,270038.88
+Middle East and North Africa,Libya,Personal Care,Online,H,1/13/2016,589237821,2/4/2016,7420,81.73,56.67,606436.60,420491.40,185945.20
+Europe,Vatican City,Vegetables,Offline,L,1/10/2016,700069701,1/21/2016,5037,154.06,90.93,776000.22,458014.41,317985.81
+Europe,Ukraine,Household,Online,H,7/28/2010,741866242,9/13/2010,3562,668.27,502.54,2380377.74,1790047.48,590330.26
+Central America and the Caribbean,Antigua and Barbuda ,Cereal,Offline,L,3/12/2011,655301272,3/25/2011,7064,205.70,117.11,1453064.80,827265.04,625799.76
+Australia and Oceania,Fiji,Beverages,Online,C,5/5/2015,901361119,5/14/2015,1640,47.45,31.79,77818.00,52135.60,25682.40
+Europe,Bulgaria,Snacks,Offline,L,3/1/2010,211344611,3/23/2010,422,152.58,97.44,64388.76,41119.68,23269.08
+Middle East and North Africa,Turkey,Beverages,Online,L,3/2/2014,536863076,3/2/2014,8569,47.45,31.79,406599.05,272408.51,134190.54
+Sub-Saharan Africa,Cote d'Ivoire,Personal Care,Online,M,11/5/2012,299840342,12/8/2012,8275,81.73,56.67,676315.75,468944.25,207371.50
+Central America and the Caribbean,Antigua and Barbuda ,Clothes,Offline,H,6/24/2015,242512738,7/15/2015,3763,109.28,35.84,411220.64,134865.92,276354.72
+Australia and Oceania,Samoa ,Clothes,Online,M,6/22/2013,277429091,6/25/2013,6288,109.28,35.84,687152.64,225361.92,461790.72
+Asia,Sri Lanka,Vegetables,Offline,H,6/15/2014,837450730,7/19/2014,9136,154.06,90.93,1407492.16,830736.48,576755.68
+Europe,San Marino,Personal Care,Offline,H,9/29/2015,625751483,10/1/2015,2624,81.73,56.67,214459.52,148702.08,65757.44
+Europe,Serbia,Fruits,Online,C,9/26/2015,665817677,10/10/2015,9102,9.33,6.92,84921.66,62985.84,21935.82
+Australia and Oceania,Australia,Fruits,Online,M,2/6/2010,251448142,2/18/2010,7948,9.33,6.92,74154.84,55000.16,19154.68
+Europe,Russia,Baby Food,Offline,L,9/20/2010,996754205,9/22/2010,574,255.28,159.42,146530.72,91507.08,55023.64
+Middle East and North Africa,Pakistan,Vegetables,Offline,H,8/8/2011,986159694,9/6/2011,5423,154.06,90.93,835467.38,493113.39,342353.99
+Asia,Turkmenistan,Household,Offline,H,5/28/2015,624400937,7/16/2015,2968,668.27,502.54,1983425.36,1491538.72,491886.64
+Central America and the Caribbean,The Bahamas,Personal Care,Offline,M,6/24/2014,386526763,7/1/2014,713,81.73,56.67,58273.49,40405.71,17867.78
+Sub-Saharan Africa,Gabon,Cosmetics,Online,H,5/25/2017,367898499,6/9/2017,8196,437.20,263.33,3583291.20,2158252.68,1425038.52
+Europe,Germany,Cereal,Online,H,11/10/2014,734189975,11/29/2014,1984,205.70,117.11,408108.80,232346.24,175762.56
+Sub-Saharan Africa,Togo,Cosmetics,Offline,L,10/9/2013,371387517,11/8/2013,674,437.20,263.33,294672.80,177484.42,117188.38
+Europe,Belarus,Beverages,Online,L,10/3/2010,935789954,11/18/2010,9898,47.45,31.79,469660.10,314657.42,155002.68
+Europe,Germany,Cereal,Online,M,1/23/2011,104008615,2/22/2011,7315,205.70,117.11,1504695.50,856659.65,648035.85
+Europe,Belarus,Beverages,Online,H,3/24/2017,122967326,4/25/2017,7619,47.45,31.79,361521.55,242208.01,119313.54
+Middle East and North Africa,Kuwait,Baby Food,Online,C,2/17/2010,159902417,3/5/2010,7533,255.28,159.42,1923024.24,1200910.86,722113.38
+North America,Greenland,Meat,Offline,C,5/12/2013,352362716,6/16/2013,813,421.89,364.69,342996.57,296492.97,46503.60
+Sub-Saharan Africa,Central African Republic,Beverages,Online,C,9/21/2013,458209550,9/24/2013,3243,47.45,31.79,153880.35,103094.97,50785.38
+Europe,Montenegro,Cereal,Offline,M,6/6/2010,305616748,7/1/2010,7642,205.70,117.11,1571959.40,894954.62,677004.78
+Europe,Malta,Office Supplies,Offline,M,5/5/2011,243070638,5/22/2011,8858,651.21,524.96,5768418.18,4650095.68,1118322.50
+Sub-Saharan Africa,Cameroon,Personal Care,Offline,M,1/7/2014,689370048,2/10/2014,8771,81.73,56.67,716853.83,497052.57,219801.26
+Middle East and North Africa,Egypt,Beverages,Offline,H,2/3/2017,783626306,3/20/2017,1293,47.45,31.79,61352.85,41104.47,20248.38
+Middle East and North Africa,Lebanon,Beverages,Offline,C,6/21/2016,635263240,6/27/2016,7364,47.45,31.79,349421.80,234101.56,115320.24
+Australia and Oceania,Tuvalu,Personal Care,Offline,L,9/11/2016,874017179,10/19/2016,9961,81.73,56.67,814112.53,564489.87,249622.66
+Middle East and North Africa,Azerbaijan,Office Supplies,Online,H,1/7/2012,399936950,2/26/2012,9086,651.21,524.96,5916894.06,4769786.56,1147107.50
+Middle East and North Africa,Jordan,Vegetables,Online,C,11/23/2012,433383882,12/4/2012,6776,154.06,90.93,1043910.56,616141.68,427768.88
+Australia and Oceania,Solomon Islands,Meat,Offline,M,12/4/2011,465031802,1/6/2012,2099,421.89,364.69,885547.11,765484.31,120062.80
+Europe,Bulgaria,Clothes,Offline,L,5/4/2010,505867040,6/12/2010,6153,109.28,35.84,672399.84,220523.52,451876.32
+Europe,France,Cosmetics,Online,C,3/20/2014,637188422,4/29/2014,7069,437.20,263.33,3090566.80,1861479.77,1229087.03
+Middle East and North Africa,Algeria,Vegetables,Online,M,7/24/2015,560607278,8/3/2015,5006,154.06,90.93,771224.36,455195.58,316028.78
+Middle East and North Africa,Israel,Cosmetics,Offline,M,3/24/2011,948047435,4/6/2011,7159,437.20,263.33,3129914.80,1885179.47,1244735.33
+Sub-Saharan Africa,Guinea-Bissau,Cosmetics,Offline,C,4/11/2014,291745221,5/7/2014,2749,437.20,263.33,1201862.80,723894.17,477968.63
+Sub-Saharan Africa,Benin,Baby Food,Online,H,5/2/2012,754249465,5/14/2012,8033,255.28,159.42,2050664.24,1280620.86,770043.38
+Europe,San Marino,Cereal,Online,H,10/22/2016,518421494,10/22/2016,1296,205.70,117.11,266587.20,151774.56,114812.64
+Middle East and North Africa,Pakistan,Baby Food,Online,L,8/31/2013,537435138,9/5/2013,7855,255.28,159.42,2005224.40,1252244.10,752980.30
+Sub-Saharan Africa,Mali,Beverages,Online,H,8/27/2012,484776723,9/4/2012,5060,47.45,31.79,240097.00,160857.40,79239.60
+Europe,United Kingdom,Fruits,Offline,M,3/27/2013,104245078,4/21/2013,7290,9.33,6.92,68015.70,50446.80,17568.90
+Central America and the Caribbean,The Bahamas,Beverages,Offline,H,12/5/2015,559951531,1/13/2016,956,47.45,31.79,45362.20,30391.24,14970.96
+Europe,Spain,Vegetables,Online,C,12/16/2010,386319911,1/2/2011,9501,154.06,90.93,1463724.06,863925.93,599798.13
+Sub-Saharan Africa,Madagascar,Vegetables,Offline,C,5/3/2012,438086545,6/15/2012,8399,154.06,90.93,1293949.94,763721.07,530228.87
+Europe,Cyprus,Baby Food,Online,M,3/17/2016,740300261,4/23/2016,153,255.28,159.42,39057.84,24391.26,14666.58
+Sub-Saharan Africa,Mauritania,Baby Food,Offline,M,3/17/2012,938322389,4/20/2012,9301,255.28,159.42,2374359.28,1482765.42,891593.86
+Europe,Macedonia,Office Supplies,Offline,C,7/17/2017,747826755,7/22/2017,7410,651.21,524.96,4825466.10,3889953.60,935512.50
+Middle East and North Africa,Azerbaijan,Household,Online,M,8/12/2012,404799687,9/18/2012,8078,668.27,502.54,5398285.06,4059518.12,1338766.94
+Europe,Romania,Personal Care,Offline,M,12/21/2012,215540015,12/24/2012,1935,81.73,56.67,158147.55,109656.45,48491.10
+Central America and the Caribbean,Saint Kitts and Nevis ,Personal Care,Offline,L,7/7/2012,106659066,8/19/2012,1643,81.73,56.67,134282.39,93108.81,41173.58
+Europe,Kosovo,Vegetables,Offline,C,7/23/2017,975080668,8/20/2017,6893,154.06,90.93,1061935.58,626780.49,435155.09
+Europe,Bosnia and Herzegovina,Baby Food,Online,L,10/9/2012,638041150,11/28/2012,9410,255.28,159.42,2402184.80,1500142.20,902042.60
+Europe,Greece,Cosmetics,Online,C,5/22/2010,583089339,6/26/2010,7948,437.20,263.33,3474865.60,2092946.84,1381918.76
+Europe,Norway,Snacks,Online,M,2/19/2016,118086564,3/13/2016,3293,152.58,97.44,502445.94,320869.92,181576.02
+Sub-Saharan Africa,Mauritius ,Office Supplies,Online,L,4/21/2010,421206653,6/4/2010,3264,651.21,524.96,2125549.44,1713469.44,412080.00
+Central America and the Caribbean,Nicaragua,Clothes,Offline,C,2/8/2012,490935933,3/18/2012,7707,109.28,35.84,842220.96,276218.88,566002.08
+Europe,Malta,Baby Food,Offline,C,4/27/2015,296073234,6/4/2015,3504,255.28,159.42,894501.12,558607.68,335893.44
+Central America and the Caribbean,Saint Lucia,Baby Food,Online,M,10/16/2014,325729882,11/19/2014,9565,255.28,159.42,2441753.20,1524852.30,916900.90
+Asia,Sri Lanka,Clothes,Online,L,3/17/2010,239329707,3/27/2010,1834,109.28,35.84,200419.52,65730.56,134688.96
+North America,Mexico,Beverages,Offline,L,6/22/2017,216609036,7/3/2017,8282,47.45,31.79,392980.90,263284.78,129696.12
+Asia,North Korea,Fruits,Offline,H,11/29/2011,507616698,12/18/2011,3916,9.33,6.92,36536.28,27098.72,9437.56
+Central America and the Caribbean,Nicaragua,Vegetables,Online,L,5/4/2015,982714021,6/6/2015,5772,154.06,90.93,889234.32,524847.96,364386.36
+Sub-Saharan Africa,Botswana,Clothes,Offline,H,7/24/2016,682574832,8/28/2016,7916,109.28,35.84,865060.48,283709.44,581351.04
+Europe,Poland,Snacks,Online,M,1/9/2013,968185460,2/3/2013,6448,152.58,97.44,983835.84,628293.12,355542.72
+Central America and the Caribbean,Saint Vincent and the Grenadines,Fruits,Offline,H,8/7/2014,570844733,9/15/2014,4497,9.33,6.92,41957.01,31119.24,10837.77
+Sub-Saharan Africa,Mauritius ,Baby Food,Online,M,1/26/2017,542163980,2/21/2017,7224,255.28,159.42,1844142.72,1151650.08,692492.64
+Sub-Saharan Africa,Zambia,Meat,Online,H,7/5/2013,204067027,7/31/2013,6823,421.89,364.69,2878555.47,2488279.87,390275.60
+Sub-Saharan Africa,Guinea,Clothes,Offline,H,3/11/2013,298790204,4/18/2013,7516,109.28,35.84,821348.48,269373.44,551975.04
+Central America and the Caribbean,Nicaragua,Cereal,Online,M,2/6/2015,738882339,2/9/2015,558,205.70,117.11,114780.60,65347.38,49433.22
+Central America and the Caribbean,Haiti,Cosmetics,Online,M,9/16/2011,157204759,10/9/2011,9236,437.20,263.33,4037979.20,2432115.88,1605863.32
+Middle East and North Africa,Qatar,Fruits,Offline,L,6/28/2015,856931293,8/8/2015,3867,9.33,6.92,36079.11,26759.64,9319.47
+Sub-Saharan Africa,Tanzania,Snacks,Offline,L,4/7/2017,261548268,4/15/2017,6800,152.58,97.44,1037544.00,662592.00,374952.00
+Europe,Kosovo,Baby Food,Offline,M,9/13/2012,364854514,10/3/2012,7413,255.28,159.42,1892390.64,1181780.46,710610.18
+Europe,Luxembourg,Cosmetics,Online,C,9/6/2013,980961358,10/8/2013,7120,437.20,263.33,3112864.00,1874909.60,1237954.40
+Asia,Japan,Cosmetics,Offline,L,3/21/2014,194292628,4/27/2014,4361,437.20,263.33,1906629.20,1148382.13,758247.07
+Middle East and North Africa,Qatar,Vegetables,Offline,H,12/17/2016,209584653,1/30/2017,9611,154.06,90.93,1480670.66,873928.23,606742.43
+Europe,France,Fruits,Offline,C,4/9/2014,601886260,5/27/2014,374,9.33,6.92,3489.42,2588.08,901.34
+Central America and the Caribbean,Saint Kitts and Nevis ,Cosmetics,Online,C,9/17/2014,566558778,9/25/2014,6187,437.20,263.33,2704956.40,1629222.71,1075733.69
+Sub-Saharan Africa,Eritrea,Personal Care,Offline,M,7/22/2016,269276034,8/14/2016,3617,81.73,56.67,295617.41,204975.39,90642.02
+Middle East and North Africa,Jordan,Office Supplies,Offline,L,7/29/2011,396024358,7/30/2011,1263,651.21,524.96,822478.23,663024.48,159453.75
+Sub-Saharan Africa,Togo,Cereal,Offline,C,7/10/2011,803102576,8/24/2011,4754,205.70,117.11,977897.80,556740.94,421156.86
+Sub-Saharan Africa,Burundi,Office Supplies,Online,M,1/31/2014,967122018,2/12/2014,1752,651.21,524.96,1140919.92,919729.92,221190.00
+Sub-Saharan Africa,Ethiopia,Personal Care,Online,L,3/23/2014,435006511,3/29/2014,6948,81.73,56.67,567860.04,393743.16,174116.88
+Middle East and North Africa,Iran,Vegetables,Online,C,7/14/2015,173992383,8/24/2015,7067,154.06,90.93,1088742.02,642602.31,446139.71
+Europe,Poland,Household,Online,L,4/27/2011,321628463,5/14/2011,5864,668.27,502.54,3918735.28,2946894.56,971840.72
+Australia and Oceania,Palau,Cereal,Offline,M,2/4/2011,635776078,2/4/2011,9125,205.70,117.11,1877012.50,1068628.75,808383.75
+Europe,Portugal,Meat,Online,L,1/30/2014,944609057,3/16/2014,9666,421.89,364.69,4077988.74,3525093.54,552895.20
+Central America and the Caribbean,El Salvador,Vegetables,Online,M,12/26/2012,696613729,1/13/2013,2337,154.06,90.93,360038.22,212503.41,147534.81
+Europe,Malta,Cosmetics,Offline,H,12/14/2012,310588920,1/6/2013,9018,437.20,263.33,3942669.60,2374709.94,1567959.66
+Sub-Saharan Africa,South Sudan,Office Supplies,Online,C,8/8/2012,725645959,9/8/2012,3620,651.21,524.96,2357380.20,1900355.20,457025.00
+Europe,Armenia,Meat,Offline,M,6/2/2015,251208674,7/19/2015,7084,421.89,364.69,2988668.76,2583463.96,405204.80
+Sub-Saharan Africa,Senegal,Personal Care,Online,H,10/19/2010,417013394,11/29/2010,2385,81.73,56.67,194926.05,135157.95,59768.10
+Middle East and North Africa,Morocco,Beverages,Online,M,9/17/2015,123108947,10/9/2015,9528,47.45,31.79,452103.60,302895.12,149208.48
+Sub-Saharan Africa,Nigeria,Personal Care,Online,C,4/29/2010,589856660,5/10/2010,548,81.73,56.67,44788.04,31055.16,13732.88
+Central America and the Caribbean,Nicaragua,Clothes,Online,L,7/12/2017,407930362,7/31/2017,4514,109.28,35.84,493289.92,161781.76,331508.16
+Europe,Greece,Fruits,Online,L,10/31/2015,488316380,11/18/2015,2523,9.33,6.92,23539.59,17459.16,6080.43
+Middle East and North Africa,Oman,Cereal,Offline,H,4/25/2011,912313544,5/15/2011,2706,205.70,117.11,556624.20,316899.66,239724.54
+Middle East and North Africa,Syria,Beverages,Online,L,2/16/2011,481533181,4/7/2011,5224,47.45,31.79,247878.80,166070.96,81807.84
+Sub-Saharan Africa,Togo,Personal Care,Online,L,2/16/2012,767899119,3/7/2012,7269,81.73,56.67,594095.37,411934.23,182161.14
+Europe,Vatican City,Clothes,Online,M,3/23/2012,263647687,3/30/2012,8064,109.28,35.84,881233.92,289013.76,592220.16
+Sub-Saharan Africa,Senegal,Beverages,Online,L,3/13/2014,231327712,4/8/2014,3865,47.45,31.79,183394.25,122868.35,60525.90
+Europe,Switzerland,Personal Care,Offline,H,4/19/2014,653800523,4/23/2014,2958,81.73,56.67,241757.34,167629.86,74127.48
+Europe,Sweden,Cosmetics,Online,L,8/24/2013,684239947,8/31/2013,661,437.20,263.33,288989.20,174061.13,114928.07
+Sub-Saharan Africa,Eritrea,Cereal,Offline,M,6/3/2014,896132314,6/19/2014,4321,205.70,117.11,888829.70,506032.31,382797.39
+Europe,Vatican City,Personal Care,Online,H,1/27/2016,133276450,3/15/2016,8318,81.73,56.67,679830.14,471381.06,208449.08
+Asia,Indonesia,Clothes,Offline,H,7/22/2011,459783685,8/23/2011,9065,109.28,35.84,990623.20,324889.60,665733.60
+Sub-Saharan Africa,Rwanda,Clothes,Online,M,10/23/2013,410077846,12/2/2013,2,109.28,35.84,218.56,71.68,146.88
+Europe,Moldova ,Personal Care,Offline,L,2/17/2014,838895261,2/19/2014,6605,81.73,56.67,539826.65,374305.35,165521.30
+Central America and the Caribbean,Saint Kitts and Nevis ,Vegetables,Online,M,3/27/2016,871284759,5/8/2016,1377,154.06,90.93,212140.62,125210.61,86930.01
+Middle East and North Africa,Qatar,Household,Offline,C,5/1/2017,152607667,6/11/2017,8855,668.27,502.54,5917530.85,4449991.70,1467539.15
+Europe,Denmark,Meat,Online,C,11/26/2011,198537814,12/19/2011,606,421.89,364.69,255665.34,221002.14,34663.20
+Australia and Oceania,Tonga,Meat,Offline,C,8/26/2010,345061528,9/19/2010,229,421.89,364.69,96612.81,83514.01,13098.80
+Central America and the Caribbean,Grenada,Vegetables,Offline,M,12/22/2013,898477637,1/7/2014,8354,154.06,90.93,1287017.24,759629.22,527388.02
+Europe,Slovenia,Meat,Online,M,10/10/2015,885397469,11/18/2015,7642,421.89,364.69,3224083.38,2786960.98,437122.40
+Europe,Hungary,Personal Care,Offline,H,10/16/2014,302744853,11/2/2014,7785,81.73,56.67,636268.05,441175.95,195092.10
+Sub-Saharan Africa,Mauritius ,Beverages,Online,L,11/3/2010,567756116,12/12/2010,506,47.45,31.79,24009.70,16085.74,7923.96
+Sub-Saharan Africa,Mauritius ,Beverages,Online,M,2/26/2016,467980086,3/28/2016,4562,47.45,31.79,216466.90,145025.98,71440.92
+Middle East and North Africa,Syria,Personal Care,Online,L,9/29/2013,211278092,11/3/2013,737,81.73,56.67,60235.01,41765.79,18469.22
+Europe,Greece,Office Supplies,Online,L,3/11/2014,975823962,4/8/2014,6850,651.21,524.96,4460788.50,3595976.00,864812.50
+Europe,Denmark,Cosmetics,Offline,M,12/27/2013,860104024,12/30/2013,2749,437.20,263.33,1201862.80,723894.17,477968.63
+Sub-Saharan Africa,Cape Verde,Cosmetics,Online,M,6/28/2014,732917106,8/9/2014,5313,437.20,263.33,2322843.60,1399072.29,923771.31
+Sub-Saharan Africa,Sudan,Cereal,Online,L,7/14/2010,183374536,8/18/2010,3455,205.70,117.11,710693.50,404615.05,306078.45
+Sub-Saharan Africa,Cote d'Ivoire,Baby Food,Offline,C,12/18/2016,670900142,1/2/2017,3116,255.28,159.42,795452.48,496752.72,298699.76
+Australia and Oceania,Kiribati,Meat,Online,L,10/25/2011,575230252,11/22/2011,2269,421.89,364.69,957268.41,827481.61,129786.80
+Central America and the Caribbean,Panama,Office Supplies,Offline,H,11/5/2015,146413695,11/11/2015,5921,651.21,524.96,3855814.41,3108288.16,747526.25
+Sub-Saharan Africa,Mali,Fruits,Offline,L,1/2/2013,154811799,2/19/2013,1106,9.33,6.92,10318.98,7653.52,2665.46
+Sub-Saharan Africa,Sao Tome and Principe,Household,Online,C,10/30/2014,541098392,12/4/2014,1893,668.27,502.54,1265035.11,951308.22,313726.89
+Asia,Kazakhstan,Baby Food,Online,M,3/7/2011,866259801,3/25/2011,4380,255.28,159.42,1118126.40,698259.60,419866.80
+Asia,North Korea,Clothes,Offline,C,12/8/2011,761594855,1/11/2012,1697,109.28,35.84,185448.16,60820.48,124627.68
+Europe,Montenegro,Cosmetics,Offline,M,11/16/2012,378714883,12/16/2012,9005,437.20,263.33,3936986.00,2371286.65,1565699.35
+Middle East and North Africa,Azerbaijan,Personal Care,Online,H,8/24/2014,839543712,10/10/2014,8496,81.73,56.67,694378.08,481468.32,212909.76
+Asia,North Korea,Beverages,Online,M,5/18/2011,186317670,6/21/2011,4394,47.45,31.79,208495.30,139685.26,68810.04
+Europe,France,Personal Care,Offline,C,3/13/2017,131585586,4/13/2017,7954,81.73,56.67,650080.42,450753.18,199327.24
+Middle East and North Africa,Iran,Fruits,Offline,C,1/3/2017,208208787,2/14/2017,2462,9.33,6.92,22970.46,17037.04,5933.42
+Asia,Kazakhstan,Baby Food,Offline,M,9/17/2015,919361102,9/23/2015,8235,255.28,159.42,2102230.80,1312823.70,789407.10
+Europe,Greece,Personal Care,Online,L,9/11/2011,588528859,10/12/2011,7623,81.73,56.67,623027.79,431995.41,191032.38
+Australia and Oceania,East Timor,Beverages,Offline,L,10/11/2015,309510886,10/17/2015,4,47.45,31.79,189.80,127.16,62.64
+Europe,Macedonia,Meat,Online,L,2/12/2017,796418511,3/23/2017,6791,421.89,364.69,2865054.99,2476609.79,388445.20
+Australia and Oceania,Australia,Cosmetics,Offline,L,4/22/2017,133675563,5/16/2017,6424,437.20,263.33,2808572.80,1691631.92,1116940.88
+Europe,Kosovo,Cosmetics,Online,M,6/3/2011,526018369,6/21/2011,9379,437.20,263.33,4100498.80,2469772.07,1630726.73
+Middle East and North Africa,Kuwait,Cosmetics,Online,L,7/14/2014,648495757,7/31/2014,3160,437.20,263.33,1381552.00,832122.80,549429.20
+Central America and the Caribbean,Dominica,Vegetables,Offline,H,6/30/2012,596469056,7/30/2012,7303,154.06,90.93,1125100.18,664061.79,461038.39
+Middle East and North Africa,Jordan,Fruits,Online,H,2/26/2011,535612094,3/3/2011,8376,9.33,6.92,78148.08,57961.92,20186.16
+North America,Mexico,Snacks,Offline,L,6/2/2017,251911199,6/4/2017,4977,152.58,97.44,759390.66,484958.88,274431.78
+Central America and the Caribbean,Belize,Office Supplies,Offline,L,10/5/2012,501665198,10/26/2012,2735,651.21,524.96,1781059.35,1435765.60,345293.75
+Asia,Malaysia,Beverages,Offline,L,1/3/2010,761485421,1/26/2010,9313,47.45,31.79,441901.85,296060.27,145841.58
+Middle East and North Africa,United Arab Emirates,Meat,Offline,L,9/10/2011,578295695,9/19/2011,9402,421.89,364.69,3966609.78,3428815.38,537794.40
+Middle East and North Africa,Pakistan,Snacks,Offline,M,11/2/2013,919332349,12/15/2013,9726,152.58,97.44,1483993.08,947701.44,536291.64
+Europe,Montenegro,Beverages,Offline,C,4/27/2017,122144210,5/24/2017,4041,47.45,31.79,191745.45,128463.39,63282.06
+Europe,Belarus,Office Supplies,Offline,H,7/6/2016,644592607,7/31/2016,8131,651.21,524.96,5294988.51,4268449.76,1026538.75
+North America,Greenland,Cereal,Offline,H,8/19/2010,514851367,10/2/2010,4815,205.70,117.11,990445.50,563884.65,426560.85
+Sub-Saharan Africa,Niger,Vegetables,Offline,C,2/9/2015,981406819,3/28/2015,8942,154.06,90.93,1377604.52,813096.06,564508.46
+Middle East and North Africa,Pakistan,Beverages,Offline,M,5/11/2012,663057792,6/22/2012,2390,47.45,31.79,113405.50,75978.10,37427.40
+Central America and the Caribbean,Saint Vincent and the Grenadines,Cereal,Online,C,2/27/2016,498915612,4/13/2016,9072,205.70,117.11,1866110.40,1062421.92,803688.48
+Europe,Moldova ,Fruits,Online,H,11/3/2014,598404109,11/18/2014,9929,9.33,6.92,92637.57,68708.68,23928.89
+Sub-Saharan Africa,Lesotho,Household,Offline,L,12/12/2012,691259610,1/3/2013,7935,668.27,502.54,5302722.45,3987654.90,1315067.55
+Europe,Czech Republic,Personal Care,Online,C,4/22/2012,577530944,5/15/2012,3095,81.73,56.67,252954.35,175393.65,77560.70
+North America,United States of America,Cereal,Offline,M,10/21/2015,577579438,11/30/2015,7446,205.70,117.11,1531642.20,872001.06,659641.14
+Europe,Finland,Fruits,Offline,H,1/12/2016,182078921,2/14/2016,54,9.33,6.92,503.82,373.68,130.14
+Europe,Serbia,Baby Food,Online,H,3/22/2014,302015721,4/17/2014,2018,255.28,159.42,515155.04,321709.56,193445.48
+Middle East and North Africa,Afghanistan,Fruits,Online,L,6/16/2016,118688666,7/15/2016,1469,9.33,6.92,13705.77,10165.48,3540.29
+Europe,Latvia,Clothes,Offline,M,9/28/2014,233709084,10/16/2014,8566,109.28,35.84,936092.48,307005.44,629087.04
+Sub-Saharan Africa,Burkina Faso,Vegetables,Online,M,7/1/2013,419000804,7/5/2013,504,154.06,90.93,77646.24,45828.72,31817.52
+Europe,Estonia,Meat,Offline,M,8/25/2010,966800153,9/10/2010,6505,421.89,364.69,2744394.45,2372308.45,372086.00
+Asia,Singapore,Baby Food,Online,L,7/12/2016,439655959,7/30/2016,2823,255.28,159.42,720655.44,450042.66,270612.78
+Central America and the Caribbean,Grenada,Cosmetics,Offline,H,4/5/2012,620429551,5/11/2012,7746,437.20,263.33,3386551.20,2039754.18,1346797.02
+Sub-Saharan Africa,Sao Tome and Principe,Personal Care,Online,H,2/7/2014,662294757,3/17/2014,6591,81.73,56.67,538682.43,373511.97,165170.46
+Sub-Saharan Africa,Ethiopia,Office Supplies,Offline,H,8/28/2016,238737905,8/30/2016,6706,651.21,524.96,4367014.26,3520381.76,846632.50
+Central America and the Caribbean,Dominican Republic,Cereal,Offline,H,10/23/2011,893557822,12/9/2011,2471,205.70,117.11,508284.70,289378.81,218905.89
+Central America and the Caribbean,Belize,Household,Offline,M,3/24/2015,190865838,3/27/2015,298,668.27,502.54,199144.46,149756.92,49387.54
+Middle East and North Africa,Turkey,Vegetables,Online,C,2/18/2017,265085780,3/30/2017,3628,154.06,90.93,558929.68,329894.04,229035.64
+Asia,Tajikistan,Baby Food,Offline,L,5/26/2016,170953977,7/5/2016,7936,255.28,159.42,2025902.08,1265157.12,760744.96
+Asia,China,Clothes,Offline,C,9/26/2016,833519256,10/20/2016,5725,109.28,35.84,625628.00,205184.00,420444.00
+Sub-Saharan Africa,Chad,Office Supplies,Offline,L,5/10/2015,998142945,6/6/2015,1533,651.21,524.96,998304.93,804763.68,193541.25
+Europe,Bulgaria,Clothes,Online,H,4/24/2014,380498874,5/13/2014,6927,109.28,35.84,756982.56,248263.68,508718.88
+Sub-Saharan Africa,Sierra Leone,Meat,Offline,C,9/25/2016,116573369,11/3/2016,5505,421.89,364.69,2322504.45,2007618.45,314886.00
+Sub-Saharan Africa,Malawi,Fruits,Offline,C,6/15/2015,512665259,6/22/2015,7898,9.33,6.92,73688.34,54654.16,19034.18
+Europe,Luxembourg,Personal Care,Offline,M,12/7/2011,595385873,12/21/2011,6765,81.73,56.67,552903.45,383372.55,169530.90
+Europe,Luxembourg,Cereal,Online,L,6/30/2012,361659038,8/3/2012,1801,205.70,117.11,370465.70,210915.11,159550.59
+Europe,Kosovo,Baby Food,Online,L,12/14/2016,328721082,12/18/2016,4728,255.28,159.42,1206963.84,753737.76,453226.08
+Europe,Denmark,Clothes,Offline,H,10/27/2014,184120833,10/31/2014,4301,109.28,35.84,470013.28,154147.84,315865.44
+Asia,Singapore,Meat,Online,H,10/29/2011,135719621,11/22/2011,1307,421.89,364.69,551410.23,476649.83,74760.40
+Australia and Oceania,Samoa ,Personal Care,Offline,C,12/23/2010,461691272,2/2/2011,3562,81.73,56.67,291122.26,201858.54,89263.72
+Asia,Philippines,Snacks,Offline,M,5/6/2016,160522115,6/22/2016,916,152.58,97.44,139763.28,89255.04,50508.24
+Asia,China,Meat,Online,H,2/17/2014,101010978,3/12/2014,248,421.89,364.69,104628.72,90443.12,14185.60
+Middle East and North Africa,Iraq,Vegetables,Online,M,4/29/2014,772269189,5/12/2014,469,154.06,90.93,72254.14,42646.17,29607.97
+Europe,Liechtenstein,Vegetables,Offline,H,8/14/2016,933720576,10/1/2016,7523,154.06,90.93,1158993.38,684066.39,474926.99
+Europe,Latvia,Cosmetics,Online,H,3/14/2014,765101468,4/6/2014,9382,437.20,263.33,4101810.40,2470562.06,1631248.34
+Europe,Armenia,Household,Offline,M,9/3/2012,516460692,9/24/2012,1051,668.27,502.54,702351.77,528169.54,174182.23
+Asia,North Korea,Fruits,Online,L,2/23/2011,958159577,4/4/2011,9566,9.33,6.92,89250.78,66196.72,23054.06
+Asia,Nepal,Household,Offline,H,7/26/2013,230871951,8/8/2013,8996,668.27,502.54,6011756.92,4520849.84,1490907.08
+Sub-Saharan Africa,Cape Verde,Fruits,Online,M,5/20/2017,595584142,6/29/2017,5438,9.33,6.92,50736.54,37630.96,13105.58
+Europe,Ukraine,Meat,Offline,H,4/25/2017,783594977,5/1/2017,2022,421.89,364.69,853061.58,737403.18,115658.40
+Asia,Tajikistan,Personal Care,Online,L,9/22/2016,946515786,10/4/2016,3910,81.73,56.67,319564.30,221579.70,97984.60
+Europe,Romania,Snacks,Online,L,4/3/2016,406270396,5/19/2016,3293,152.58,97.44,502445.94,320869.92,181576.02
+Europe,Kosovo,Vegetables,Online,L,1/13/2010,805095136,1/20/2010,4396,154.06,90.93,677247.76,399728.28,277519.48
+Asia,Thailand,Fruits,Offline,M,3/12/2012,255538833,4/18/2012,8474,9.33,6.92,79062.42,58640.08,20422.34
+Sub-Saharan Africa,Madagascar,Office Supplies,Online,C,3/17/2015,990462815,4/24/2015,8812,651.21,524.96,5738462.52,4625947.52,1112515.00
+Australia and Oceania,Australia,Baby Food,Offline,M,5/26/2016,813040912,5/26/2016,5728,255.28,159.42,1462243.84,913157.76,549086.08
+Sub-Saharan Africa,Tanzania,Personal Care,Online,C,3/3/2014,746759450,4/3/2014,1571,81.73,56.67,128397.83,89028.57,39369.26
+Europe,United Kingdom,Cereal,Online,M,10/1/2011,985417258,10/21/2011,5720,205.70,117.11,1176604.00,669869.20,506734.80
+Europe,Serbia,Cereal,Offline,M,6/15/2013,443125665,7/9/2013,9586,205.70,117.11,1971840.20,1122616.46,849223.74
+Sub-Saharan Africa,Seychelles ,Vegetables,Offline,C,4/18/2013,804308497,5/27/2013,1613,154.06,90.93,248498.78,146670.09,101828.69
+Central America and the Caribbean,Honduras,Cosmetics,Online,H,12/4/2013,673702085,12/24/2013,2273,437.20,263.33,993755.60,598549.09,395206.51
+Asia,Sri Lanka,Fruits,Offline,L,4/9/2015,526355254,4/22/2015,9071,9.33,6.92,84632.43,62771.32,21861.11
+Central America and the Caribbean,Dominican Republic,Clothes,Offline,L,10/3/2010,457629334,11/2/2010,1544,109.28,35.84,168728.32,55336.96,113391.36
+Sub-Saharan Africa,Central African Republic,Cereal,Offline,H,10/19/2013,633198153,11/3/2013,6260,205.70,117.11,1287682.00,733108.60,554573.40
+Australia and Oceania,New Zealand,Office Supplies,Offline,H,3/2/2016,839048039,4/2/2016,1815,651.21,524.96,1181946.15,952802.40,229143.75
+Europe,Belgium,Beverages,Online,L,6/23/2014,931477820,7/19/2014,3841,47.45,31.79,182255.45,122105.39,60150.06
+Europe,United Kingdom,Personal Care,Offline,H,12/23/2013,387098824,1/4/2014,9999,81.73,56.67,817218.27,566643.33,250574.94
+Sub-Saharan Africa,Niger,Meat,Online,L,3/16/2017,552834880,4/25/2017,4981,421.89,364.69,2101434.09,1816520.89,284913.20
+Europe,Denmark,Meat,Offline,M,8/12/2012,595922315,9/4/2012,5510,421.89,364.69,2324613.90,2009441.90,315172.00
+Europe,Slovakia,Office Supplies,Online,M,3/23/2016,653909957,4/6/2016,5342,651.21,524.96,3478763.82,2804336.32,674427.50
+Sub-Saharan Africa,Burundi,Beverages,Online,M,10/31/2014,484659135,11/29/2014,263,47.45,31.79,12479.35,8360.77,4118.58
+Sub-Saharan Africa,Burkina Faso,Snacks,Online,H,3/25/2015,816343677,4/13/2015,3090,152.58,97.44,471472.20,301089.60,170382.60
+Asia,Turkmenistan,Personal Care,Online,M,2/16/2010,197449910,2/20/2010,8671,81.73,56.67,708680.83,491385.57,217295.26
+Asia,Myanmar,Snacks,Offline,L,3/27/2012,846776664,5/3/2012,8887,152.58,97.44,1355978.46,865949.28,490029.18
+Europe,Serbia,Beverages,Offline,H,8/11/2012,103435266,9/18/2012,7648,47.45,31.79,362897.60,243129.92,119767.68
+Central America and the Caribbean,Saint Kitts and Nevis ,Fruits,Online,H,9/25/2014,776849544,10/7/2014,5898,9.33,6.92,55028.34,40814.16,14214.18
+Sub-Saharan Africa,Guinea-Bissau,Baby Food,Offline,L,7/28/2015,796755826,8/28/2015,6609,255.28,159.42,1687145.52,1053606.78,633538.74
+Europe,Sweden,Meat,Offline,L,12/12/2016,863202941,12/13/2016,9787,421.89,364.69,4129037.43,3569221.03,559816.40
+Europe,Cyprus,Clothes,Offline,M,3/8/2014,396552217,4/24/2014,7468,109.28,35.84,816103.04,267653.12,548449.92
+Asia,Taiwan,Beverages,Offline,C,1/4/2015,687477481,1/30/2015,8719,47.45,31.79,413716.55,277177.01,136539.54
+Sub-Saharan Africa,Benin,Snacks,Online,H,2/1/2013,846965062,2/12/2013,4638,152.58,97.44,707666.04,451926.72,255739.32
+Middle East and North Africa,Afghanistan,Personal Care,Online,M,7/3/2014,956313788,7/19/2014,3356,81.73,56.67,274285.88,190184.52,84101.36
+Central America and the Caribbean,Haiti,Clothes,Offline,H,4/4/2011,717134988,4/17/2011,5034,109.28,35.84,550115.52,180418.56,369696.96
+Europe,United Kingdom,Cosmetics,Offline,M,5/6/2015,801352488,5/23/2015,6864,437.20,263.33,3000940.80,1807497.12,1193443.68
+Middle East and North Africa,Libya,Office Supplies,Offline,M,2/11/2017,601202619,2/15/2017,8070,651.21,524.96,5255264.70,4236427.20,1018837.50
+Europe,Luxembourg,Fruits,Online,H,10/7/2011,479234206,11/14/2011,4906,9.33,6.92,45772.98,33949.52,11823.46
+Sub-Saharan Africa,The Gambia,Baby Food,Offline,L,9/13/2010,418308579,10/30/2010,5659,255.28,159.42,1444629.52,902157.78,542471.74
+Middle East and North Africa,Turkey,Cosmetics,Offline,L,1/12/2015,471599566,2/28/2015,5647,437.20,263.33,2468868.40,1487024.51,981843.89
+Sub-Saharan Africa,Mauritania,Baby Food,Online,H,10/18/2011,312593495,11/3/2011,2217,255.28,159.42,565955.76,353434.14,212521.62
+Sub-Saharan Africa,Democratic Republic of the Congo,Snacks,Offline,M,8/5/2015,585089194,8/30/2015,9749,152.58,97.44,1487502.42,949942.56,537559.86
+Middle East and North Africa,Egypt,Snacks,Online,C,10/20/2011,653197991,10/22/2011,4656,152.58,97.44,710412.48,453680.64,256731.84
+Sub-Saharan Africa,Djibouti,Cereal,Online,C,5/12/2013,851343715,5/31/2013,379,205.70,117.11,77960.30,44384.69,33575.61
+Sub-Saharan Africa,South Sudan,Household,Offline,C,7/27/2011,234262692,8/2/2011,2391,668.27,502.54,1597833.57,1201573.14,396260.43
+Europe,Romania,Meat,Offline,M,2/19/2010,627003753,3/26/2010,3199,421.89,364.69,1349626.11,1166643.31,182982.80
+Middle East and North Africa,Syria,Vegetables,Offline,C,11/6/2013,774928224,12/17/2013,7337,154.06,90.93,1130338.22,667153.41,463184.81
+Europe,France,Fruits,Offline,C,3/12/2017,393709933,4/25/2017,6373,9.33,6.92,59460.09,44101.16,15358.93
+Sub-Saharan Africa,Mauritius ,Household,Online,C,9/20/2015,619335210,10/21/2015,3906,668.27,502.54,2610262.62,1962921.24,647341.38
+Asia,Kyrgyzstan,Office Supplies,Online,M,5/27/2017,858102881,6/23/2017,566,651.21,524.96,368584.86,297127.36,71457.50
+Europe,Latvia,Beverages,Offline,L,2/20/2016,136624276,3/8/2016,9014,47.45,31.79,427714.30,286555.06,141159.24
+Europe,United Kingdom,Clothes,Online,L,9/3/2010,251823222,10/1/2010,8942,109.28,35.84,977181.76,320481.28,656700.48
+Asia,India,Fruits,Online,H,12/20/2015,820936048,2/8/2016,2074,9.33,6.92,19350.42,14352.08,4998.34
+Sub-Saharan Africa,Zambia,Snacks,Online,M,12/17/2013,631511580,12/23/2013,7165,152.58,97.44,1093235.70,698157.60,395078.10
+Asia,India,Household,Online,C,5/20/2010,791411149,6/30/2010,5001,668.27,502.54,3342018.27,2513202.54,828815.73
+Central America and the Caribbean,Saint Vincent and the Grenadines,Beverages,Online,M,10/24/2015,678808581,11/24/2015,3399,47.45,31.79,161282.55,108054.21,53228.34
+Australia and Oceania,Fiji,Household,Online,C,8/8/2011,192190206,8/26/2011,2208,668.27,502.54,1475540.16,1109608.32,365931.84
+Europe,Macedonia,Baby Food,Offline,H,4/1/2014,200354850,5/4/2014,8307,255.28,159.42,2120610.96,1324301.94,796309.02
+North America,United States of America,Clothes,Offline,H,1/7/2011,292413842,1/26/2011,609,109.28,35.84,66551.52,21826.56,44724.96
+Asia,Vietnam,Beverages,Offline,C,10/1/2016,127791011,10/9/2016,5055,47.45,31.79,239859.75,160698.45,79161.30
+Australia and Oceania,Australia,Cereal,Online,L,1/22/2017,786222684,3/9/2017,9619,205.70,117.11,1978628.30,1126481.09,852147.21
+Australia and Oceania,Tuvalu,Cosmetics,Online,C,7/21/2017,717757689,8/4/2017,9305,437.20,263.33,4068146.00,2450285.65,1617860.35
+Europe,Germany,Meat,Offline,H,5/2/2017,692757356,5/12/2017,1151,421.89,364.69,485595.39,419758.19,65837.20
+Europe,Liechtenstein,Baby Food,Offline,L,10/12/2012,651895511,11/1/2012,9223,255.28,159.42,2354447.44,1470330.66,884116.78
+Europe,Lithuania,Clothes,Offline,C,6/26/2016,156158483,8/5/2016,9620,109.28,35.84,1051273.60,344780.80,706492.80
+Asia,Japan,Office Supplies,Offline,L,8/6/2015,636845099,8/13/2015,5472,651.21,524.96,3563421.12,2872581.12,690840.00
+Sub-Saharan Africa,Sierra Leone,Cosmetics,Offline,H,6/23/2013,445566689,7/15/2013,1940,437.20,263.33,848168.00,510860.20,337307.80
+Sub-Saharan Africa,Nigeria,Vegetables,Offline,H,10/7/2010,704247081,10/29/2010,1216,154.06,90.93,187336.96,110570.88,76766.08
+Sub-Saharan Africa,Madagascar,Beverages,Online,L,9/27/2016,355122601,10/5/2016,7524,47.45,31.79,357013.80,239187.96,117825.84
+Australia and Oceania,Papua New Guinea,Cereal,Online,M,3/29/2015,210742080,4/19/2015,2119,205.70,117.11,435878.30,248156.09,187722.21
+Europe,Serbia,Snacks,Offline,C,11/18/2013,703966844,11/30/2013,8288,152.58,97.44,1264583.04,807582.72,457000.32
+Sub-Saharan Africa,Senegal,Cosmetics,Online,C,7/26/2017,537970721,8/18/2017,6346,437.20,263.33,2774471.20,1671092.18,1103379.02
+Europe,Slovenia,Household,Offline,L,2/11/2017,736240041,2/20/2017,8644,668.27,502.54,5776525.88,4343955.76,1432570.12
+Middle East and North Africa,Iraq,Office Supplies,Online,H,10/9/2015,592573630,10/21/2015,4560,651.21,524.96,2969517.60,2393817.60,575700.00
+Central America and the Caribbean,Haiti,Snacks,Online,L,4/7/2010,821082818,5/15/2010,5507,152.58,97.44,840258.06,536602.08,303655.98
+Sub-Saharan Africa,Sierra Leone,Household,Offline,L,5/1/2017,406191432,6/1/2017,9926,668.27,502.54,6633248.02,4988212.04,1645035.98
+Sub-Saharan Africa,Uganda,Office Supplies,Online,H,11/25/2016,652635800,1/14/2017,8291,651.21,524.96,5399182.11,4352443.36,1046738.75
+Asia,Myanmar,Meat,Offline,H,6/24/2016,235464751,8/2/2016,8107,421.89,364.69,3420262.23,2956541.83,463720.40
+Sub-Saharan Africa,Angola,Fruits,Offline,M,1/23/2017,150039613,1/30/2017,8910,9.33,6.92,83130.30,61657.20,21473.10
+Middle East and North Africa,Yemen,Cosmetics,Offline,M,12/1/2016,562034213,12/4/2016,7268,437.20,263.33,3177569.60,1913882.44,1263687.16
+Europe,Montenegro,Cosmetics,Online,C,5/22/2015,357434880,6/29/2015,1779,437.20,263.33,777778.80,468464.07,309314.73
+Asia,Myanmar,Household,Offline,H,8/29/2016,292540442,9/7/2016,8073,668.27,502.54,5394943.71,4057005.42,1337938.29
+Asia,Indonesia,Meat,Online,H,11/5/2010,743962228,12/4/2010,3811,421.89,364.69,1607822.79,1389833.59,217989.20
+Europe,Russia,Clothes,Offline,H,8/15/2015,358624064,10/3/2015,3685,109.28,35.84,402696.80,132070.40,270626.40
+Europe,Spain,Vegetables,Online,M,11/12/2011,103762280,12/14/2011,4419,154.06,90.93,680791.14,401819.67,278971.47
+Central America and the Caribbean,El Salvador,Cereal,Online,H,8/8/2015,116925704,9/8/2015,9769,205.70,117.11,2009483.30,1144047.59,865435.71
+Asia,Uzbekistan,Household,Online,C,8/16/2013,155975663,8/26/2013,5520,668.27,502.54,3688850.40,2774020.80,914829.60
+Sub-Saharan Africa,Sudan,Clothes,Online,M,9/22/2012,949085986,10/16/2012,4489,109.28,35.84,490557.92,160885.76,329672.16
+Europe,Slovenia,Baby Food,Offline,M,3/12/2013,144743001,4/21/2013,1525,255.28,159.42,389302.00,243115.50,146186.50
+Asia,Brunei,Baby Food,Online,M,8/3/2012,861745536,8/14/2012,8509,255.28,159.42,2172177.52,1356504.78,815672.74
+Europe,Iceland,Beverages,Online,L,2/11/2017,439204919,2/19/2017,9350,47.45,31.79,443657.50,297236.50,146421.00
+Sub-Saharan Africa,Zambia,Office Supplies,Offline,L,2/6/2015,786544978,3/15/2015,4993,651.21,524.96,3251491.53,2621125.28,630366.25
+Sub-Saharan Africa,Namibia,Meat,Online,C,2/4/2011,733502042,2/22/2011,8409,421.89,364.69,3547673.01,3066678.21,480994.80
+Sub-Saharan Africa,Ethiopia,Personal Care,Online,C,6/29/2014,980124938,7/7/2014,9605,81.73,56.67,785016.65,544315.35,240701.30
+Middle East and North Africa,Azerbaijan,Personal Care,Online,M,1/12/2013,946774995,2/13/2013,615,81.73,56.67,50263.95,34852.05,15411.90
+Australia and Oceania,Nauru,Clothes,Offline,H,6/17/2014,124126040,8/2/2014,509,109.28,35.84,55623.52,18242.56,37380.96
+Sub-Saharan Africa,Zambia,Beverages,Online,H,6/5/2012,323164403,6/30/2012,383,47.45,31.79,18173.35,12175.57,5997.78
+Middle East and North Africa,Lebanon,Cereal,Online,L,1/8/2013,725188910,2/8/2013,8369,205.70,117.11,1721503.30,980093.59,741409.71
+Sub-Saharan Africa,Swaziland,Beverages,Online,M,10/26/2015,131810891,12/3/2015,4627,47.45,31.79,219551.15,147092.33,72458.82
+Europe,Malta,Fruits,Offline,C,2/3/2010,114954173,2/11/2010,6349,9.33,6.92,59236.17,43935.08,15301.09
+Middle East and North Africa,Afghanistan,Personal Care,Online,C,6/26/2016,966855084,7/16/2016,2760,81.73,56.67,225574.80,156409.20,69165.60
+Sub-Saharan Africa,Liberia,Clothes,Offline,L,1/17/2015,350062453,2/22/2015,114,109.28,35.84,12457.92,4085.76,8372.16
+Australia and Oceania,Solomon Islands,Baby Food,Online,L,3/8/2017,947437608,4/12/2017,6697,255.28,159.42,1709610.16,1067635.74,641974.42
+Sub-Saharan Africa,Cote d'Ivoire,Beverages,Online,C,6/8/2016,112154376,7/11/2016,7827,47.45,31.79,371391.15,248820.33,122570.82
+Australia and Oceania,Kiribati,Household,Offline,M,12/25/2014,217699086,1/2/2015,852,668.27,502.54,569366.04,428164.08,141201.96
+Sub-Saharan Africa,Zambia,Clothes,Offline,C,4/11/2012,107870566,5/12/2012,153,109.28,35.84,16719.84,5483.52,11236.32
+Sub-Saharan Africa,Namibia,Cereal,Online,C,6/2/2016,946780145,7/2/2016,2139,205.70,117.11,439992.30,250498.29,189494.01
+Middle East and North Africa,Yemen,Cereal,Online,H,1/22/2010,368851649,2/17/2010,255,205.70,117.11,52453.50,29863.05,22590.45
+Sub-Saharan Africa,Cape Verde,Office Supplies,Online,L,10/13/2014,128821408,10/13/2014,9972,651.21,524.96,6493866.12,5234901.12,1258965.00
+Australia and Oceania,Samoa ,Vegetables,Offline,L,8/2/2011,251738250,8/26/2011,3797,154.06,90.93,584965.82,345261.21,239704.61
+Sub-Saharan Africa,Rwanda,Meat,Online,M,10/26/2012,382963502,11/27/2012,6265,421.89,364.69,2643140.85,2284782.85,358358.00
+Europe,Norway,Beverages,Offline,L,12/22/2012,238170993,2/7/2013,8944,47.45,31.79,424392.80,284329.76,140063.04
+Sub-Saharan Africa,Mozambique,Baby Food,Offline,M,3/6/2015,953347051,3/8/2015,5433,255.28,159.42,1386936.24,866128.86,520807.38
+Europe,Italy,Clothes,Online,M,4/2/2012,134790503,4/26/2012,6360,109.28,35.84,695020.80,227942.40,467078.40
+Europe,Montenegro,Vegetables,Online,H,3/30/2013,409112679,5/18/2013,4388,154.06,90.93,676015.28,399000.84,277014.44
+Sub-Saharan Africa,Cameroon,Personal Care,Offline,L,11/24/2016,873237407,11/25/2016,9209,81.73,56.67,752651.57,521874.03,230777.54
+Sub-Saharan Africa,Djibouti,Household,Offline,C,6/15/2015,244401013,7/7/2015,2546,668.27,502.54,1701415.42,1279466.84,421948.58
+North America,United States of America,Cereal,Online,C,7/28/2013,910152328,9/3/2013,3154,205.70,117.11,648777.80,369364.94,279412.86
+Asia,Brunei,Beverages,Online,H,12/25/2016,378352677,1/30/2017,1820,47.45,31.79,86359.00,57857.80,28501.20
+Europe,Italy,Meat,Offline,H,7/19/2013,727175891,9/7/2013,6360,421.89,364.69,2683220.40,2319428.40,363792.00
+Sub-Saharan Africa,Mozambique,Household,Offline,M,11/27/2014,955108296,12/14/2014,6624,668.27,502.54,4426620.48,3328824.96,1097795.52
+Sub-Saharan Africa,South Africa,Clothes,Offline,L,11/2/2014,130948722,11/23/2014,9492,109.28,35.84,1037285.76,340193.28,697092.48
+Australia and Oceania,Papua New Guinea,Office Supplies,Online,M,10/3/2015,543808495,10/7/2015,3873,651.21,524.96,2522136.33,2033170.08,488966.25
+Australia and Oceania,Marshall Islands,Household,Offline,H,5/10/2017,953111445,6/27/2017,5712,668.27,502.54,3817158.24,2870508.48,946649.76
+Europe,Sweden,Cosmetics,Online,L,10/26/2012,638593900,12/12/2012,2981,437.20,263.33,1303293.20,784986.73,518306.47
+Sub-Saharan Africa,Ghana,Snacks,Online,C,5/2/2015,750304687,6/7/2015,685,152.58,97.44,104517.30,66746.40,37770.90
+Sub-Saharan Africa,Cote d'Ivoire,Baby Food,Online,H,6/3/2016,258605134,6/12/2016,5861,255.28,159.42,1496196.08,934360.62,561835.46
+Sub-Saharan Africa,Guinea,Office Supplies,Offline,M,6/20/2012,904169070,6/24/2012,2575,651.21,524.96,1676865.75,1351772.00,325093.75
+Middle East and North Africa,Iraq,Office Supplies,Offline,L,1/23/2016,447982823,2/10/2016,6927,651.21,524.96,4510931.67,3636397.92,874533.75
+Central America and the Caribbean,Nicaragua,Meat,Offline,M,5/9/2014,321345221,6/15/2014,2047,421.89,364.69,863608.83,746520.43,117088.40
+Sub-Saharan Africa,Burkina Faso,Beverages,Online,H,9/13/2010,675867593,9/23/2010,3095,47.45,31.79,146857.75,98390.05,48467.70
+Europe,Albania,Beverages,Offline,H,4/28/2013,833473765,5/25/2013,2264,47.45,31.79,107426.80,71972.56,35454.24
+Middle East and North Africa,United Arab Emirates,Household,Online,L,5/6/2016,636400067,6/13/2016,3777,668.27,502.54,2524055.79,1898093.58,625962.21
+Sub-Saharan Africa,South Africa,Cosmetics,Offline,L,3/9/2011,897195327,4/11/2011,8890,437.20,263.33,3886708.00,2341003.70,1545704.30
+Middle East and North Africa,Saudi Arabia,Office Supplies,Online,M,1/10/2013,248720872,1/24/2013,888,651.21,524.96,578274.48,466164.48,112110.00
+Sub-Saharan Africa,Seychelles ,Meat,Online,L,8/20/2011,994150531,9/13/2011,89,421.89,364.69,37548.21,32457.41,5090.80
+Middle East and North Africa,Afghanistan,Baby Food,Offline,L,12/18/2012,556970632,1/2/2013,8842,255.28,159.42,2257185.76,1409591.64,847594.12
+Sub-Saharan Africa,Uganda,Beverages,Offline,M,9/9/2012,930980002,10/11/2012,6526,47.45,31.79,309658.70,207461.54,102197.16
+Sub-Saharan Africa,Mali,Clothes,Online,M,2/14/2015,130289971,3/16/2015,4553,109.28,35.84,497551.84,163179.52,334372.32
+Australia and Oceania,Fiji,Fruits,Online,M,4/8/2014,739324367,4/10/2014,1364,9.33,6.92,12726.12,9438.88,3287.24
+Middle East and North Africa,Turkey,Clothes,Online,M,10/12/2012,462819516,10/20/2012,7435,109.28,35.84,812496.80,266470.40,546026.40
+Asia,Thailand,Baby Food,Online,C,8/4/2010,675824248,9/15/2010,268,255.28,159.42,68415.04,42724.56,25690.48
+Sub-Saharan Africa,Madagascar,Baby Food,Offline,L,4/8/2016,573699891,4/21/2016,9402,255.28,159.42,2400142.56,1498866.84,901275.72
+Sub-Saharan Africa,Uganda,Office Supplies,Offline,C,12/8/2012,322120273,12/28/2012,1402,651.21,524.96,912996.42,735993.92,177002.50
+Australia and Oceania,Solomon Islands,Cosmetics,Online,H,1/31/2015,607071721,2/23/2015,4868,437.20,263.33,2128289.60,1281890.44,846399.16
+Australia and Oceania,Marshall Islands,Personal Care,Online,L,10/1/2011,384853065,10/21/2011,5429,81.73,56.67,443712.17,307661.43,136050.74
+Central America and the Caribbean,Guatemala,Personal Care,Offline,M,10/5/2015,932075631,10/29/2015,747,81.73,56.67,61052.31,42332.49,18719.82
+Middle East and North Africa,Iran,Fruits,Online,H,7/5/2014,895663249,8/10/2014,5514,9.33,6.92,51445.62,38156.88,13288.74
+Sub-Saharan Africa,Djibouti,Vegetables,Offline,C,8/3/2011,342852246,8/22/2011,6453,154.06,90.93,994149.18,586771.29,407377.89
+Sub-Saharan Africa,Guinea,Beverages,Online,M,6/14/2015,311191451,7/9/2015,7321,47.45,31.79,347381.45,232734.59,114646.86
+Central America and the Caribbean,Saint Vincent and the Grenadines,Meat,Online,L,11/20/2012,558542191,12/9/2012,3901,421.89,364.69,1645792.89,1422655.69,223137.20
+Middle East and North Africa,Algeria,Beverages,Offline,C,9/12/2010,913078296,9/18/2010,9013,47.45,31.79,427666.85,286523.27,141143.58
+Australia and Oceania,Australia,Household,Online,L,9/25/2016,823286092,9/27/2016,7505,668.27,502.54,5015366.35,3771562.70,1243803.65
+Asia,Bangladesh,Fruits,Online,L,6/1/2013,707964408,6/14/2013,1256,9.33,6.92,11718.48,8691.52,3026.96
+Europe,Denmark,Cosmetics,Offline,M,7/8/2014,606224572,7/15/2014,4177,437.20,263.33,1826184.40,1099929.41,726254.99
+Middle East and North Africa,Somalia,Clothes,Offline,M,12/10/2015,627490413,1/19/2016,7212,109.28,35.84,788127.36,258478.08,529649.28
+Australia and Oceania,Marshall Islands,Cosmetics,Online,L,8/31/2014,501498258,10/3/2014,3334,437.20,263.33,1457624.80,877942.22,579682.58
+Asia,North Korea,Snacks,Offline,M,7/4/2012,928296935,8/17/2012,2547,152.58,97.44,388621.26,248179.68,140441.58
+Asia,South Korea,Household,Online,C,5/10/2012,428247773,6/24/2012,6888,668.27,502.54,4603043.76,3461495.52,1141548.24
+Sub-Saharan Africa,Sao Tome and Principe,Snacks,Offline,M,5/20/2014,292024600,7/4/2014,5423,152.58,97.44,827441.34,528417.12,299024.22
+Middle East and North Africa,Oman,Fruits,Online,L,3/28/2012,530613744,4/14/2012,9253,9.33,6.92,86330.49,64030.76,22299.73
+Europe,Cyprus,Clothes,Online,H,1/6/2012,325314033,1/30/2012,6506,109.28,35.84,710975.68,233175.04,477800.64
+Middle East and North Africa,Qatar,Fruits,Online,C,4/11/2013,277736794,5/21/2013,7344,9.33,6.92,68519.52,50820.48,17699.04
+Europe,Kosovo,Meat,Offline,M,11/19/2012,159805858,12/17/2012,8959,421.89,364.69,3779712.51,3267257.71,512454.80
+Asia,Vietnam,Beverages,Online,L,4/29/2016,263757550,5/12/2016,575,47.45,31.79,27283.75,18279.25,9004.50
+Middle East and North Africa,Pakistan,Office Supplies,Offline,L,3/24/2011,952140700,4/5/2011,8447,651.21,524.96,5500770.87,4434337.12,1066433.75
+Middle East and North Africa,United Arab Emirates,Cosmetics,Offline,L,7/25/2016,407816636,7/26/2016,860,437.20,263.33,375992.00,226463.80,149528.20
+Middle East and North Africa,Turkey,Snacks,Online,H,9/27/2010,483959186,11/14/2010,3133,152.58,97.44,478033.14,305279.52,172753.62
+Asia,Thailand,Personal Care,Online,C,1/25/2011,854054677,2/23/2011,2613,81.73,56.67,213560.49,148078.71,65481.78
+Middle East and North Africa,Bahrain,Snacks,Online,C,1/3/2017,361901938,1/18/2017,3681,152.58,97.44,561646.98,358676.64,202970.34
+North America,United States of America,Household,Offline,H,12/9/2013,171612298,1/14/2014,2747,668.27,502.54,1835737.69,1380477.38,455260.31
+Sub-Saharan Africa,Sierra Leone,Cosmetics,Offline,L,10/21/2014,617609584,11/1/2014,3255,437.20,263.33,1423086.00,857139.15,565946.85
+Central America and the Caribbean,Costa Rica,Office Supplies,Online,M,11/24/2010,754630124,12/16/2010,678,651.21,524.96,441520.38,355922.88,85597.50
+North America,Mexico,Office Supplies,Offline,C,7/3/2013,607722747,8/14/2013,7521,651.21,524.96,4897750.41,3948224.16,949526.25
+Europe,Switzerland,Snacks,Online,H,4/6/2012,722248780,4/8/2012,8319,152.58,97.44,1269313.02,810603.36,458709.66
+Central America and the Caribbean,Honduras,Clothes,Online,C,10/20/2016,813882052,11/16/2016,4640,109.28,35.84,507059.20,166297.60,340761.60
+Sub-Saharan Africa,Togo,Personal Care,Online,H,2/9/2015,218608891,2/10/2015,84,81.73,56.67,6865.32,4760.28,2105.04
+Sub-Saharan Africa,Guinea,Fruits,Offline,C,2/24/2015,142728126,4/14/2015,5279,9.33,6.92,49253.07,36530.68,12722.39
+North America,Mexico,Baby Food,Online,C,10/28/2010,512851083,11/4/2010,2887,255.28,159.42,736993.36,460245.54,276747.82
+Australia and Oceania,Australia,Household,Offline,H,1/9/2016,425901591,1/11/2016,2600,668.27,502.54,1737502.00,1306604.00,430898.00
+Europe,Spain,Vegetables,Online,H,6/1/2015,399115979,6/24/2015,6142,154.06,90.93,946236.52,558492.06,387744.46
+Middle East and North Africa,Tunisia ,Personal Care,Online,L,8/29/2013,120043075,10/13/2013,2268,81.73,56.67,185363.64,128527.56,56836.08
+Asia,South Korea,Office Supplies,Offline,L,6/26/2016,696544206,7/5/2016,1764,651.21,524.96,1148734.44,926029.44,222705.00
+Middle East and North Africa,Iraq,Cosmetics,Offline,M,10/3/2011,606793200,11/18/2011,2447,437.20,263.33,1069828.40,644368.51,425459.89
+Sub-Saharan Africa,Kenya,Beverages,Online,M,2/9/2011,649276387,3/26/2011,4166,47.45,31.79,197676.70,132437.14,65239.56
+Europe,Kosovo,Household,Offline,M,11/25/2015,792792594,1/2/2016,3801,668.27,502.54,2540094.27,1910154.54,629939.73
+Europe,Portugal,Cosmetics,Offline,C,5/24/2013,626453149,6/10/2013,263,437.20,263.33,114983.60,69255.79,45727.81
+Sub-Saharan Africa,Mali,Personal Care,Offline,M,11/10/2010,709681880,11/25/2010,9494,81.73,56.67,775944.62,538024.98,237919.64
+Middle East and North Africa,Algeria,Meat,Online,C,8/16/2016,322215116,9/11/2016,9468,421.89,364.69,3994454.52,3452884.92,541569.60
+Central America and the Caribbean,Grenada,Household,Offline,C,8/2/2013,614101684,9/6/2013,5190,668.27,502.54,3468321.30,2608182.60,860138.70
+Middle East and North Africa,Algeria,Personal Care,Online,H,12/26/2015,555702912,2/1/2016,3696,81.73,56.67,302074.08,209452.32,92621.76
+Middle East and North Africa,Lebanon,Cereal,Offline,M,8/17/2012,987692630,9/3/2012,9053,205.70,117.11,1862202.10,1060196.83,802005.27
+Asia,Cambodia,Fruits,Online,C,2/10/2016,571057164,3/5/2016,7360,9.33,6.92,68668.80,50931.20,17737.60
+Europe,Armenia,Snacks,Offline,L,7/31/2013,737095344,9/13/2013,1747,152.58,97.44,266557.26,170227.68,96329.58
+North America,United States of America,Beverages,Online,H,12/21/2015,737418496,1/17/2016,7375,47.45,31.79,349943.75,234451.25,115492.50
+Sub-Saharan Africa,Guinea,Clothes,Online,M,5/8/2016,793950450,5/18/2016,6436,109.28,35.84,703326.08,230666.24,472659.84
+Sub-Saharan Africa,Liberia,Personal Care,Online,H,6/4/2016,748927533,7/20/2016,3155,81.73,56.67,257858.15,178793.85,79064.30
+Sub-Saharan Africa,Rwanda,Office Supplies,Online,M,3/5/2015,514898574,3/28/2015,8785,651.21,524.96,5720879.85,4611773.60,1109106.25
+Asia,North Korea,Fruits,Offline,H,8/25/2012,524724900,10/9/2012,6613,9.33,6.92,61699.29,45761.96,15937.33
+Australia and Oceania,Australia,Baby Food,Online,L,9/30/2013,381580340,10/2/2013,6957,255.28,159.42,1775982.96,1109084.94,666898.02
+Sub-Saharan Africa,South Africa,Meat,Online,C,11/10/2016,208951222,11/10/2016,2165,421.89,364.69,913391.85,789553.85,123838.00
+Sub-Saharan Africa,Cameroon,Personal Care,Offline,C,1/31/2010,200636374,3/3/2010,1617,81.73,56.67,132157.41,91635.39,40522.02
+Asia,Kyrgyzstan,Snacks,Online,H,11/16/2012,170747125,1/5/2013,6723,152.58,97.44,1025795.34,655089.12,370706.22
+Asia,Kyrgyzstan,Beverages,Offline,L,9/4/2011,903707301,9/5/2011,5928,47.45,31.79,281283.60,188451.12,92832.48
+Sub-Saharan Africa,Benin,Vegetables,Offline,C,9/14/2016,104253232,10/29/2016,9703,154.06,90.93,1494844.18,882293.79,612550.39
+Middle East and North Africa,Pakistan,Personal Care,Offline,C,9/30/2012,947433745,10/23/2012,5554,81.73,56.67,453928.42,314745.18,139183.24
+Australia and Oceania,Tuvalu,Baby Food,Offline,C,12/13/2015,828610169,1/30/2016,3018,255.28,159.42,770435.04,481129.56,289305.48
+Central America and the Caribbean,Grenada,Snacks,Offline,C,1/1/2017,813456332,1/16/2017,8660,152.58,97.44,1321342.80,843830.40,477512.40
+Central America and the Caribbean,Cuba,Vegetables,Online,L,4/2/2015,687958562,5/8/2015,1081,154.06,90.93,166538.86,98295.33,68243.53
+Sub-Saharan Africa,Seychelles ,Household,Offline,L,11/18/2014,308415687,11/27/2014,5910,668.27,502.54,3949475.70,2970011.40,979464.30
+Middle East and North Africa,Syria,Snacks,Offline,C,7/30/2013,951439034,9/16/2013,808,152.58,97.44,123284.64,78731.52,44553.12
+Australia and Oceania,Kiribati,Snacks,Online,H,11/14/2013,363952434,11/15/2013,468,152.58,97.44,71407.44,45601.92,25805.52
+Asia,India,Personal Care,Online,L,10/14/2011,413192212,11/17/2011,1612,81.73,56.67,131748.76,91352.04,40396.72
+Asia,Bangladesh,Baby Food,Online,L,10/10/2015,336707198,11/27/2015,7997,255.28,159.42,2041474.16,1274881.74,766592.42
+Middle East and North Africa,Qatar,Personal Care,Online,L,8/17/2012,792358720,8/24/2012,5408,81.73,56.67,441995.84,306471.36,135524.48
+Europe,San Marino,Fruits,Offline,L,9/18/2016,708320605,10/5/2016,6662,9.33,6.92,62156.46,46101.04,16055.42
+Europe,Lithuania,Office Supplies,Offline,M,3/5/2013,433079183,4/19/2013,6609,651.21,524.96,4303846.89,3469460.64,834386.25
+Asia,North Korea,Clothes,Offline,C,9/18/2014,385433280,11/1/2014,7128,109.28,35.84,778947.84,255467.52,523480.32
+Europe,Georgia,Personal Care,Offline,L,5/22/2012,604494225,6/25/2012,2129,81.73,56.67,174003.17,120650.43,53352.74
+Central America and the Caribbean,Saint Kitts and Nevis ,Fruits,Online,M,4/3/2017,299685847,4/24/2017,2557,9.33,6.92,23856.81,17694.44,6162.37
+Asia,Tajikistan,Cereal,Online,L,2/18/2011,100744473,3/16/2011,1383,205.70,117.11,284483.10,161963.13,122519.97
+Europe,Macedonia,Fruits,Online,M,12/30/2010,707718932,1/6/2011,8614,9.33,6.92,80368.62,59608.88,20759.74
+Asia,Cambodia,Beverages,Offline,L,2/26/2012,640970551,4/2/2012,6285,47.45,31.79,298223.25,199800.15,98423.10
+Sub-Saharan Africa,Mauritania,Cereal,Online,H,10/12/2014,291173160,11/2/2014,3463,205.70,117.11,712339.10,405551.93,306787.17
+Central America and the Caribbean,Dominica,Household,Offline,M,7/11/2012,569313085,8/18/2012,1248,668.27,502.54,834000.96,627169.92,206831.04
+Europe,Sweden,Household,Offline,C,6/24/2011,656689155,8/9/2011,7769,668.27,502.54,5191789.63,3904233.26,1287556.37
+Central America and the Caribbean,Panama,Snacks,Online,C,3/19/2011,254912698,4/8/2011,3187,152.58,97.44,486272.46,310541.28,175731.18
+Europe,Macedonia,Beverages,Offline,M,2/25/2016,935907542,3/21/2016,4695,47.45,31.79,222777.75,149254.05,73523.70
+Middle East and North Africa,Lebanon,Meat,Offline,C,8/22/2016,291910016,9/27/2016,1515,421.89,364.69,639163.35,552505.35,86658.00
+Sub-Saharan Africa,Cote d'Ivoire,Fruits,Online,C,6/15/2015,485468947,7/1/2015,9905,9.33,6.92,92413.65,68542.60,23871.05
+Central America and the Caribbean,Grenada,Personal Care,Offline,H,6/3/2016,599445664,7/19/2016,8148,81.73,56.67,665936.04,461747.16,204188.88
+Sub-Saharan Africa,Senegal,Baby Food,Offline,C,2/1/2013,687013995,3/13/2013,1563,255.28,159.42,399002.64,249173.46,149829.18
+Europe,Ireland,Household,Offline,C,3/14/2015,421660268,4/11/2015,7498,668.27,502.54,5010688.46,3768044.92,1242643.54
+Europe,San Marino,Cosmetics,Offline,C,8/22/2014,447183310,9/19/2014,334,437.20,263.33,146024.80,87952.22,58072.58
+Europe,Estonia,Vegetables,Offline,L,12/7/2011,127694451,12/27/2011,6481,154.06,90.93,998462.86,589317.33,409145.53
+Europe,Vatican City,Meat,Offline,M,6/13/2012,697617518,7/7/2012,9381,421.89,364.69,3957750.09,3421156.89,536593.20
+Europe,United Kingdom,Personal Care,Offline,L,1/22/2015,311688840,2/14/2015,4509,81.73,56.67,368520.57,255525.03,112995.54
+Middle East and North Africa,Iran,Household,Offline,M,11/24/2015,794957244,12/31/2015,4369,668.27,502.54,2919671.63,2195597.26,724074.37
+Middle East and North Africa,Saudi Arabia,Vegetables,Offline,H,3/6/2012,892784059,3/6/2012,3497,154.06,90.93,538747.82,317982.21,220765.61
+Sub-Saharan Africa,Rwanda,Clothes,Online,L,7/13/2013,320843112,8/18/2013,3462,109.28,35.84,378327.36,124078.08,254249.28
+Asia,Indonesia,Vegetables,Offline,H,7/6/2015,215120732,8/3/2015,7860,154.06,90.93,1210911.60,714709.80,496201.80
+Middle East and North Africa,Oman,Beverages,Offline,M,12/12/2010,881915748,12/14/2010,7323,47.45,31.79,347476.35,232798.17,114678.18
+Sub-Saharan Africa,Comoros,Beverages,Offline,H,6/13/2016,447839486,7/28/2016,4511,47.45,31.79,214046.95,143404.69,70642.26
+Middle East and North Africa,Oman,Beverages,Offline,C,8/15/2015,709815776,9/16/2015,9117,47.45,31.79,432601.65,289829.43,142772.22
+Europe,Cyprus,Cosmetics,Offline,M,11/6/2015,385080945,11/7/2015,2864,437.20,263.33,1252140.80,754177.12,497963.68
+Asia,Cambodia,Cosmetics,Online,L,3/21/2014,961183822,4/21/2014,4507,437.20,263.33,1970460.40,1186828.31,783632.09
+Middle East and North Africa,Egypt,Cereal,Offline,M,6/17/2016,845985734,6/28/2016,4833,205.70,117.11,994148.10,565992.63,428155.47
+Asia,Kazakhstan,Cosmetics,Offline,C,6/8/2010,317660510,6/29/2010,1659,437.20,263.33,725314.80,436864.47,288450.33
+Sub-Saharan Africa,Madagascar,Vegetables,Online,L,5/11/2015,174694478,5/11/2015,4833,154.06,90.93,744571.98,439464.69,305107.29
+Australia and Oceania,Samoa ,Clothes,Offline,M,6/8/2017,385886466,7/10/2017,1235,109.28,35.84,134960.80,44262.40,90698.40
+Asia,Brunei,Cosmetics,Offline,C,7/4/2011,540347802,7/11/2011,9777,437.20,263.33,4274504.40,2574577.41,1699926.99
+Sub-Saharan Africa,Djibouti,Clothes,Online,H,5/29/2012,297502315,6/8/2012,6401,109.28,35.84,699501.28,229411.84,470089.44
+Sub-Saharan Africa,Seychelles ,Beverages,Offline,M,5/1/2013,737086331,6/4/2013,9080,47.45,31.79,430846.00,288653.20,142192.80
+Europe,Spain,Household,Offline,M,4/23/2012,309148681,5/5/2012,2819,668.27,502.54,1883853.13,1416660.26,467192.87
+Central America and the Caribbean,Saint Lucia,Office Supplies,Offline,L,1/7/2016,684050691,2/18/2016,4655,651.21,524.96,3031382.55,2443688.80,587693.75
+Sub-Saharan Africa,Cape Verde,Snacks,Online,C,4/6/2013,902466189,4/13/2013,8655,152.58,97.44,1320579.90,843343.20,477236.70
+Australia and Oceania,Australia,Vegetables,Offline,H,8/19/2016,525381505,8/27/2016,917,154.06,90.93,141273.02,83382.81,57890.21
+Australia and Oceania,Vanuatu,Vegetables,Online,H,4/13/2013,984095466,5/12/2013,4572,154.06,90.93,704362.32,415731.96,288630.36
+Europe,Serbia,Baby Food,Offline,L,2/21/2014,630219399,3/14/2014,4780,255.28,159.42,1220238.40,762027.60,458210.80
+Europe,Denmark,Snacks,Online,H,4/13/2012,585677134,5/4/2012,3734,152.58,97.44,569733.72,363840.96,205892.76
+Europe,Italy,Household,Online,C,12/23/2016,692704999,1/24/2017,5657,668.27,502.54,3780403.39,2842868.78,937534.61
+Sub-Saharan Africa,South Africa,Snacks,Offline,H,1/25/2012,863851821,3/7/2012,1805,152.58,97.44,275406.90,175879.20,99527.70
+Australia and Oceania,East Timor,Cosmetics,Offline,M,9/28/2012,631978929,10/1/2012,5464,437.20,263.33,2388860.80,1438835.12,950025.68
+Asia,North Korea,Clothes,Online,C,5/1/2016,500260150,5/10/2016,6950,109.28,35.84,759496.00,249088.00,510408.00
+Central America and the Caribbean,Trinidad and Tobago,Cosmetics,Online,M,8/27/2013,592181813,9/9/2013,8613,437.20,263.33,3765603.60,2268061.29,1497542.31
+North America,Greenland,Meat,Online,C,7/12/2015,201542747,7/18/2015,9832,421.89,364.69,4148022.48,3585632.08,562390.40
+Europe,Iceland,Cosmetics,Online,M,2/9/2011,942454278,3/29/2011,2019,437.20,263.33,882706.80,531663.27,351043.53
+Middle East and North Africa,Turkey,Beverages,Online,H,2/17/2017,899340236,3/18/2017,3616,47.45,31.79,171579.20,114952.64,56626.56
+Asia,Vietnam,Cereal,Online,C,7/12/2013,476936948,7/20/2013,5096,205.70,117.11,1048247.20,596792.56,451454.64
+Europe,Kosovo,Office Supplies,Offline,H,5/19/2015,150293242,6/21/2015,3965,651.21,524.96,2582047.65,2081466.40,500581.25
+Middle East and North Africa,Tunisia ,Cereal,Online,L,2/6/2016,914770448,2/16/2016,9759,205.70,117.11,2007426.30,1142876.49,864549.81
+Europe,Germany,Office Supplies,Offline,H,12/19/2013,236042392,1/26/2014,9044,651.21,524.96,5889543.24,4747738.24,1141805.00
+Middle East and North Africa,Tunisia ,Household,Offline,H,11/22/2015,600095403,12/19/2015,420,668.27,502.54,280673.40,211066.80,69606.60
+Sub-Saharan Africa,Nigeria,Beverages,Online,C,11/30/2010,963228309,12/27/2010,9516,47.45,31.79,451534.20,302513.64,149020.56
+Australia and Oceania,Marshall Islands,Fruits,Offline,L,11/13/2011,802052438,1/2/2012,3995,9.33,6.92,37273.35,27645.40,9627.95
+Sub-Saharan Africa,Ghana,Household,Offline,L,9/14/2013,563491618,10/29/2013,8547,668.27,502.54,5711703.69,4295209.38,1416494.31
+Europe,Italy,Baby Food,Offline,L,6/15/2012,314782178,7/12/2012,9896,255.28,159.42,2526250.88,1577620.32,948630.56
+Europe,Belgium,Cosmetics,Offline,M,7/27/2016,193472945,9/13/2016,1799,437.20,263.33,786522.80,473730.67,312792.13
+Sub-Saharan Africa,South Africa,Snacks,Online,H,11/2/2012,857425248,11/25/2012,40,152.58,97.44,6103.20,3897.60,2205.60
+Sub-Saharan Africa,South Africa,Clothes,Online,C,8/20/2015,334812915,8/26/2015,7437,109.28,35.84,812715.36,266542.08,546173.28
+Australia and Oceania,Nauru,Office Supplies,Offline,H,2/1/2010,774122273,2/15/2010,8838,651.21,524.96,5755393.98,4639596.48,1115797.50
+Middle East and North Africa,Bahrain,Office Supplies,Offline,L,6/27/2016,794152152,6/29/2016,6124,651.21,524.96,3988010.04,3214855.04,773155.00
+Europe,Monaco,Cosmetics,Offline,H,9/27/2010,434013879,11/5/2010,3206,437.20,263.33,1401663.20,844235.98,557427.22
+Asia,Nepal,Baby Food,Online,L,6/21/2011,703131282,7/22/2011,1026,255.28,159.42,261917.28,163564.92,98352.36
+Europe,Greece,Cereal,Online,L,8/26/2015,431240689,10/13/2015,2558,205.70,117.11,526180.60,299567.38,226613.22
+Sub-Saharan Africa,Rwanda,Beverages,Online,M,7/13/2017,318390929,8/31/2017,7806,47.45,31.79,370394.70,248152.74,122241.96
+Asia,Japan,Vegetables,Online,C,6/4/2012,684943330,6/8/2012,8807,154.06,90.93,1356806.42,800820.51,555985.91
+Sub-Saharan Africa,Nigeria,Meat,Offline,M,8/26/2015,121571719,9/21/2015,4628,421.89,364.69,1952506.92,1687785.32,264721.60
+Asia,Cambodia,Vegetables,Offline,M,4/14/2013,439262425,5/20/2013,6368,154.06,90.93,981054.08,579042.24,402011.84
+Sub-Saharan Africa,Gabon,Clothes,Online,H,6/2/2011,819314277,7/17/2011,2156,109.28,35.84,235607.68,77271.04,158336.64
+Asia,Philippines,Personal Care,Online,C,3/11/2017,963338601,4/9/2017,2154,81.73,56.67,176046.42,122067.18,53979.24
+Europe,Switzerland,Meat,Offline,L,4/26/2012,643259227,4/26/2012,3555,421.89,364.69,1499818.95,1296472.95,203346.00
+Europe,Czech Republic,Cosmetics,Online,H,6/6/2017,151312482,7/12/2017,5581,437.20,263.33,2440013.20,1469644.73,970368.47
+Europe,Austria,Fruits,Online,M,7/31/2012,750047194,9/18/2012,4487,9.33,6.92,41863.71,31050.04,10813.67
+Asia,Bhutan,Cereal,Online,C,10/2/2016,622324693,10/21/2016,8561,205.70,117.11,1760997.70,1002578.71,758418.99
+Europe,Switzerland,Fruits,Offline,L,11/29/2015,721318805,12/9/2015,3118,9.33,6.92,29090.94,21576.56,7514.38
+Sub-Saharan Africa,Cape Verde,Baby Food,Offline,H,3/25/2012,720515859,3/29/2012,5509,255.28,159.42,1406337.52,878244.78,528092.74
+Sub-Saharan Africa,Senegal,Personal Care,Online,M,9/29/2012,363714683,10/17/2012,112,81.73,56.67,9153.76,6347.04,2806.72
+Middle East and North Africa,Israel,Fruits,Offline,M,5/26/2010,815026605,6/27/2010,3339,9.33,6.92,31152.87,23105.88,8046.99
+Middle East and North Africa,Tunisia ,Baby Food,Online,L,7/27/2010,608875453,8/11/2010,8632,255.28,159.42,2203576.96,1376113.44,827463.52
+Europe,Vatican City,Beverages,Offline,H,2/13/2012,599997556,2/14/2012,1465,47.45,31.79,69514.25,46572.35,22941.90
+Sub-Saharan Africa,Sierra Leone,Cereal,Offline,M,3/12/2011,813441741,3/22/2011,4342,205.70,117.11,893149.40,508491.62,384657.78
+Asia,China,Cereal,Online,L,7/26/2012,894569337,8/22/2012,1801,205.70,117.11,370465.70,210915.11,159550.59
+Asia,Uzbekistan,Baby Food,Offline,M,9/25/2010,559054172,10/17/2010,5408,255.28,159.42,1380554.24,862143.36,518410.88
+Middle East and North Africa,Qatar,Fruits,Online,L,5/22/2016,942882573,6/25/2016,8761,9.33,6.92,81740.13,60626.12,21114.01
+Sub-Saharan Africa,Cote d'Ivoire,Clothes,Online,M,10/15/2014,552353370,11/18/2014,2491,109.28,35.84,272216.48,89277.44,182939.04
+Australia and Oceania,Marshall Islands,Beverages,Offline,L,12/22/2014,214077889,1/1/2015,9260,47.45,31.79,439387.00,294375.40,145011.60
+Central America and the Caribbean,Costa Rica,Fruits,Offline,H,9/11/2015,824979960,10/20/2015,8758,9.33,6.92,81712.14,60605.36,21106.78
+Middle East and North Africa,Morocco,Cosmetics,Online,H,10/3/2016,202295911,10/11/2016,2710,437.20,263.33,1184812.00,713624.30,471187.70
+Sub-Saharan Africa,Rwanda,Baby Food,Offline,H,4/2/2015,733574569,5/18/2015,9871,255.28,159.42,2519868.88,1573634.82,946234.06
+Europe,Estonia,Beverages,Online,M,11/28/2016,826677262,1/9/2017,1027,47.45,31.79,48731.15,32648.33,16082.82
+Australia and Oceania,Palau,Fruits,Online,L,2/28/2017,759777820,3/23/2017,3996,9.33,6.92,37282.68,27652.32,9630.36
+Sub-Saharan Africa,South Sudan,Beverages,Online,H,7/5/2012,431362569,8/9/2012,8625,47.45,31.79,409256.25,274188.75,135067.50
+Central America and the Caribbean,Honduras,Baby Food,Offline,L,11/15/2011,710230338,11/19/2011,1795,255.28,159.42,458227.60,286158.90,172068.70
+Central America and the Caribbean,Jamaica,Office Supplies,Offline,C,2/2/2010,285492455,3/1/2010,2417,651.21,524.96,1573974.57,1268828.32,305146.25
+Sub-Saharan Africa,Democratic Republic of the Congo,Baby Food,Online,H,6/8/2014,616572749,7/12/2014,6433,255.28,159.42,1642216.24,1025548.86,616667.38
+Central America and the Caribbean,Panama,Personal Care,Offline,M,7/6/2010,983207547,7/25/2010,1817,81.73,56.67,148503.41,102969.39,45534.02
+Europe,Poland,Beverages,Offline,H,7/5/2011,735445678,7/22/2011,3574,47.45,31.79,169586.30,113617.46,55968.84
+Middle East and North Africa,Lebanon,Office Supplies,Offline,M,7/11/2016,643648469,8/5/2016,8740,651.21,524.96,5691575.40,4588150.40,1103425.00
+Middle East and North Africa,Tunisia ,Beverages,Online,L,5/15/2014,648489749,6/11/2014,1382,47.45,31.79,65575.90,43933.78,21642.12
+Sub-Saharan Africa,Sudan,Personal Care,Online,C,1/21/2010,310955846,2/10/2010,7600,81.73,56.67,621148.00,430692.00,190456.00
+Sub-Saharan Africa,Guinea-Bissau,Baby Food,Online,C,6/16/2013,162345588,7/29/2013,522,255.28,159.42,133256.16,83217.24,50038.92
+Europe,San Marino,Vegetables,Offline,L,10/14/2012,354270303,11/27/2012,5310,154.06,90.93,818058.60,482838.30,335220.30
+Australia and Oceania,Nauru,Baby Food,Offline,C,4/4/2016,208653819,4/15/2016,4157,255.28,159.42,1061198.96,662708.94,398490.02
+Asia,Japan,Baby Food,Online,C,6/6/2010,467732465,7/22/2010,1285,255.28,159.42,328034.80,204854.70,123180.10
+Australia and Oceania,Palau,Meat,Offline,M,1/1/2017,144055068,2/8/2017,7951,421.89,364.69,3354447.39,2899650.19,454797.20
+Sub-Saharan Africa,Seychelles ,Vegetables,Online,L,4/23/2013,570482957,6/3/2013,7439,154.06,90.93,1146052.34,676428.27,469624.07
+Middle East and North Africa,Somalia,Household,Online,M,10/27/2011,450189960,12/11/2011,68,668.27,502.54,45442.36,34172.72,11269.64
+Europe,Spain,Cereal,Offline,H,12/4/2010,806662404,12/7/2010,8186,205.70,117.11,1683860.20,958662.46,725197.74
+Europe,Netherlands,Personal Care,Offline,C,11/13/2013,933699119,11/24/2013,1173,81.73,56.67,95869.29,66473.91,29395.38
+Sub-Saharan Africa,Gabon,Personal Care,Offline,C,5/20/2017,645411431,6/12/2017,440,81.73,56.67,35961.20,24934.80,11026.40
+Europe,Switzerland,Baby Food,Offline,C,6/27/2015,726223170,7/31/2015,4429,255.28,159.42,1130635.12,706071.18,424563.94
+Sub-Saharan Africa,Burkina Faso,Cereal,Online,H,10/30/2010,680870664,10/31/2010,3615,205.70,117.11,743605.50,423352.65,320252.85
+Central America and the Caribbean,Haiti,Meat,Offline,L,11/28/2010,984402740,12/18/2010,5501,421.89,364.69,2320816.89,2006159.69,314657.20
+Central America and the Caribbean,Belize,Office Supplies,Online,C,9/22/2016,832180726,9/22/2016,9625,651.21,524.96,6267896.25,5052740.00,1215156.25
+Middle East and North Africa,Iraq,Fruits,Online,L,5/29/2011,389878451,7/7/2011,2553,9.33,6.92,23819.49,17666.76,6152.73
+Australia and Oceania,Solomon Islands,Cosmetics,Online,M,1/2/2017,343482244,2/18/2017,2884,437.20,263.33,1260884.80,759443.72,501441.08
+Sub-Saharan Africa,Sudan,Office Supplies,Offline,M,12/29/2014,549290931,1/20/2015,6248,651.21,524.96,4068760.08,3279950.08,788810.00
+Sub-Saharan Africa,Chad,Beverages,Offline,C,8/18/2010,483915841,9/16/2010,306,47.45,31.79,14519.70,9727.74,4791.96
+Central America and the Caribbean,Saint Vincent and the Grenadines,Household,Offline,M,1/5/2014,594280803,1/21/2014,9751,668.27,502.54,6516300.77,4900267.54,1616033.23
+Sub-Saharan Africa,Mali,Personal Care,Online,H,8/7/2013,947622144,9/24/2013,1305,81.73,56.67,106657.65,73954.35,32703.30
+Central America and the Caribbean,Trinidad and Tobago,Household,Online,M,4/7/2010,781488692,5/3/2010,8725,668.27,502.54,5830655.75,4384661.50,1445994.25
+Central America and the Caribbean,Costa Rica,Vegetables,Offline,C,7/11/2013,753741776,7/28/2013,7796,154.06,90.93,1201051.76,708890.28,492161.48
+Europe,Czech Republic,Meat,Online,M,1/9/2015,692555224,2/1/2015,1336,421.89,364.69,563645.04,487225.84,76419.20
+Central America and the Caribbean,Barbados,Personal Care,Online,M,1/18/2015,946415364,1/30/2015,4193,81.73,56.67,342693.89,237617.31,105076.58
+Europe,Estonia,Vegetables,Online,L,2/28/2011,134121024,4/8/2011,8246,154.06,90.93,1270378.76,749808.78,520569.98
+Central America and the Caribbean,Cuba,Beverages,Online,C,2/18/2017,994783532,3/12/2017,7408,47.45,31.79,351509.60,235500.32,116009.28
+Central America and the Caribbean,Honduras,Beverages,Online,M,9/23/2013,937826716,10/11/2013,2621,47.45,31.79,124366.45,83321.59,41044.86
+Sub-Saharan Africa,Benin,Office Supplies,Online,M,1/24/2013,592986905,3/13/2013,6858,651.21,524.96,4465998.18,3600175.68,865822.50
+Europe,Estonia,Clothes,Offline,C,12/18/2016,660312926,1/5/2017,123,109.28,35.84,13441.44,4408.32,9033.12
+Asia,Thailand,Beverages,Online,H,3/3/2013,560166108,3/5/2013,4454,47.45,31.79,211342.30,141592.66,69749.64
+Australia and Oceania,East Timor,Cereal,Offline,L,12/28/2016,683220279,1/6/2017,8918,205.70,117.11,1834432.60,1044386.98,790045.62
+Europe,Ukraine,Cosmetics,Online,C,7/8/2014,140461766,7/20/2014,4613,437.20,263.33,2016803.60,1214741.29,802062.31
+Asia,Kyrgyzstan,Baby Food,Online,M,10/30/2011,813189399,11/22/2011,9669,255.28,159.42,2468302.32,1541431.98,926870.34
+Central America and the Caribbean,Jamaica,Meat,Online,M,1/27/2016,603014504,2/11/2016,4247,421.89,364.69,1791766.83,1548838.43,242928.40
+Sub-Saharan Africa,Angola,Vegetables,Online,H,7/12/2016,181860911,7/15/2016,5540,154.06,90.93,853492.40,503752.20,349740.20
+Europe,Ukraine,Cereal,Offline,C,2/13/2011,741964948,2/26/2011,2771,205.70,117.11,569994.70,324511.81,245482.89
+Sub-Saharan Africa,Zambia,Meat,Online,H,3/8/2010,845875442,3/17/2010,2195,421.89,364.69,926048.55,800494.55,125554.00
+Europe,San Marino,Snacks,Offline,C,7/22/2017,476453721,8/10/2017,2099,152.58,97.44,320265.42,204526.56,115738.86
+Middle East and North Africa,Qatar,Snacks,Online,H,8/20/2011,586873614,8/29/2011,7799,152.58,97.44,1189971.42,759934.56,430036.86
+Asia,Malaysia,Meat,Online,L,4/23/2017,850621449,5/2/2017,6644,421.89,364.69,2803037.16,2423000.36,380036.80
+Europe,Belgium,Fruits,Online,M,4/28/2011,111496055,6/4/2011,3015,9.33,6.92,28129.95,20863.80,7266.15
+Asia,Nepal,Vegetables,Offline,L,11/29/2016,433608758,12/21/2016,3322,154.06,90.93,511787.32,302069.46,209717.86
+Asia,Japan,Clothes,Online,H,9/25/2016,351383388,10/30/2016,1008,109.28,35.84,110154.24,36126.72,74027.52
+Central America and the Caribbean,El Salvador,Meat,Offline,H,3/24/2017,719556272,4/1/2017,1546,421.89,364.69,652241.94,563810.74,88431.20
+Central America and the Caribbean,Jamaica,Household,Offline,L,7/14/2014,663176238,7/26/2014,7441,668.27,502.54,4972597.07,3739400.14,1233196.93
+Sub-Saharan Africa,South Sudan,Baby Food,Offline,M,6/6/2013,727604615,7/7/2013,3229,255.28,159.42,824299.12,514767.18,309531.94
+Europe,Slovakia,Vegetables,Online,L,12/25/2015,628515231,2/1/2016,479,154.06,90.93,73794.74,43555.47,30239.27
+Europe,Slovakia,Office Supplies,Offline,M,3/2/2010,601894414,3/19/2010,2787,651.21,524.96,1814922.27,1463063.52,351858.75
+Europe,Bosnia and Herzegovina,Snacks,Offline,L,7/14/2011,954040992,8/27/2011,785,152.58,97.44,119775.30,76490.40,43284.90
+Middle East and North Africa,Saudi Arabia,Cosmetics,Offline,M,12/22/2013,711566293,12/26/2013,7133,437.20,263.33,3118547.60,1878332.89,1240214.71
+Australia and Oceania,Tuvalu,Beverages,Offline,M,3/28/2016,771394145,4/22/2016,1524,47.45,31.79,72313.80,48447.96,23865.84
+Middle East and North Africa,Bahrain,Vegetables,Offline,M,7/25/2010,750760877,9/7/2010,5682,154.06,90.93,875368.92,516664.26,358704.66
+Sub-Saharan Africa,Djibouti,Baby Food,Offline,L,10/3/2016,337215316,11/11/2016,8360,255.28,159.42,2134140.80,1332751.20,801389.60
+Central America and the Caribbean,Costa Rica,Baby Food,Offline,L,4/5/2010,638618791,5/25/2010,347,255.28,159.42,88582.16,55318.74,33263.42
+Australia and Oceania,Nauru,Meat,Online,L,10/15/2016,133145129,10/19/2016,9457,421.89,364.69,3989813.73,3448873.33,540940.40
+Asia,Cambodia,Household,Offline,C,2/18/2010,519280660,4/6/2010,5542,668.27,502.54,3703552.34,2785076.68,918475.66
+Europe,Czech Republic,Office Supplies,Online,M,5/9/2014,865824210,5/14/2014,5479,651.21,524.96,3567979.59,2876255.84,691723.75
+Europe,Belgium,Clothes,Offline,M,9/20/2016,761887109,10/14/2016,8181,109.28,35.84,894019.68,293207.04,600812.64
+Sub-Saharan Africa,Guinea-Bissau,Meat,Offline,M,12/6/2016,766893184,1/10/2017,9590,421.89,364.69,4045925.10,3497377.10,548548.00
+Europe,Romania,Office Supplies,Online,L,9/27/2015,160578763,10/30/2015,7679,651.21,524.96,5000641.59,4031167.84,969473.75
+Europe,Serbia,Vegetables,Offline,M,3/8/2011,992992675,3/9/2011,7454,154.06,90.93,1148363.24,677792.22,470571.02
+Sub-Saharan Africa,Mauritius ,Household,Online,M,7/4/2017,434496247,8/10/2017,5950,668.27,502.54,3976206.50,2990113.00,986093.50
+Sub-Saharan Africa,Sierra Leone,Cereal,Online,L,12/13/2015,225763309,1/6/2016,7235,205.70,117.11,1488239.50,847290.85,640948.65
+Sub-Saharan Africa,Zambia,Baby Food,Offline,C,7/11/2011,827780187,7/22/2011,7407,255.28,159.42,1890858.96,1180823.94,710035.02
+Central America and the Caribbean,Haiti,Snacks,Online,C,2/8/2014,971845710,3/15/2014,9597,152.58,97.44,1464310.26,935131.68,529178.58
+North America,Greenland,Beverages,Online,L,11/27/2011,809571206,1/11/2012,8965,47.45,31.79,425389.25,284997.35,140391.90
+Central America and the Caribbean,Saint Kitts and Nevis ,Office Supplies,Online,H,2/18/2013,562880504,3/19/2013,7704,651.21,524.96,5016921.84,4044291.84,972630.00
+Sub-Saharan Africa,Gabon,Meat,Offline,H,12/6/2011,974009931,1/13/2012,38,421.89,364.69,16031.82,13858.22,2173.60
+Asia,Tajikistan,Fruits,Offline,C,11/4/2014,155508315,11/17/2014,7221,9.33,6.92,67371.93,49969.32,17402.61
+Sub-Saharan Africa,Seychelles ,Household,Online,M,5/8/2014,340236985,5/13/2014,2540,668.27,502.54,1697405.80,1276451.60,420954.20
+Europe,Slovakia,Clothes,Online,M,5/9/2015,231369769,5/16/2015,6311,109.28,35.84,689666.08,226186.24,463479.84
+Europe,Lithuania,Cosmetics,Online,M,3/28/2016,852392995,4/19/2016,884,437.20,263.33,386484.80,232783.72,153701.08
+Europe,Macedonia,Snacks,Offline,M,9/6/2012,597105491,10/20/2012,5639,152.58,97.44,860398.62,549464.16,310934.46
+Middle East and North Africa,Kuwait,Fruits,Offline,L,7/23/2016,179618585,8/20/2016,1986,9.33,6.92,18529.38,13743.12,4786.26
+Sub-Saharan Africa,Namibia,Fruits,Offline,H,4/26/2014,384356105,5/14/2014,8368,9.33,6.92,78073.44,57906.56,20166.88
+Europe,Andorra,Fruits,Offline,L,3/4/2016,716054379,3/26/2016,5258,9.33,6.92,49057.14,36385.36,12671.78
+Sub-Saharan Africa,Uganda,Household,Online,L,6/27/2014,749762237,8/2/2014,162,668.27,502.54,108259.74,81411.48,26848.26
+Australia and Oceania,Nauru,Beverages,Offline,H,4/3/2010,580841004,4/22/2010,2616,47.45,31.79,124129.20,83162.64,40966.56
+Asia,Kyrgyzstan,Fruits,Online,M,11/21/2016,374964511,12/9/2016,9186,9.33,6.92,85705.38,63567.12,22138.26
+Sub-Saharan Africa,Guinea,Beverages,Online,L,1/8/2011,818119084,2/21/2011,8472,47.45,31.79,401996.40,269324.88,132671.52
+Australia and Oceania,Tonga,Cereal,Offline,M,12/22/2011,866603553,2/7/2012,6104,205.70,117.11,1255592.80,714839.44,540753.36
+North America,Canada,Household,Online,M,6/9/2017,897029244,7/16/2017,9742,668.27,502.54,6510286.34,4895744.68,1614541.66
+Central America and the Caribbean,Grenada,Beverages,Online,M,10/17/2014,456319987,11/1/2014,4080,47.45,31.79,193596.00,129703.20,63892.80
+Europe,Austria,Office Supplies,Offline,C,3/21/2015,511712110,5/7/2015,5839,651.21,524.96,3802415.19,3065241.44,737173.75
+Asia,Maldives,Fruits,Online,C,1/4/2012,300754439,2/6/2012,8777,9.33,6.92,81889.41,60736.84,21152.57
+Europe,Finland,Baby Food,Offline,C,9/7/2014,481308305,10/16/2014,8678,255.28,159.42,2215319.84,1383446.76,831873.08
+Sub-Saharan Africa,Rwanda,Office Supplies,Online,H,11/21/2014,881547534,12/9/2014,8360,651.21,524.96,5444115.60,4388665.60,1055450.00
+Middle East and North Africa,Somalia,Baby Food,Offline,C,11/27/2012,949958455,1/4/2013,2672,255.28,159.42,682108.16,425970.24,256137.92
+Central America and the Caribbean,Costa Rica,Office Supplies,Online,C,11/17/2013,205339896,11/20/2013,3493,651.21,524.96,2274676.53,1833685.28,440991.25
+Sub-Saharan Africa,Lesotho,Beverages,Online,H,6/5/2016,486803185,7/8/2016,4735,47.45,31.79,224675.75,150525.65,74150.10
+Middle East and North Africa,Lebanon,Baby Food,Online,M,6/18/2016,103772151,7/22/2016,7340,255.28,159.42,1873755.20,1170142.80,703612.40
+Asia,India,Snacks,Online,H,12/15/2010,585983121,1/9/2011,4282,152.58,97.44,653347.56,417238.08,236109.48
+Sub-Saharan Africa,Swaziland,Clothes,Offline,L,11/15/2016,833484923,12/1/2016,5566,109.28,35.84,608252.48,199485.44,408767.04
+Europe,Andorra,Household,Online,C,5/22/2014,266638886,6/19/2014,3227,668.27,502.54,2156507.29,1621696.58,534810.71
+Asia,Maldives,Beverages,Offline,M,3/28/2011,176118838,4/17/2011,6333,47.45,31.79,300500.85,201326.07,99174.78
+Asia,Malaysia,Cosmetics,Online,M,3/22/2016,572911107,4/7/2016,5983,437.20,263.33,2615767.60,1575503.39,1040264.21
+Europe,Moldova ,Meat,Online,H,9/17/2012,638314521,10/15/2012,306,421.89,364.69,129098.34,111595.14,17503.20
+Middle East and North Africa,Morocco,Personal Care,Online,H,6/5/2015,973940408,7/5/2015,9465,81.73,56.67,773574.45,536381.55,237192.90
+Sub-Saharan Africa,South Sudan,Vegetables,Online,H,8/23/2013,451712596,9/28/2013,650,154.06,90.93,100139.00,59104.50,41034.50
+Sub-Saharan Africa,The Gambia,Cosmetics,Online,C,11/8/2012,263867413,11/28/2012,3086,437.20,263.33,1349199.20,812636.38,536562.82
+Central America and the Caribbean,El Salvador,Beverages,Online,M,10/31/2015,772953689,12/19/2015,3028,47.45,31.79,143678.60,96260.12,47418.48
+Asia,Bhutan,Snacks,Offline,M,4/6/2011,161832749,5/25/2011,8762,152.58,97.44,1336905.96,853769.28,483136.68
+Asia,Brunei,Meat,Online,L,5/27/2015,283678424,7/3/2015,5604,421.89,364.69,2364271.56,2043722.76,320548.80
+Europe,Switzerland,Cosmetics,Online,M,4/15/2015,811977040,5/28/2015,905,437.20,263.33,395666.00,238313.65,157352.35
+Sub-Saharan Africa,Malawi,Cosmetics,Offline,M,5/16/2010,590527427,6/19/2010,9043,437.20,263.33,3953599.60,2381293.19,1572306.41
+Asia,Laos,Personal Care,Offline,C,4/29/2016,783440911,6/9/2016,6430,81.73,56.67,525523.90,364388.10,161135.80
+Sub-Saharan Africa,Swaziland,Personal Care,Online,C,10/20/2015,825141322,11/22/2015,6509,81.73,56.67,531980.57,368865.03,163115.54
+Sub-Saharan Africa,Cote d'Ivoire,Fruits,Offline,M,3/27/2015,670364987,5/9/2015,4752,9.33,6.92,44336.16,32883.84,11452.32
+Europe,Netherlands,Meat,Online,M,10/9/2010,344160735,11/20/2010,3664,421.89,364.69,1545804.96,1336224.16,209580.80
+Sub-Saharan Africa,Liberia,Cereal,Online,M,10/7/2014,391889894,10/20/2014,7783,205.70,117.11,1600963.10,911467.13,689495.97
+Sub-Saharan Africa,Uganda,Beverages,Offline,H,2/17/2014,529226291,3/20/2014,8675,47.45,31.79,411628.75,275778.25,135850.50
+Sub-Saharan Africa,Mauritania,Household,Offline,M,12/28/2011,992156255,1/25/2012,9939,668.27,502.54,6641935.53,4994745.06,1647190.47
+Australia and Oceania,Kiribati,Cereal,Online,H,4/27/2016,286978614,5/28/2016,2204,205.70,117.11,453362.80,258110.44,195252.36
+Central America and the Caribbean,Dominican Republic,Personal Care,Offline,L,6/12/2013,140304696,7/8/2013,8132,81.73,56.67,664628.36,460840.44,203787.92
+Europe,Russia,Household,Online,H,4/3/2017,549058330,5/11/2017,7416,668.27,502.54,4955890.32,3726836.64,1229053.68
+Middle East and North Africa,Iran,Clothes,Offline,L,6/1/2012,230475842,6/8/2012,1778,109.28,35.84,194299.84,63723.52,130576.32
+Sub-Saharan Africa,Burundi,Fruits,Offline,L,3/1/2011,672106063,3/10/2011,9975,9.33,6.92,93066.75,69027.00,24039.75
+Sub-Saharan Africa,South Africa,Fruits,Online,M,8/27/2011,281810319,10/1/2011,2791,9.33,6.92,26040.03,19313.72,6726.31
+Asia,Bangladesh,Baby Food,Offline,H,11/21/2016,237762439,12/4/2016,8044,255.28,159.42,2053472.32,1282374.48,771097.84
+Middle East and North Africa,Pakistan,Personal Care,Offline,H,10/20/2015,438448750,11/26/2015,5583,81.73,56.67,456298.59,316388.61,139909.98
+Asia,Nepal,Cereal,Online,M,4/23/2017,852668082,5/27/2017,2289,205.70,117.11,470847.30,268064.79,202782.51
+Asia,Japan,Vegetables,Online,H,4/2/2016,169531762,5/22/2016,7071,154.06,90.93,1089358.26,642966.03,446392.23
+Sub-Saharan Africa,Swaziland,Fruits,Offline,H,4/30/2012,748463618,5/14/2012,5872,9.33,6.92,54785.76,40634.24,14151.52
+Europe,Greece,Meat,Online,H,11/12/2013,969199979,12/7/2013,6666,421.89,364.69,2812318.74,2431023.54,381295.20
+Central America and the Caribbean,Barbados,Beverages,Offline,C,4/30/2011,181789672,5/13/2011,4459,47.45,31.79,211579.55,141751.61,69827.94
+Europe,Spain,Baby Food,Offline,L,5/22/2011,956594026,6/17/2011,6285,255.28,159.42,1604434.80,1001954.70,602480.10
+North America,United States of America,Meat,Online,C,6/6/2010,534286868,7/25/2010,6212,421.89,364.69,2620780.68,2265454.28,355326.40
+Australia and Oceania,Vanuatu,Personal Care,Online,M,6/20/2013,275854527,7/19/2013,340,81.73,56.67,27788.20,19267.80,8520.40
+Europe,Ukraine,Beverages,Online,H,3/24/2015,712595832,3/28/2015,1797,47.45,31.79,85267.65,57126.63,28141.02
+Central America and the Caribbean,Trinidad and Tobago,Personal Care,Online,H,6/30/2011,196122109,7/23/2011,5745,81.73,56.67,469538.85,325569.15,143969.70
+Europe,Italy,Baby Food,Offline,C,6/26/2010,748357188,7/20/2010,4377,255.28,159.42,1117360.56,697781.34,419579.22
+North America,Canada,Cosmetics,Online,C,11/25/2013,411537396,12/3/2013,1916,437.20,263.33,837675.20,504540.28,333134.92
+Europe,Estonia,Fruits,Offline,L,2/25/2013,898211562,3/12/2013,9616,9.33,6.92,89717.28,66542.72,23174.56
+Australia and Oceania,East Timor,Fruits,Offline,M,11/12/2015,841241014,12/31/2015,765,9.33,6.92,7137.45,5293.80,1843.65
+Sub-Saharan Africa,Malawi,Baby Food,Online,L,10/14/2011,743799579,12/2/2011,5679,255.28,159.42,1449735.12,905346.18,544388.94
+Europe,Ireland,Office Supplies,Offline,C,6/15/2014,729373586,7/5/2014,6707,651.21,524.96,4367665.47,3520906.72,846758.75
+Europe,Norway,Fruits,Offline,M,12/20/2011,991761863,12/24/2011,3229,9.33,6.92,30126.57,22344.68,7781.89
+Sub-Saharan Africa,Central African Republic,Cosmetics,Online,L,3/17/2016,445075738,3/27/2016,6656,437.20,263.33,2910003.20,1752724.48,1157278.72
+Middle East and North Africa,Libya,Clothes,Online,L,8/14/2013,773739039,9/13/2013,5431,109.28,35.84,593499.68,194647.04,398852.64
+Australia and Oceania,Marshall Islands,Personal Care,Offline,M,6/2/2014,582488095,6/23/2014,26,81.73,56.67,2124.98,1473.42,651.56
+Middle East and North Africa,Turkey,Cereal,Online,C,12/18/2010,346371734,1/17/2011,7948,205.70,117.11,1634903.60,930790.28,704113.32
+Europe,Latvia,Personal Care,Offline,C,10/29/2011,160751283,11/13/2011,8732,81.73,56.67,713666.36,494842.44,218823.92
+Asia,Brunei,Office Supplies,Offline,L,4/11/2015,191300570,5/6/2015,8945,651.21,524.96,5825073.45,4695767.20,1129306.25
+Central America and the Caribbean,Jamaica,Snacks,Online,M,1/29/2013,224005925,2/18/2013,7186,152.58,97.44,1096439.88,700203.84,396236.04
+Middle East and North Africa,Algeria,Beverages,Online,L,12/31/2016,115166175,2/17/2017,9085,47.45,31.79,431083.25,288812.15,142271.10
+Europe,Macedonia,Household,Online,H,2/22/2017,241392648,3/16/2017,2304,668.27,502.54,1539694.08,1157852.16,381841.92
+Central America and the Caribbean,Haiti,Fruits,Online,C,1/19/2016,149609172,3/2/2016,1533,9.33,6.92,14302.89,10608.36,3694.53
+Sub-Saharan Africa,Niger,Office Supplies,Offline,C,4/22/2017,807052075,5/16/2017,3498,651.21,524.96,2277932.58,1836310.08,441622.50
+Central America and the Caribbean,The Bahamas,Baby Food,Online,M,3/23/2014,551270186,4/9/2014,1953,255.28,159.42,498561.84,311347.26,187214.58
+Middle East and North Africa,Egypt,Clothes,Online,M,4/25/2016,940124833,6/3/2016,2685,109.28,35.84,293416.80,96230.40,197186.40
+Europe,Malta,Meat,Online,H,3/24/2015,901789844,5/5/2015,8509,421.89,364.69,3589862.01,3103147.21,486714.80
+Australia and Oceania,Samoa ,Meat,Online,L,3/30/2011,784751546,5/11/2011,4276,421.89,364.69,1804001.64,1559414.44,244587.20
+Sub-Saharan Africa,South Sudan,Personal Care,Online,M,1/26/2017,107808768,3/14/2017,1865,81.73,56.67,152426.45,105689.55,46736.90
+Asia,South Korea,Baby Food,Offline,L,3/12/2016,710072839,4/3/2016,5187,255.28,159.42,1324137.36,826911.54,497225.82
+Sub-Saharan Africa,Rwanda,Fruits,Online,L,2/5/2012,900967586,3/3/2012,5185,9.33,6.92,48376.05,35880.20,12495.85
+Europe,Portugal,Office Supplies,Online,M,11/21/2016,410229337,12/22/2016,4832,651.21,524.96,3146646.72,2536606.72,610040.00
+Europe,Switzerland,Beverages,Online,L,4/4/2017,837906920,5/16/2017,4133,47.45,31.79,196110.85,131388.07,64722.78
+Europe,Slovakia,Household,Online,C,1/30/2016,704361665,3/1/2016,5124,668.27,502.54,3424215.48,2575014.96,849200.52
+Europe,Austria,Snacks,Offline,M,7/11/2013,400267398,7/20/2013,6873,152.58,97.44,1048682.34,669705.12,378977.22
+Sub-Saharan Africa,Cameroon,Vegetables,Offline,M,10/30/2010,836610448,12/19/2010,478,154.06,90.93,73640.68,43464.54,30176.14
+Sub-Saharan Africa,Seychelles ,Cereal,Online,H,1/26/2014,294689643,2/7/2014,4069,205.70,117.11,836993.30,476520.59,360472.71
+Sub-Saharan Africa,Sierra Leone,Beverages,Online,M,4/3/2015,276116311,4/26/2015,7807,47.45,31.79,370442.15,248184.53,122257.62
+Middle East and North Africa,Azerbaijan,Meat,Offline,M,3/26/2011,552814280,5/10/2011,8885,421.89,364.69,3748492.65,3240270.65,508222.00
+Asia,Malaysia,Office Supplies,Offline,H,1/24/2015,517019879,1/28/2015,6526,651.21,524.96,4249796.46,3425888.96,823907.50
+Europe,France,Meat,Online,C,5/19/2014,531281936,6/3/2014,6986,421.89,364.69,2947323.54,2547724.34,399599.20
+Central America and the Caribbean,Grenada,Beverages,Online,C,1/4/2013,578461778,1/9/2013,8550,47.45,31.79,405697.50,271804.50,133893.00
+Sub-Saharan Africa,Senegal,Vegetables,Offline,L,1/27/2012,711733233,3/9/2012,6535,154.06,90.93,1006782.10,594227.55,412554.55
+Asia,Brunei,Baby Food,Offline,L,9/27/2013,604582631,9/30/2013,8291,255.28,159.42,2116526.48,1321751.22,794775.26
+Europe,Greece,Cosmetics,Online,C,6/20/2017,900808799,6/28/2017,8196,437.20,263.33,3583291.20,2158252.68,1425038.52
+Asia,Singapore,Baby Food,Online,L,3/18/2016,964523065,4/24/2016,2664,255.28,159.42,680065.92,424694.88,255371.04
+Sub-Saharan Africa,Madagascar,Household,Online,H,5/5/2015,230149257,5/13/2015,5134,668.27,502.54,3430898.18,2580040.36,850857.82
+Australia and Oceania,Australia,Cosmetics,Offline,C,9/19/2013,452423703,9/24/2013,1082,437.20,263.33,473050.40,284923.06,188127.34
+Europe,Czech Republic,Meat,Online,H,1/22/2015,756395232,3/13/2015,3013,421.89,364.69,1271154.57,1098810.97,172343.60
+Sub-Saharan Africa,Guinea,Vegetables,Online,L,7/29/2016,787425172,8/22/2016,5462,154.06,90.93,841475.72,496659.66,344816.06
+Europe,Ireland,Clothes,Online,C,10/2/2012,261187350,10/3/2012,9996,109.28,35.84,1092362.88,358256.64,734106.24
+Middle East and North Africa,Kuwait,Cosmetics,Online,L,4/16/2014,313668096,5/4/2014,215,437.20,263.33,93998.00,56615.95,37382.05
+Central America and the Caribbean,Panama,Meat,Offline,C,1/5/2014,351166236,2/21/2014,6748,421.89,364.69,2846913.72,2460928.12,385985.60
+Asia,Bhutan,Cosmetics,Offline,C,5/23/2013,300293099,6/18/2013,2256,437.20,263.33,986323.20,594072.48,392250.72
+Asia,Cambodia,Household,Online,H,3/5/2011,157972514,4/4/2011,6432,668.27,502.54,4298312.64,3232337.28,1065975.36
+Middle East and North Africa,Tunisia ,Vegetables,Offline,M,9/29/2014,441440808,11/17/2014,1000,154.06,90.93,154060.00,90930.00,63130.00
+Sub-Saharan Africa,Central African Republic,Personal Care,Offline,H,8/13/2013,838246810,8/21/2013,4714,81.73,56.67,385275.22,267142.38,118132.84
+Middle East and North Africa,Qatar,Household,Offline,M,7/10/2013,656251847,8/29/2013,8360,668.27,502.54,5586737.20,4201234.40,1385502.80
+Asia,Sri Lanka,Household,Offline,C,6/19/2017,173629748,6/19/2017,9756,668.27,502.54,6519642.12,4902780.24,1616861.88
+Europe,Slovenia,Clothes,Offline,L,5/16/2014,188866841,5/20/2014,8750,109.28,35.84,956200.00,313600.00,642600.00
+Australia and Oceania,East Timor,Beverages,Offline,L,3/1/2013,670761954,4/11/2013,2223,47.45,31.79,105481.35,70669.17,34812.18
+Sub-Saharan Africa,Nigeria,Cereal,Offline,M,4/4/2016,308426415,4/6/2016,9085,205.70,117.11,1868784.50,1063944.35,804840.15
+Asia,Laos,Cereal,Online,C,10/9/2015,561284053,10/31/2015,5279,205.70,117.11,1085890.30,618223.69,467666.61
+Europe,Cyprus,Household,Online,C,6/18/2012,709071195,8/2/2012,8778,668.27,502.54,5866074.06,4411296.12,1454777.94
+Sub-Saharan Africa,Republic of the Congo,Household,Online,M,12/12/2011,101836669,12/14/2011,4588,668.27,502.54,3066022.76,2305653.52,760369.24
+Middle East and North Africa,Somalia,Personal Care,Online,M,4/25/2013,409941804,6/8/2013,9744,81.73,56.67,796377.12,552192.48,244184.64
+Europe,Belarus,Cereal,Online,L,12/15/2012,674060428,12/17/2012,8315,205.70,117.11,1710395.50,973769.65,736625.85
+Middle East and North Africa,Afghanistan,Office Supplies,Offline,C,11/19/2015,455178868,12/15/2015,6397,651.21,524.96,4165790.37,3358169.12,807621.25
+Europe,San Marino,Cosmetics,Offline,C,10/27/2016,284595954,10/29/2016,7122,437.20,263.33,3113738.40,1875436.26,1238302.14
+Sub-Saharan Africa,Nigeria,Meat,Online,C,7/24/2011,313923013,8/23/2011,5650,421.89,364.69,2383678.50,2060498.50,323180.00
+Middle East and North Africa,Kuwait,Clothes,Online,L,11/18/2015,765083873,1/5/2016,4175,109.28,35.84,456244.00,149632.00,306612.00
+Europe,Iceland,Baby Food,Offline,C,5/6/2016,580314862,5/12/2016,6918,255.28,159.42,1766027.04,1102867.56,663159.48
+Central America and the Caribbean,Honduras,Meat,Offline,C,12/9/2011,572164809,1/25/2012,5137,421.89,364.69,2167248.93,1873412.53,293836.40
+Asia,North Korea,Beverages,Online,C,4/11/2010,273495042,5/1/2010,2115,47.45,31.79,100356.75,67235.85,33120.90
+Middle East and North Africa,Iraq,Meat,Offline,H,4/6/2016,187479388,4/24/2016,8172,421.89,364.69,3447685.08,2980246.68,467438.40
+Europe,Luxembourg,Snacks,Online,L,2/21/2013,437604176,4/7/2013,5655,152.58,97.44,862839.90,551023.20,311816.70
+North America,United States of America,Beverages,Offline,M,9/24/2011,317668235,11/7/2011,3945,47.45,31.79,187190.25,125411.55,61778.70
+Middle East and North Africa,Yemen,Cosmetics,Offline,H,5/1/2016,541782891,5/21/2016,4452,437.20,263.33,1946414.40,1172345.16,774069.24
+Central America and the Caribbean,Saint Vincent and the Grenadines,Office Supplies,Online,M,5/24/2013,994371974,6/12/2013,5619,651.21,524.96,3659148.99,2949750.24,709398.75
+Sub-Saharan Africa,Benin,Cereal,Online,L,2/18/2013,280171811,4/7/2013,7920,205.70,117.11,1629144.00,927511.20,701632.80
+Sub-Saharan Africa,Benin,Household,Online,M,6/27/2015,674231231,6/28/2015,8859,668.27,502.54,5920203.93,4452001.86,1468202.07
+Sub-Saharan Africa,Uganda,Office Supplies,Online,C,11/14/2013,471911561,12/24/2013,7973,651.21,524.96,5192097.33,4185506.08,1006591.25
+Asia,Cambodia,Snacks,Online,H,2/18/2014,738886630,2/28/2014,1828,152.58,97.44,278916.24,178120.32,100795.92
+North America,Greenland,Beverages,Online,M,8/13/2015,361142766,9/5/2015,9025,47.45,31.79,428236.25,286904.75,141331.50
+Europe,Italy,Beverages,Offline,H,12/5/2014,994978797,1/2/2015,5192,47.45,31.79,246360.40,165053.68,81306.72
+Europe,Greece,Beverages,Offline,H,4/30/2017,317006051,6/5/2017,7990,47.45,31.79,379125.50,254002.10,125123.40
+Sub-Saharan Africa,Cameroon,Snacks,Online,M,3/16/2010,574148356,5/4/2010,2112,152.58,97.44,322248.96,205793.28,116455.68
+Europe,Montenegro,Personal Care,Online,H,4/19/2012,933642041,5/19/2012,4282,81.73,56.67,349967.86,242660.94,107306.92
+Asia,Singapore,Baby Food,Online,M,11/30/2016,633035933,12/31/2016,8255,255.28,159.42,2107336.40,1316012.10,791324.30
+Asia,Kyrgyzstan,Snacks,Online,C,11/6/2010,330191361,11/23/2010,9816,152.58,97.44,1497725.28,956471.04,541254.24
+Asia,Kyrgyzstan,Clothes,Online,M,1/14/2016,753282153,2/26/2016,1784,109.28,35.84,194955.52,63938.56,131016.96
+Sub-Saharan Africa,Guinea-Bissau,Fruits,Offline,C,1/18/2010,450794637,2/11/2010,9006,9.33,6.92,84025.98,62321.52,21704.46
+Middle East and North Africa,Somalia,Cereal,Offline,M,3/1/2013,741527640,3/18/2013,3362,205.70,117.11,691563.40,393723.82,297839.58
+Europe,Italy,Office Supplies,Offline,M,6/9/2016,764592492,7/19/2016,8764,651.21,524.96,5707204.44,4600749.44,1106455.00
+Central America and the Caribbean,Antigua and Barbuda ,Clothes,Offline,H,10/12/2015,629413020,12/1/2015,6154,109.28,35.84,672509.12,220559.36,451949.76
+Australia and Oceania,Federated States of Micronesia,Fruits,Offline,C,9/23/2015,965725553,10/8/2015,8506,9.33,6.92,79360.98,58861.52,20499.46
+Middle East and North Africa,Israel,Vegetables,Online,H,7/16/2010,673578917,8/31/2010,5825,154.06,90.93,897399.50,529667.25,367732.25
+Sub-Saharan Africa,The Gambia,Snacks,Offline,H,9/2/2010,973334443,9/15/2010,146,152.58,97.44,22276.68,14226.24,8050.44
+Central America and the Caribbean,Barbados,Baby Food,Online,L,4/16/2016,455665957,5/13/2016,538,255.28,159.42,137340.64,85767.96,51572.68
+Europe,Hungary,Clothes,Offline,C,6/25/2013,931559789,7/5/2013,8098,109.28,35.84,884949.44,290232.32,594717.12
+Europe,Germany,Beverages,Offline,L,11/26/2015,682314765,12/20/2015,956,47.45,31.79,45362.20,30391.24,14970.96
+Central America and the Caribbean,Cuba,Office Supplies,Offline,C,7/22/2015,309542214,9/5/2015,9275,651.21,524.96,6039972.75,4869004.00,1170968.75
+Europe,Spain,Snacks,Online,C,11/11/2016,485165965,12/14/2016,245,152.58,97.44,37382.10,23872.80,13509.30
+Europe,Netherlands,Beverages,Online,C,3/4/2010,601422345,3/20/2010,3092,47.45,31.79,146715.40,98294.68,48420.72
+Middle East and North Africa,Azerbaijan,Fruits,Online,L,5/26/2013,120860183,6/5/2013,4069,9.33,6.92,37963.77,28157.48,9806.29
+Middle East and North Africa,United Arab Emirates,Fruits,Offline,C,3/27/2015,826340806,5/7/2015,1462,9.33,6.92,13640.46,10117.04,3523.42
+Sub-Saharan Africa,Ghana,Office Supplies,Online,L,10/14/2016,971038043,11/8/2016,590,651.21,524.96,384213.90,309726.40,74487.50
+Central America and the Caribbean,Cuba,Baby Food,Offline,H,8/30/2012,228438222,10/12/2012,8801,255.28,159.42,2246719.28,1403055.42,843663.86
+Australia and Oceania,Vanuatu,Office Supplies,Offline,L,6/20/2017,142340171,7/1/2017,475,651.21,524.96,309324.75,249356.00,59968.75
+Middle East and North Africa,Lebanon,Household,Offline,C,7/28/2016,976855218,8/8/2016,2022,668.27,502.54,1351241.94,1016135.88,335106.06
+Sub-Saharan Africa,Guinea,Baby Food,Online,M,5/9/2015,366407191,5/21/2015,6885,255.28,159.42,1757602.80,1097606.70,659996.10
+Middle East and North Africa,Iran,Fruits,Offline,L,9/2/2012,965732419,10/19/2012,538,9.33,6.92,5019.54,3722.96,1296.58
+Europe,Albania,Household,Offline,M,3/31/2012,999879729,5/6/2012,5486,668.27,502.54,3666129.22,2756934.44,909194.78
+Sub-Saharan Africa,Mali,Snacks,Online,M,4/15/2011,114210450,4/28/2011,6265,152.58,97.44,955913.70,610461.60,345452.10
+Australia and Oceania,Australia,Household,Online,H,11/6/2011,724398410,11/7/2011,4442,668.27,502.54,2968455.34,2232282.68,736172.66
+Central America and the Caribbean,Saint Lucia,Beverages,Online,M,1/22/2017,366429936,2/27/2017,3616,47.45,31.79,171579.20,114952.64,56626.56
+Europe,Latvia,Cosmetics,Offline,H,3/5/2012,246603858,4/15/2012,4417,437.20,263.33,1931112.40,1163128.61,767983.79
+Europe,Slovakia,Beverages,Online,L,10/23/2013,291531503,10/26/2013,9505,47.45,31.79,451012.25,302163.95,148848.30
+Central America and the Caribbean,Jamaica,Snacks,Offline,L,2/20/2013,498136699,4/11/2013,8574,152.58,97.44,1308220.92,835450.56,472770.36
+Europe,Kosovo,Cereal,Offline,H,7/18/2017,483655774,8/5/2017,3346,205.70,117.11,688272.20,391850.06,296422.14
+Sub-Saharan Africa,Guinea-Bissau,Cosmetics,Offline,L,7/17/2016,835637557,8/21/2016,2578,437.20,263.33,1127101.60,678864.74,448236.86
+Central America and the Caribbean,Saint Vincent and the Grenadines,Fruits,Offline,C,11/12/2015,861943376,12/24/2015,7054,9.33,6.92,65813.82,48813.68,17000.14
+Europe,Armenia,Personal Care,Online,C,12/10/2010,840747058,12/26/2010,4593,81.73,56.67,375385.89,260285.31,115100.58
+Sub-Saharan Africa,Mozambique,Cereal,Online,M,6/1/2013,670534932,6/1/2013,5042,205.70,117.11,1037139.40,590468.62,446670.78
+Sub-Saharan Africa,Mauritius ,Baby Food,Offline,H,1/24/2017,320105826,2/19/2017,5282,255.28,159.42,1348388.96,842056.44,506332.52
+Sub-Saharan Africa,Chad,Baby Food,Online,L,9/26/2016,278571069,10/30/2016,4225,255.28,159.42,1078558.00,673549.50,405008.50
+Europe,Bosnia and Herzegovina,Cosmetics,Offline,H,2/12/2012,205354487,2/20/2012,7811,437.20,263.33,3414969.20,2056870.63,1358098.57
+Europe,Finland,Cereal,Online,H,7/16/2011,280192410,8/28/2011,4016,205.70,117.11,826091.20,470313.76,355777.44
+Australia and Oceania,East Timor,Household,Online,L,1/14/2013,753133666,2/4/2013,7843,668.27,502.54,5241241.61,3941421.22,1299820.39
+Asia,Kazakhstan,Vegetables,Offline,M,9/19/2015,594539582,10/29/2015,6329,154.06,90.93,975045.74,575495.97,399549.77
+Asia,Philippines,Snacks,Online,L,12/16/2015,645083987,1/19/2016,3542,152.58,97.44,540438.36,345132.48,195305.88
+Europe,Germany,Vegetables,Offline,C,3/14/2011,465753209,3/14/2011,5579,154.06,90.93,859500.74,507298.47,352202.27
+Europe,Sweden,Personal Care,Online,C,4/26/2011,587846076,5/24/2011,5572,81.73,56.67,455399.56,315765.24,139634.32
+Asia,Myanmar,Personal Care,Online,C,2/5/2012,262973916,2/20/2012,8680,81.73,56.67,709416.40,491895.60,217520.80
+Asia,Laos,Clothes,Online,C,3/6/2014,613060557,4/25/2014,7097,109.28,35.84,775560.16,254356.48,521203.68
+Europe,Armenia,Cereal,Offline,H,9/10/2011,580342328,10/14/2011,5046,205.70,117.11,1037962.20,590937.06,447025.14
+Australia and Oceania,Palau,Snacks,Offline,M,3/13/2011,977368056,3/18/2011,3782,152.58,97.44,577057.56,368518.08,208539.48
+Middle East and North Africa,Saudi Arabia,Snacks,Offline,M,9/26/2012,436999070,10/15/2012,6591,152.58,97.44,1005654.78,642227.04,363427.74
+Central America and the Caribbean,Honduras,Cosmetics,Offline,H,8/23/2013,362409198,9/7/2013,3790,437.20,263.33,1656988.00,998020.70,658967.30
+Europe,Switzerland,Meat,Online,C,4/21/2012,877084767,6/9/2012,7728,421.89,364.69,3260365.92,2818324.32,442041.60
+Sub-Saharan Africa,Chad,Clothes,Online,C,12/18/2011,374824607,12/28/2011,7785,109.28,35.84,850744.80,279014.40,571730.40
+Sub-Saharan Africa,Togo,Office Supplies,Online,C,12/5/2016,469740045,12/14/2016,5373,651.21,524.96,3498951.33,2820610.08,678341.25
+Middle East and North Africa,Azerbaijan,Vegetables,Offline,M,8/23/2013,146254909,9/29/2013,8932,154.06,90.93,1376063.92,812186.76,563877.16
+Europe,Norway,Clothes,Online,C,4/29/2012,709105527,5/1/2012,8938,109.28,35.84,976744.64,320337.92,656406.72
+Asia,Vietnam,Office Supplies,Offline,M,11/28/2012,833340728,11/29/2012,2895,651.21,524.96,1885252.95,1519759.20,365493.75
+Europe,San Marino,Meat,Online,H,5/23/2016,614321839,7/5/2016,339,421.89,364.69,143020.71,123629.91,19390.80
+Asia,Myanmar,Vegetables,Offline,C,6/19/2013,217722690,7/13/2013,7837,154.06,90.93,1207368.22,712618.41,494749.81
+Europe,Ukraine,Cosmetics,Online,L,1/18/2011,329529607,1/23/2011,3988,437.20,263.33,1743553.60,1050160.04,693393.56
+Sub-Saharan Africa,Burkina Faso,Cosmetics,Online,C,4/30/2013,806041419,6/5/2013,4423,437.20,263.33,1933735.60,1164708.59,769027.01
+Europe,Ireland,Fruits,Online,L,5/30/2010,223869454,6/27/2010,6801,9.33,6.92,63453.33,47062.92,16390.41
+Sub-Saharan Africa,Mozambique,Personal Care,Offline,M,5/28/2012,829937541,6/30/2012,5816,81.73,56.67,475341.68,329592.72,145748.96
+Asia,Sri Lanka,Beverages,Online,L,5/3/2015,891482007,5/16/2015,8191,47.45,31.79,388662.95,260391.89,128271.06
+Sub-Saharan Africa,Republic of the Congo,Cosmetics,Online,L,7/3/2012,546051681,7/25/2012,7682,437.20,263.33,3358570.40,2022901.06,1335669.34
+Asia,Brunei,Baby Food,Offline,C,6/5/2013,451507890,6/28/2013,73,255.28,159.42,18635.44,11637.66,6997.78
+Sub-Saharan Africa,Guinea,Cosmetics,Offline,H,4/27/2017,436024463,5/19/2017,8183,437.20,263.33,3577607.60,2154829.39,1422778.21
+Central America and the Caribbean,Panama,Cosmetics,Online,M,11/25/2016,848087728,12/30/2016,6860,437.20,263.33,2999192.00,1806443.80,1192748.20
+Sub-Saharan Africa,Angola,Household,Online,L,4/20/2017,306496512,5/6/2017,7984,668.27,502.54,5335467.68,4012279.36,1323188.32
+Sub-Saharan Africa,Kenya,Beverages,Online,M,2/25/2017,650362145,4/2/2017,5466,47.45,31.79,259361.70,173764.14,85597.56
+Europe,Czech Republic,Office Supplies,Offline,H,5/11/2012,189108455,6/30/2012,249,651.21,524.96,162151.29,130715.04,31436.25
+Europe,Sweden,Fruits,Offline,L,1/14/2015,452471768,2/10/2015,5306,9.33,6.92,49504.98,36717.52,12787.46
+Australia and Oceania,East Timor,Snacks,Online,C,11/13/2011,340500915,12/11/2011,642,152.58,97.44,97956.36,62556.48,35399.88
+Asia,Philippines,Cosmetics,Online,C,4/23/2013,173557221,5/16/2013,8293,437.20,263.33,3625699.60,2183795.69,1441903.91
+Sub-Saharan Africa,Togo,Office Supplies,Offline,H,12/15/2011,342314517,1/6/2012,7327,651.21,524.96,4771415.67,3846381.92,925033.75
+Asia,Taiwan,Vegetables,Offline,M,8/10/2016,857759130,9/28/2016,8843,154.06,90.93,1362352.58,804093.99,558258.59
+Sub-Saharan Africa,Zimbabwe,Baby Food,Offline,H,8/20/2010,901189887,9/3/2010,969,255.28,159.42,247366.32,154477.98,92888.34
+Europe,Germany,Cereal,Offline,M,4/30/2016,174218118,6/13/2016,3867,205.70,117.11,795441.90,452864.37,342577.53
+Sub-Saharan Africa,Togo,Office Supplies,Offline,L,5/25/2015,248767650,7/13/2015,4731,651.21,524.96,3080874.51,2483585.76,597288.75
+Sub-Saharan Africa,Sudan,Personal Care,Online,C,4/30/2013,517074811,5/7/2013,2782,81.73,56.67,227372.86,157655.94,69716.92
+Asia,Indonesia,Fruits,Online,C,11/23/2012,441688430,12/26/2012,4277,9.33,6.92,39904.41,29596.84,10307.57
+Australia and Oceania,Solomon Islands,Clothes,Offline,M,5/11/2010,905469834,5/15/2010,7500,109.28,35.84,819600.00,268800.00,550800.00
+Sub-Saharan Africa,Equatorial Guinea,Household,Offline,M,5/27/2014,161592853,7/3/2014,7771,668.27,502.54,5193126.17,3905238.34,1287887.83
+Middle East and North Africa,Libya,Fruits,Online,C,1/23/2012,583543813,2/2/2012,2437,9.33,6.92,22737.21,16864.04,5873.17
+Sub-Saharan Africa,Burundi,Snacks,Online,L,5/13/2010,115121543,6/25/2010,5878,152.58,97.44,896865.24,572752.32,324112.92
+Europe,Germany,Meat,Online,H,5/28/2017,820437371,6/11/2017,4505,421.89,364.69,1900614.45,1642928.45,257686.00
+Sub-Saharan Africa,Mali,Office Supplies,Offline,H,11/2/2015,333915126,12/17/2015,1761,651.21,524.96,1146780.81,924454.56,222326.25
+Europe,Slovenia,Personal Care,Offline,L,2/6/2012,410291135,2/22/2012,3119,81.73,56.67,254915.87,176753.73,78162.14
+Europe,Andorra,Baby Food,Offline,C,6/24/2017,174614226,8/13/2017,1085,255.28,159.42,276978.80,172970.70,104008.10
+Sub-Saharan Africa,Zambia,Office Supplies,Online,M,1/15/2014,172245728,2/14/2014,194,651.21,524.96,126334.74,101842.24,24492.50
+Europe,Vatican City,Snacks,Offline,L,6/2/2011,118859469,7/1/2011,2013,152.58,97.44,307143.54,196146.72,110996.82
+Middle East and North Africa,Algeria,Clothes,Online,H,9/23/2012,250441777,10/25/2012,142,109.28,35.84,15517.76,5089.28,10428.48
+Middle East and North Africa,Pakistan,Baby Food,Online,L,10/24/2010,873291480,11/6/2010,5210,255.28,159.42,1330008.80,830578.20,499430.60
+Asia,Indonesia,Beverages,Online,L,9/14/2014,114019906,9/24/2014,9879,47.45,31.79,468758.55,314053.41,154705.14
+Europe,Belarus,Cosmetics,Offline,H,7/30/2015,669550883,9/16/2015,3840,437.20,263.33,1678848.00,1011187.20,667660.80
+Central America and the Caribbean,Dominican Republic,Baby Food,Offline,L,3/30/2013,357120740,4/14/2013,8818,255.28,159.42,2251059.04,1405765.56,845293.48
+Sub-Saharan Africa,Zimbabwe,Beverages,Offline,L,5/15/2012,664278304,6/24/2012,3567,47.45,31.79,169254.15,113394.93,55859.22
+Asia,Uzbekistan,Cereal,Offline,M,2/8/2011,898884904,2/20/2011,8873,205.70,117.11,1825176.10,1039117.03,786059.07
+Europe,United Kingdom,Personal Care,Online,M,6/17/2012,439114367,6/26/2012,2554,81.73,56.67,208738.42,144735.18,64003.24
+Middle East and North Africa,Oman,Personal Care,Offline,L,12/6/2012,983453023,12/31/2012,4459,81.73,56.67,364434.07,252691.53,111742.54
+Sub-Saharan Africa,Guinea-Bissau,Cosmetics,Online,H,11/14/2013,700699698,12/23/2013,1467,437.20,263.33,641372.40,386305.11,255067.29
+Central America and the Caribbean,Nicaragua,Cereal,Offline,M,2/11/2010,979965722,3/27/2010,2489,205.70,117.11,511987.30,291486.79,220500.51
+Central America and the Caribbean,Guatemala,Office Supplies,Online,C,7/4/2016,580674922,7/26/2016,3468,651.21,524.96,2258396.28,1820561.28,437835.00
+Europe,Moldova ,Household,Online,M,1/31/2011,582563626,2/19/2011,2378,668.27,502.54,1589146.06,1195040.12,394105.94
+Middle East and North Africa,Kuwait,Snacks,Offline,C,8/8/2014,335680663,8/25/2014,4223,152.58,97.44,644345.34,411489.12,232856.22
+Sub-Saharan Africa,Zimbabwe,Vegetables,Online,L,1/7/2011,610387361,1/20/2011,6039,154.06,90.93,930368.34,549126.27,381242.07
+Australia and Oceania,Palau,Clothes,Online,C,11/9/2011,447357547,12/22/2011,1894,109.28,35.84,206976.32,67880.96,139095.36
+Central America and the Caribbean,Panama,Personal Care,Online,H,7/24/2014,307577550,7/27/2014,7887,81.73,56.67,644604.51,446956.29,197648.22
+Central America and the Caribbean,Dominican Republic,Cosmetics,Online,H,11/9/2013,722346198,12/11/2013,7147,437.20,263.33,3124668.40,1882019.51,1242648.89
+Europe,Latvia,Snacks,Online,M,2/8/2013,943274819,3/8/2013,4836,152.58,97.44,737876.88,471219.84,266657.04
+Asia,Bangladesh,Beverages,Offline,M,12/12/2012,292287242,1/11/2013,3145,47.45,31.79,149230.25,99979.55,49250.70
+Middle East and North Africa,Syria,Vegetables,Offline,C,1/31/2015,411619794,3/10/2015,6299,154.06,90.93,970423.94,572768.07,397655.87
+Europe,Hungary,Office Supplies,Online,H,12/5/2010,313821303,1/17/2011,5552,651.21,524.96,3615517.92,2914577.92,700940.00
+Europe,Slovakia,Beverages,Online,M,9/2/2015,431753098,10/19/2015,4191,47.45,31.79,198862.95,133231.89,65631.06
+Asia,Tajikistan,Baby Food,Online,M,6/30/2011,368589007,8/10/2011,2533,255.28,159.42,646624.24,403810.86,242813.38
+Sub-Saharan Africa,Benin,Vegetables,Offline,M,12/9/2011,247815358,1/8/2012,2926,154.06,90.93,450779.56,266061.18,184718.38
+Australia and Oceania,East Timor,Clothes,Online,L,9/2/2012,263230979,9/8/2012,4751,109.28,35.84,519189.28,170275.84,348913.44
+Central America and the Caribbean,Dominican Republic,Snacks,Offline,C,6/5/2010,228947198,7/1/2010,9418,152.58,97.44,1436998.44,917689.92,519308.52
+Sub-Saharan Africa,Cote d'Ivoire,Vegetables,Offline,C,5/13/2014,929387843,6/15/2014,5371,154.06,90.93,827456.26,488385.03,339071.23
+Europe,Bosnia and Herzegovina,Household,Online,C,12/28/2011,969289243,2/2/2012,3082,668.27,502.54,2059608.14,1548828.28,510779.86
+Sub-Saharan Africa,Burundi,Office Supplies,Offline,M,10/22/2010,823700225,11/21/2010,56,651.21,524.96,36467.76,29397.76,7070.00
+Asia,Sri Lanka,Clothes,Online,C,10/24/2011,587982118,11/17/2011,5830,109.28,35.84,637102.40,208947.20,428155.20
+Middle East and North Africa,Pakistan,Cereal,Online,C,4/9/2013,427808749,4/24/2013,6971,205.70,117.11,1433934.70,816373.81,617560.89
+Central America and the Caribbean,The Bahamas,Household,Offline,H,7/13/2014,129166448,7/28/2014,2077,668.27,502.54,1387996.79,1043775.58,344221.21
+Asia,India,Personal Care,Offline,H,3/14/2012,448354041,4/5/2012,6779,81.73,56.67,554047.67,384165.93,169881.74
+Europe,Norway,Snacks,Offline,M,7/17/2011,861982858,9/4/2011,8738,152.58,97.44,1333244.04,851430.72,481813.32
+Asia,China,Meat,Online,C,1/30/2015,916976726,3/16/2015,2645,421.89,364.69,1115899.05,964605.05,151294.00
+Sub-Saharan Africa,Rwanda,Office Supplies,Online,L,4/10/2011,680571973,5/5/2011,5225,651.21,524.96,3402572.25,2742916.00,659656.25
+Europe,Italy,Meat,Online,M,2/21/2016,290317428,4/2/2016,233,421.89,364.69,98300.37,84972.77,13327.60
+Asia,India,Office Supplies,Online,H,6/23/2016,404074418,6/30/2016,3455,651.21,524.96,2249930.55,1813736.80,436193.75
+North America,Greenland,Snacks,Offline,H,7/4/2011,850016772,8/3/2011,7707,152.58,97.44,1175934.06,750970.08,424963.98
+Central America and the Caribbean,The Bahamas,Vegetables,Offline,H,8/27/2016,176630818,9/19/2016,7839,154.06,90.93,1207676.34,712800.27,494876.07
+Middle East and North Africa,Afghanistan,Meat,Offline,H,5/5/2014,602715384,6/18/2014,5731,421.89,364.69,2417851.59,2090038.39,327813.20
+Middle East and North Africa,Somalia,Personal Care,Online,L,10/8/2010,367381799,10/17/2010,5293,81.73,56.67,432596.89,299954.31,132642.58
+Middle East and North Africa,Azerbaijan,Fruits,Online,M,12/26/2016,480053889,1/22/2017,7469,9.33,6.92,69685.77,51685.48,18000.29
+Asia,Tajikistan,Office Supplies,Offline,L,10/27/2014,670467984,11/13/2014,5231,651.21,524.96,3406479.51,2746065.76,660413.75
+Sub-Saharan Africa,Djibouti,Personal Care,Online,C,9/2/2013,738672912,10/10/2013,8584,81.73,56.67,701570.32,486455.28,215115.04
+Europe,Slovenia,Clothes,Offline,C,6/2/2016,105030000,6/13/2016,9566,109.28,35.84,1045372.48,342845.44,702527.04
+Europe,Belgium,Beverages,Online,H,8/31/2015,960213077,10/16/2015,7242,47.45,31.79,343632.90,230223.18,113409.72
+Australia and Oceania,Australia,Cereal,Online,M,8/19/2012,615208470,9/4/2012,2713,205.70,117.11,558064.10,317719.43,240344.67
+North America,Greenland,Cosmetics,Offline,H,5/31/2013,951315009,7/3/2013,4106,437.20,263.33,1795143.20,1081232.98,713910.22
+Middle East and North Africa,Lebanon,Beverages,Offline,L,1/1/2010,770144021,1/21/2010,1585,47.45,31.79,75208.25,50387.15,24821.10
+Europe,Hungary,Cosmetics,Offline,L,5/27/2014,743619334,7/9/2014,2341,437.20,263.33,1023485.20,616455.53,407029.67
+Europe,Ireland,Office Supplies,Offline,H,12/15/2016,263977277,1/10/2017,5597,651.21,524.96,3644822.37,2938201.12,706621.25
+Australia and Oceania,Papua New Guinea,Vegetables,Offline,H,11/11/2012,593766677,12/16/2012,7609,154.06,90.93,1172242.54,691886.37,480356.17
+Sub-Saharan Africa,The Gambia,Office Supplies,Offline,C,7/12/2013,815848863,8/27/2013,6663,651.21,524.96,4339012.23,3497808.48,841203.75
+Sub-Saharan Africa,Guinea,Cereal,Online,H,6/29/2012,983397662,7/25/2012,8076,205.70,117.11,1661233.20,945780.36,715452.84
+Sub-Saharan Africa,Tanzania,Household,Offline,H,12/8/2011,769899404,12/13/2011,9197,668.27,502.54,6146079.19,4621860.38,1524218.81
+Europe,Montenegro,Office Supplies,Offline,H,4/23/2011,819152915,4/24/2011,4406,651.21,524.96,2869231.26,2312973.76,556257.50
+Central America and the Caribbean,Cuba,Meat,Offline,C,2/20/2011,495269525,4/6/2011,113,421.89,364.69,47673.57,41209.97,6463.60
+Sub-Saharan Africa,Uganda,Cereal,Offline,M,10/18/2016,132673060,10/22/2016,9762,205.70,117.11,2008043.40,1143227.82,864815.58
+Sub-Saharan Africa,South Sudan,Cereal,Online,H,1/1/2012,586099851,1/14/2012,8825,205.70,117.11,1815302.50,1033495.75,781806.75
+Europe,France,Personal Care,Offline,C,8/13/2015,980598723,9/24/2015,9808,81.73,56.67,801607.84,555819.36,245788.48
+Asia,Malaysia,Fruits,Offline,L,4/9/2017,961531007,5/4/2017,7247,9.33,6.92,67614.51,50149.24,17465.27
+Middle East and North Africa,Jordan,Cosmetics,Offline,M,6/17/2011,244570529,7/21/2011,2709,437.20,263.33,1184374.80,713360.97,471013.83
+Sub-Saharan Africa,Cote d'Ivoire,Snacks,Online,M,6/12/2016,865703618,6/17/2016,9793,152.58,97.44,1494215.94,954229.92,539986.02
+Asia,Singapore,Baby Food,Online,M,6/30/2017,431229102,7/13/2017,9129,255.28,159.42,2330451.12,1455345.18,875105.94
+Central America and the Caribbean,Saint Kitts and Nevis ,Cereal,Offline,H,1/26/2016,667758309,3/11/2016,3378,205.70,117.11,694854.60,395597.58,299257.02
+Asia,China,Household,Online,H,11/30/2010,672215068,12/24/2010,2232,668.27,502.54,1491578.64,1121669.28,369909.36
+Sub-Saharan Africa,Senegal,Cosmetics,Online,H,12/28/2016,961835706,2/8/2017,7414,437.20,263.33,3241400.80,1952328.62,1289072.18
+Asia,Tajikistan,Beverages,Offline,C,3/29/2016,324169051,4/21/2016,7681,47.45,31.79,364463.45,244178.99,120284.46
+Sub-Saharan Africa,Burundi,Baby Food,Offline,M,5/24/2014,767076432,6/3/2014,3817,255.28,159.42,974403.76,608506.14,365897.62
+Sub-Saharan Africa,Mauritius ,Snacks,Online,C,6/16/2014,768731677,7/18/2014,3641,152.58,97.44,555543.78,354779.04,200764.74
+Sub-Saharan Africa,Botswana,Vegetables,Offline,C,12/3/2012,227621114,12/31/2012,7001,154.06,90.93,1078574.06,636600.93,441973.13
+Sub-Saharan Africa,Liberia,Personal Care,Offline,H,2/23/2011,912543570,3/25/2011,776,81.73,56.67,63422.48,43975.92,19446.56
+Central America and the Caribbean,Honduras,Office Supplies,Offline,M,7/17/2011,612610375,8/18/2011,3878,651.21,524.96,2525392.38,2035794.88,489597.50
+Australia and Oceania,Papua New Guinea,Snacks,Offline,L,10/18/2013,787245357,11/1/2013,2250,152.58,97.44,343305.00,219240.00,124065.00
+Central America and the Caribbean,Costa Rica,Meat,Offline,H,2/7/2011,716184842,3/2/2011,3865,421.89,364.69,1630604.85,1409526.85,221078.00
+North America,Canada,Cosmetics,Offline,L,8/22/2016,649477660,10/3/2016,3727,437.20,263.33,1629444.40,981430.91,648013.49
+Sub-Saharan Africa,Rwanda,Office Supplies,Offline,M,5/14/2014,457485139,5/29/2014,8874,651.21,524.96,5778837.54,4658495.04,1120342.50
+Sub-Saharan Africa,Togo,Beverages,Offline,M,10/21/2015,980881106,11/21/2015,3372,47.45,31.79,160001.40,107195.88,52805.52
+Australia and Oceania,Samoa ,Beverages,Offline,C,10/28/2010,880651891,12/2/2010,3319,47.45,31.79,157486.55,105511.01,51975.54
+Sub-Saharan Africa,Eritrea,Baby Food,Offline,C,11/15/2016,688096320,11/29/2016,1847,255.28,159.42,471502.16,294448.74,177053.42
+Sub-Saharan Africa,Guinea,Vegetables,Offline,H,8/4/2014,554825723,8/24/2014,4116,154.06,90.93,634110.96,374267.88,259843.08
+Australia and Oceania,Vanuatu,Fruits,Offline,H,3/10/2012,702763926,4/17/2012,2318,9.33,6.92,21626.94,16040.56,5586.38
+Europe,Andorra,Clothes,Offline,L,5/18/2011,974147260,6/8/2011,677,109.28,35.84,73982.56,24263.68,49718.88
+Sub-Saharan Africa,Niger,Cosmetics,Offline,H,2/17/2011,381524550,2/25/2011,448,437.20,263.33,195865.60,117971.84,77893.76
+Sub-Saharan Africa,Malawi,Fruits,Online,L,7/4/2011,257757127,7/6/2011,4917,9.33,6.92,45875.61,34025.64,11849.97
+Sub-Saharan Africa,Burundi,Baby Food,Online,C,5/24/2017,206018817,7/8/2017,4401,255.28,159.42,1123487.28,701607.42,421879.86
+Sub-Saharan Africa,Swaziland,Vegetables,Offline,H,1/18/2012,349795949,2/26/2012,1249,154.06,90.93,192420.94,113571.57,78849.37
+Middle East and North Africa,Morocco,Beverages,Offline,L,11/7/2013,882887351,12/6/2013,4842,47.45,31.79,229752.90,153927.18,75825.72
+Europe,Finland,Office Supplies,Online,H,12/21/2011,719404351,1/10/2012,6589,651.21,524.96,4290822.69,3458961.44,831861.25
+Europe,Georgia,Personal Care,Offline,L,7/24/2015,643770778,7/31/2015,4934,81.73,56.67,403255.82,279609.78,123646.04
+Middle East and North Africa,Morocco,Clothes,Online,C,2/17/2012,160722959,4/5/2012,350,109.28,35.84,38248.00,12544.00,25704.00
+Europe,Armenia,Meat,Offline,C,10/1/2016,645309722,11/6/2016,342,421.89,364.69,144286.38,124723.98,19562.40
+Sub-Saharan Africa,Malawi,Cosmetics,Offline,C,4/11/2015,392892396,5/14/2015,4446,437.20,263.33,1943791.20,1170765.18,773026.02
+Europe,Malta,Cereal,Offline,M,7/20/2013,469144809,8/24/2013,9229,205.70,117.11,1898405.30,1080808.19,817597.11
+Sub-Saharan Africa,Angola,Vegetables,Offline,H,11/29/2010,660053288,12/2/2010,3291,154.06,90.93,507011.46,299250.63,207760.83
+Europe,Norway,Cosmetics,Online,L,7/20/2011,821916663,8/26/2011,2260,437.20,263.33,988072.00,595125.80,392946.20
+Central America and the Caribbean,Dominican Republic,Personal Care,Online,M,2/21/2013,431346261,4/9/2013,3799,81.73,56.67,310492.27,215289.33,95202.94
+Europe,Austria,Household,Offline,M,8/27/2010,835265910,10/1/2010,2599,668.27,502.54,1736833.73,1306101.46,430732.27
+Central America and the Caribbean,Saint Kitts and Nevis ,Cosmetics,Online,C,4/4/2015,300911939,4/19/2015,5384,437.20,263.33,2353884.80,1417768.72,936116.08
+Asia,Tajikistan,Cereal,Offline,H,9/4/2012,765833175,10/12/2012,5910,205.70,117.11,1215687.00,692120.10,523566.90
+Asia,Singapore,Baby Food,Offline,C,6/6/2012,187890946,6/26/2012,9961,255.28,159.42,2542844.08,1587982.62,954861.46
+Europe,Greece,Household,Online,L,9/26/2013,195259082,10/11/2013,356,668.27,502.54,237904.12,178904.24,58999.88
+North America,United States of America,Personal Care,Offline,H,11/18/2016,236423909,12/28/2016,1943,81.73,56.67,158801.39,110109.81,48691.58
+Sub-Saharan Africa,Central African Republic,Meat,Offline,H,11/9/2011,730184257,12/28/2011,6603,421.89,364.69,2785739.67,2408048.07,377691.60
+Sub-Saharan Africa,The Gambia,Meat,Online,M,6/6/2012,815651452,6/17/2012,8245,421.89,364.69,3478483.05,3006869.05,471614.00
+Asia,North Korea,Fruits,Online,C,7/7/2014,602249324,8/10/2014,7813,9.33,6.92,72895.29,54065.96,18829.33
+Sub-Saharan Africa,Madagascar,Snacks,Offline,H,1/29/2015,719714200,3/6/2015,8280,152.58,97.44,1263362.40,806803.20,456559.20
+Central America and the Caribbean,El Salvador,Personal Care,Online,H,12/12/2015,968094909,1/7/2016,9652,81.73,56.67,788857.96,546978.84,241879.12
+Australia and Oceania,New Zealand,Office Supplies,Offline,H,6/6/2012,767752778,7/3/2012,3963,651.21,524.96,2580745.23,2080416.48,500328.75
+Sub-Saharan Africa,The Gambia,Household,Online,M,4/10/2012,509361636,5/28/2012,282,668.27,502.54,188452.14,141716.28,46735.86
+Sub-Saharan Africa,Liberia,Baby Food,Offline,L,9/15/2016,203907811,9/26/2016,9707,255.28,159.42,2478002.96,1547489.94,930513.02
+Middle East and North Africa,Oman,Personal Care,Offline,M,8/31/2016,832690131,9/29/2016,369,81.73,56.67,30158.37,20911.23,9247.14
+Asia,Singapore,Baby Food,Offline,C,9/22/2011,297319924,10/18/2011,2428,255.28,159.42,619819.84,387071.76,232748.08
+Sub-Saharan Africa,Tanzania,Cereal,Offline,H,11/18/2013,169721019,12/3/2013,3076,205.70,117.11,632733.20,360230.36,272502.84
+Australia and Oceania,Marshall Islands,Office Supplies,Offline,L,6/26/2013,742129743,7/19/2013,1537,651.21,524.96,1000909.77,806863.52,194046.25
+Australia and Oceania,Papua New Guinea,Clothes,Offline,C,4/21/2013,577094924,5/4/2013,4067,109.28,35.84,444441.76,145761.28,298680.48
+Central America and the Caribbean,Grenada,Vegetables,Online,C,3/4/2017,557477891,3/19/2017,8951,154.06,90.93,1378991.06,813914.43,565076.63
+Sub-Saharan Africa,Seychelles ,Clothes,Online,M,1/21/2011,736452472,3/7/2011,1507,109.28,35.84,164684.96,54010.88,110674.08
+Central America and the Caribbean,Saint Lucia,Fruits,Offline,M,4/12/2012,787504994,5/12/2012,9083,9.33,6.92,84744.39,62854.36,21890.03
+Middle East and North Africa,Turkey,Fruits,Online,C,9/22/2012,454434287,10/31/2012,6059,9.33,6.92,56530.47,41928.28,14602.19
+Sub-Saharan Africa,Sierra Leone,Household,Online,C,12/1/2012,901351678,12/4/2012,8846,668.27,502.54,5911516.42,4445468.84,1466047.58
+Asia,Laos,Beverages,Online,L,8/28/2010,662680995,10/10/2010,888,47.45,31.79,42135.60,28229.52,13906.08
+Europe,Cyprus,Clothes,Online,C,5/17/2012,593158566,6/25/2012,7656,109.28,35.84,836647.68,274391.04,562256.64
+Europe,Serbia,Vegetables,Offline,C,3/22/2014,717833220,4/3/2014,1657,154.06,90.93,255277.42,150671.01,104606.41
+Europe,Belgium,Vegetables,Online,H,5/26/2013,682066285,7/13/2013,7426,154.06,90.93,1144049.56,675246.18,468803.38
+Sub-Saharan Africa,Zimbabwe,Clothes,Online,M,12/22/2011,201531589,1/9/2012,6530,109.28,35.84,713598.40,234035.20,479563.20
+Europe,Greece,Cereal,Online,H,1/24/2013,412215459,1/31/2013,2569,205.70,117.11,528443.30,300855.59,227587.71
+Asia,South Korea,Cosmetics,Offline,L,1/29/2017,720416724,3/12/2017,6173,437.20,263.33,2698835.60,1625536.09,1073299.51
+Europe,Bosnia and Herzegovina,Office Supplies,Offline,C,5/2/2010,152746713,5/8/2010,2,651.21,524.96,1302.42,1049.92,252.50
+Sub-Saharan Africa,Mauritius ,Office Supplies,Offline,M,4/20/2014,506129252,5/18/2014,3748,651.21,524.96,2440735.08,1967550.08,473185.00
+Middle East and North Africa,Israel,Meat,Online,H,8/21/2013,497800672,10/6/2013,9136,421.89,364.69,3854387.04,3331807.84,522579.20
+Europe,Italy,Cereal,Online,M,1/6/2013,715309798,2/10/2013,4920,205.70,117.11,1012044.00,576181.20,435862.80
+Europe,Belarus,Fruits,Online,L,8/1/2010,466517961,9/7/2010,1886,9.33,6.92,17596.38,13051.12,4545.26
+Middle East and North Africa,Iran,Fruits,Online,C,12/3/2016,929598987,1/3/2017,7853,9.33,6.92,73268.49,54342.76,18925.73
+Middle East and North Africa,Jordan,Fruits,Online,L,5/21/2013,203039205,5/29/2013,2667,9.33,6.92,24883.11,18455.64,6427.47
+Sub-Saharan Africa,South Africa,Cosmetics,Online,C,6/20/2016,955637443,8/9/2016,3210,437.20,263.33,1403412.00,845289.30,558122.70
+Sub-Saharan Africa,Benin,Beverages,Online,L,6/9/2013,976505029,7/27/2013,8393,47.45,31.79,398247.85,266813.47,131434.38
+Europe,Latvia,Meat,Offline,C,7/24/2011,825065791,8/28/2011,4157,421.89,364.69,1753796.73,1516016.33,237780.40
+Sub-Saharan Africa,Lesotho,Meat,Offline,M,8/6/2011,681056058,8/11/2011,8477,421.89,364.69,3576361.53,3091477.13,484884.40
+Australia and Oceania,Fiji,Clothes,Online,L,7/31/2011,794524657,9/13/2011,6357,109.28,35.84,694692.96,227834.88,466858.08
+Sub-Saharan Africa,Niger,Clothes,Offline,H,8/12/2010,135832917,9/27/2010,4834,109.28,35.84,528259.52,173250.56,355008.96
+Sub-Saharan Africa,Swaziland,Fruits,Offline,M,8/25/2012,445654666,10/11/2012,7974,9.33,6.92,74397.42,55180.08,19217.34
+Europe,Iceland,Office Supplies,Online,L,2/18/2015,384976232,4/3/2015,1877,651.21,524.96,1222321.17,985349.92,236971.25
+Australia and Oceania,New Zealand,Baby Food,Offline,C,10/15/2012,485096442,11/9/2012,9672,255.28,159.42,2469068.16,1541910.24,927157.92
+Middle East and North Africa,Lebanon,Beverages,Offline,H,7/19/2016,897626626,8/27/2016,6521,47.45,31.79,309421.45,207302.59,102118.86
+Asia,South Korea,Clothes,Online,H,11/28/2011,944490611,12/22/2011,4615,109.28,35.84,504327.20,165401.60,338925.60
+Europe,Hungary,Office Supplies,Offline,C,9/18/2015,467924726,10/20/2015,8179,651.21,524.96,5326246.59,4293647.84,1032598.75
+Europe,Greece,Cereal,Offline,L,10/23/2011,280477797,10/24/2011,8468,205.70,117.11,1741867.60,991687.48,750180.12
+Middle East and North Africa,Iran,Household,Online,M,5/21/2015,815011155,6/26/2015,8767,668.27,502.54,5858723.09,4405768.18,1452954.91
+Europe,Bulgaria,Fruits,Online,L,3/12/2016,774698626,4/7/2016,9394,9.33,6.92,87646.02,65006.48,22639.54
+Middle East and North Africa,Egypt,Meat,Online,H,8/17/2012,283026540,9/13/2012,2697,421.89,364.69,1137837.33,983568.93,154268.40
+Central America and the Caribbean,The Bahamas,Vegetables,Online,C,7/4/2015,433793723,8/4/2015,8057,154.06,90.93,1241261.42,732623.01,508638.41
+Middle East and North Africa,Azerbaijan,Fruits,Offline,C,12/26/2013,141111505,2/8/2014,6885,9.33,6.92,64237.05,47644.20,16592.85
+Asia,Kazakhstan,Baby Food,Offline,L,3/25/2017,189403712,4/3/2017,7622,255.28,159.42,1945744.16,1215099.24,730644.92
+Middle East and North Africa,Jordan,Baby Food,Online,M,9/27/2012,983406674,11/3/2012,743,255.28,159.42,189673.04,118449.06,71223.98
+Australia and Oceania,Marshall Islands,Snacks,Online,C,8/6/2015,298169219,8/26/2015,3753,152.58,97.44,572632.74,365692.32,206940.42
+Central America and the Caribbean,Barbados,Clothes,Online,H,8/23/2011,929052674,9/12/2011,6187,109.28,35.84,676115.36,221742.08,454373.28
+Sub-Saharan Africa,Burkina Faso,Cosmetics,Online,H,4/21/2014,341730868,5/24/2014,4613,437.20,263.33,2016803.60,1214741.29,802062.31
+Sub-Saharan Africa,Namibia,Cosmetics,Online,M,5/4/2015,122190129,5/23/2015,7629,437.20,263.33,3335398.80,2008944.57,1326454.23
+Australia and Oceania,East Timor,Beverages,Offline,M,5/15/2011,126729285,6/13/2011,867,47.45,31.79,41139.15,27561.93,13577.22
+Sub-Saharan Africa,Liberia,Meat,Offline,L,3/21/2015,731959664,4/13/2015,1985,421.89,364.69,837451.65,723909.65,113542.00
+Central America and the Caribbean,Haiti,Baby Food,Offline,M,4/11/2014,584805095,4/14/2014,5678,255.28,159.42,1449479.84,905186.76,544293.08
+Europe,Slovenia,Cereal,Online,M,2/21/2012,652501904,3/25/2012,8668,205.70,117.11,1783007.60,1015109.48,767898.12
+Sub-Saharan Africa,Zimbabwe,Snacks,Online,M,4/5/2017,172598922,4/18/2017,4711,152.58,97.44,718804.38,459039.84,259764.54
+Middle East and North Africa,Syria,Clothes,Online,L,6/5/2016,702957475,6/16/2016,9593,109.28,35.84,1048323.04,343813.12,704509.92
+Middle East and North Africa,Turkey,Household,Online,H,6/10/2016,271751391,7/9/2016,6130,668.27,502.54,4096495.10,3080570.20,1015924.90
+Central America and the Caribbean,El Salvador,Cereal,Online,L,1/3/2010,127467000,2/7/2010,9173,205.70,117.11,1886886.10,1074250.03,812636.07
+Europe,Bulgaria,Household,Online,M,5/31/2017,688903129,7/2/2017,600,668.27,502.54,400962.00,301524.00,99438.00
+Europe,Finland,Personal Care,Online,M,7/25/2014,195171105,9/4/2014,4322,81.73,56.67,353237.06,244927.74,108309.32
+Asia,Brunei,Meat,Online,L,7/6/2012,555694758,7/24/2012,1283,421.89,364.69,541284.87,467897.27,73387.60
+North America,Greenland,Office Supplies,Online,C,10/22/2015,600210416,11/23/2015,4455,651.21,524.96,2901140.55,2338696.80,562443.75
+Europe,Vatican City,Household,Offline,C,2/13/2011,128766906,3/28/2011,3844,668.27,502.54,2568829.88,1931763.76,637066.12
+Europe,San Marino,Vegetables,Offline,L,6/27/2016,361725556,7/18/2016,1485,154.06,90.93,228779.10,135031.05,93748.05
+Europe,Armenia,Personal Care,Online,C,12/6/2016,789760196,1/2/2017,6447,81.73,56.67,526913.31,365351.49,161561.82
+Sub-Saharan Africa,Democratic Republic of the Congo,Cosmetics,Online,H,9/5/2013,523857152,10/9/2013,9827,437.20,263.33,4296364.40,2587743.91,1708620.49
+Australia and Oceania,Palau,Cosmetics,Offline,H,10/25/2012,545315253,10/28/2012,9756,437.20,263.33,4265323.20,2569047.48,1696275.72
+Asia,Laos,Cosmetics,Offline,L,12/1/2013,555745828,12/10/2013,6395,437.20,263.33,2795894.00,1683995.35,1111898.65
+Europe,Slovakia,Cosmetics,Online,C,11/1/2013,327072703,11/16/2013,6936,437.20,263.33,3032419.20,1826456.88,1205962.32
+Central America and the Caribbean,Barbados,Household,Offline,L,6/28/2010,151532208,8/15/2010,603,668.27,502.54,402966.81,303031.62,99935.19
+Asia,India,Fruits,Offline,H,3/21/2014,391673171,4/11/2014,3650,9.33,6.92,34054.50,25258.00,8796.50
+Europe,Switzerland,Vegetables,Online,H,9/18/2013,130356919,10/1/2013,4364,154.06,90.93,672317.84,396818.52,275499.32
+Asia,Cambodia,Personal Care,Offline,L,2/3/2010,320757281,3/15/2010,8062,81.73,56.67,658907.26,456873.54,202033.72
+Europe,Portugal,Cereal,Offline,H,2/5/2013,636360585,3/8/2013,2093,205.70,117.11,430530.10,245111.23,185418.87
+Asia,Turkmenistan,Cosmetics,Online,C,8/14/2014,820965659,8/18/2014,837,437.20,263.33,365936.40,220407.21,145529.19
+Middle East and North Africa,Oman,Cereal,Online,H,3/4/2015,238683831,4/14/2015,705,205.70,117.11,145018.50,82562.55,62455.95
+Europe,Belarus,Beverages,Online,M,7/24/2012,123938930,8/2/2012,5138,47.45,31.79,243798.10,163337.02,80461.08
+Sub-Saharan Africa,Mozambique,Personal Care,Online,C,3/23/2013,431467282,5/4/2013,9612,81.73,56.67,785588.76,544712.04,240876.72
+Sub-Saharan Africa,Botswana,Fruits,Offline,M,4/20/2013,286317718,4/30/2013,6630,9.33,6.92,61857.90,45879.60,15978.30
+Central America and the Caribbean,Dominican Republic,Meat,Offline,H,1/2/2010,233851563,2/21/2010,729,421.89,364.69,307557.81,265859.01,41698.80
+Sub-Saharan Africa,Comoros,Office Supplies,Offline,L,12/17/2012,889742648,1/16/2013,3476,651.21,524.96,2263605.96,1824760.96,438845.00
+Asia,Kyrgyzstan,Meat,Online,C,2/26/2010,689977300,4/5/2010,8471,421.89,364.69,3573830.19,3089288.99,484541.20
+Asia,Laos,Meat,Online,C,2/18/2017,840854346,4/8/2017,6342,421.89,364.69,2675626.38,2312863.98,362762.40
+Asia,Japan,Beverages,Online,C,8/24/2012,368985116,10/11/2012,9750,47.45,31.79,462637.50,309952.50,152685.00
+Sub-Saharan Africa,Burkina Faso,Vegetables,Online,H,8/2/2010,171293437,8/12/2010,8389,154.06,90.93,1292409.34,762811.77,529597.57
+Central America and the Caribbean,Costa Rica,Baby Food,Offline,H,10/5/2010,765015637,11/1/2010,3982,255.28,159.42,1016524.96,634810.44,381714.52
+Sub-Saharan Africa,Comoros,Vegetables,Online,M,4/6/2010,937700545,4/30/2010,5284,154.06,90.93,814053.04,480474.12,333578.92
+Australia and Oceania,Palau,Personal Care,Offline,H,10/26/2014,897209489,12/7/2014,3081,81.73,56.67,251810.13,174600.27,77209.86
+Central America and the Caribbean,Grenada,Beverages,Online,H,4/16/2012,921716296,4/25/2012,5189,47.45,31.79,246218.05,164958.31,81259.74
+Sub-Saharan Africa,Guinea,Vegetables,Offline,C,4/28/2014,909707295,5/15/2014,1459,154.06,90.93,224773.54,132666.87,92106.67
+Asia,Cambodia,Beverages,Offline,L,9/9/2014,829981315,10/26/2014,8770,47.45,31.79,416136.50,278798.30,137338.20
+Sub-Saharan Africa,Kenya,Personal Care,Online,M,10/23/2015,271649682,12/4/2015,6032,81.73,56.67,492995.36,341833.44,151161.92
+Sub-Saharan Africa,Swaziland,Fruits,Online,M,5/16/2017,694136226,6/18/2017,9189,9.33,6.92,85733.37,63587.88,22145.49
+Asia,South Korea,Personal Care,Online,L,7/24/2012,477177274,8/9/2012,6214,81.73,56.67,507870.22,352147.38,155722.84
+Europe,Kosovo,Office Supplies,Offline,C,7/26/2014,770821654,8/19/2014,2112,651.21,524.96,1375355.52,1108715.52,266640.00
+Sub-Saharan Africa,Swaziland,Fruits,Online,M,11/28/2014,545430696,12/2/2014,3918,9.33,6.92,36554.94,27112.56,9442.38
+Australia and Oceania,Federated States of Micronesia,Clothes,Online,M,7/17/2017,641678225,8/27/2017,5701,109.28,35.84,623005.28,204323.84,418681.44
+Sub-Saharan Africa,Nigeria,Cosmetics,Online,C,5/5/2012,620550572,6/5/2012,3559,437.20,263.33,1555994.80,937191.47,618803.33
+Middle East and North Africa,Saudi Arabia,Cosmetics,Online,H,10/1/2016,113346564,10/14/2016,622,437.20,263.33,271938.40,163791.26,108147.14
+Sub-Saharan Africa,Central African Republic,Clothes,Online,M,5/29/2011,171677529,7/5/2011,2051,109.28,35.84,224133.28,73507.84,150625.44
+Middle East and North Africa,Iraq,Office Supplies,Online,L,2/5/2012,117467296,3/15/2012,38,651.21,524.96,24745.98,19948.48,4797.50
+Europe,United Kingdom,Cosmetics,Online,M,12/14/2012,692952191,1/4/2013,8807,437.20,263.33,3850420.40,2319147.31,1531273.09
+Australia and Oceania,New Zealand,Cosmetics,Offline,M,12/16/2012,910681045,1/8/2013,9613,437.20,263.33,4202803.60,2531391.29,1671412.31
+Central America and the Caribbean,Haiti,Vegetables,Online,H,3/1/2012,303515183,4/18/2012,5742,154.06,90.93,884612.52,522120.06,362492.46
+Australia and Oceania,Vanuatu,Household,Online,L,6/20/2015,274628436,7/26/2015,7512,668.27,502.54,5020044.24,3775080.48,1244963.76
+Europe,Ukraine,Beverages,Offline,L,9/7/2013,947507131,10/20/2013,7271,47.45,31.79,345008.95,231145.09,113863.86
+Australia and Oceania,Papua New Guinea,Beverages,Offline,L,1/22/2010,715950095,2/1/2010,4398,47.45,31.79,208685.10,139812.42,68872.68
+Asia,Japan,Fruits,Offline,C,6/22/2016,294068658,8/6/2016,306,9.33,6.92,2854.98,2117.52,737.46
+Sub-Saharan Africa,Malawi,Personal Care,Offline,C,10/19/2011,466286647,11/28/2011,3436,81.73,56.67,280824.28,194718.12,86106.16
+Middle East and North Africa,Qatar,Meat,Offline,C,10/28/2013,737340390,11/1/2013,4262,421.89,364.69,1798095.18,1554308.78,243786.40
+Sub-Saharan Africa,Botswana,Office Supplies,Offline,C,11/29/2014,682278716,1/1/2015,289,651.21,524.96,188199.69,151713.44,36486.25
+Europe,Ireland,Personal Care,Offline,L,1/21/2016,396462953,2/26/2016,1053,81.73,56.67,86061.69,59673.51,26388.18
+Asia,Bangladesh,Meat,Online,H,7/12/2015,945566928,7/20/2015,3121,421.89,364.69,1316718.69,1138197.49,178521.20
+Asia,South Korea,Cosmetics,Online,C,8/31/2012,315576970,9/14/2012,5093,437.20,263.33,2226659.60,1341139.69,885519.91
+Europe,Russia,Beverages,Offline,M,8/30/2011,162791907,10/19/2011,2598,47.45,31.79,123275.10,82590.42,40684.68
+Asia,North Korea,Household,Online,M,3/12/2010,863823068,4/9/2010,3297,668.27,502.54,2203286.19,1656874.38,546411.81
+Asia,Bangladesh,Meat,Online,L,10/19/2010,165594279,12/8/2010,1882,421.89,364.69,793996.98,686346.58,107650.40
+Europe,Luxembourg,Cosmetics,Online,M,1/26/2017,835341870,2/24/2017,5077,437.20,263.33,2219664.40,1336926.41,882737.99
+Sub-Saharan Africa,Guinea-Bissau,Clothes,Offline,C,9/28/2014,310614669,10/15/2014,6638,109.28,35.84,725400.64,237905.92,487494.72
+Europe,Norway,Household,Offline,C,4/29/2013,149274003,5/29/2013,2350,668.27,502.54,1570434.50,1180969.00,389465.50
+Middle East and North Africa,Libya,Beverages,Offline,H,1/17/2012,179493701,2/7/2012,5030,47.45,31.79,238673.50,159903.70,78769.80
+Sub-Saharan Africa,Chad,Clothes,Online,M,3/8/2011,749760091,3/15/2011,9527,109.28,35.84,1041110.56,341447.68,699662.88
+Australia and Oceania,Tonga,Baby Food,Offline,C,11/15/2015,478872001,12/29/2015,7721,255.28,159.42,1971016.88,1230881.82,740135.06
+Australia and Oceania,Tonga,Beverages,Online,L,3/4/2017,305940759,4/23/2017,3524,47.45,31.79,167213.80,112027.96,55185.84
+Asia,India,Beverages,Online,C,12/27/2010,340390193,1/26/2011,7877,47.45,31.79,373763.65,250409.83,123353.82
+Europe,Estonia,Cosmetics,Offline,C,1/4/2017,311956632,1/10/2017,3755,437.20,263.33,1641686.00,988804.15,652881.85
+Europe,Ukraine,Baby Food,Offline,L,5/5/2014,920688903,6/12/2014,1161,255.28,159.42,296380.08,185086.62,111293.46
+Asia,Laos,Meat,Online,L,6/12/2013,686948335,7/26/2013,2133,421.89,364.69,899891.37,777883.77,122007.60
+Sub-Saharan Africa,South Africa,Household,Offline,C,6/27/2014,901408755,8/1/2014,5737,668.27,502.54,3833864.99,2883071.98,950793.01
+Sub-Saharan Africa,Republic of the Congo,Meat,Online,C,2/15/2011,675056493,3/23/2011,3072,421.89,364.69,1296046.08,1120327.68,175718.40
+Sub-Saharan Africa,Guinea,Beverages,Offline,C,1/5/2017,989190375,1/10/2017,2269,47.45,31.79,107664.05,72131.51,35532.54
+Asia,Nepal,Household,Offline,L,8/1/2016,645421731,8/22/2016,3488,668.27,502.54,2330925.76,1752859.52,578066.24
+Asia,Vietnam,Meat,Online,H,4/6/2014,315674388,5/20/2014,3921,421.89,364.69,1654230.69,1429949.49,224281.20
+Middle East and North Africa,Tunisia ,Cereal,Offline,C,7/16/2015,292184674,7/16/2015,2793,205.70,117.11,574520.10,327088.23,247431.87
+Middle East and North Africa,Algeria,Baby Food,Offline,M,8/10/2015,937501418,8/16/2015,6358,255.28,159.42,1623070.24,1013592.36,609477.88
+Europe,San Marino,Personal Care,Online,L,9/25/2010,434485948,11/3/2010,2902,81.73,56.67,237180.46,164456.34,72724.12
+Middle East and North Africa,Somalia,Personal Care,Offline,L,3/4/2017,636312091,3/18/2017,7743,81.73,56.67,632835.39,438795.81,194039.58
+Europe,Estonia,Baby Food,Offline,H,5/22/2014,316466176,6/2/2014,8229,255.28,159.42,2100699.12,1311867.18,788831.94
+Asia,Malaysia,Vegetables,Offline,H,12/24/2016,118747031,2/10/2017,8740,154.06,90.93,1346484.40,794728.20,551756.20
+Central America and the Caribbean,Nicaragua,Household,Online,C,4/29/2010,307265985,5/4/2010,5688,668.27,502.54,3801119.76,2858447.52,942672.24
+Central America and the Caribbean,Cuba,Cereal,Offline,M,12/10/2014,316446864,12/13/2014,2514,205.70,117.11,517129.80,294414.54,222715.26
+Europe,Kosovo,Household,Online,M,7/18/2014,101025998,8/11/2014,4693,668.27,502.54,3136191.11,2358420.22,777770.89
+Australia and Oceania,Fiji,Vegetables,Offline,H,11/8/2012,586052215,12/16/2012,4729,154.06,90.93,728549.74,430007.97,298541.77
+Australia and Oceania,Marshall Islands,Beverages,Offline,M,8/27/2014,516886842,9/25/2014,7158,47.45,31.79,339647.10,227552.82,112094.28
+Central America and the Caribbean,The Bahamas,Vegetables,Online,M,6/4/2014,509203708,6/24/2014,3548,154.06,90.93,546604.88,322619.64,223985.24
+Sub-Saharan Africa,Mauritius ,Cosmetics,Online,H,4/18/2015,798989140,6/4/2015,7497,437.20,263.33,3277688.40,1974185.01,1303503.39
+Asia,Uzbekistan,Cereal,Offline,L,2/3/2010,792541968,3/8/2010,9635,205.70,117.11,1981919.50,1128354.85,853564.65
+Sub-Saharan Africa,Namibia,Household,Online,H,6/7/2015,416473519,6/23/2015,2624,668.27,502.54,1753540.48,1318664.96,434875.52
+Central America and the Caribbean,El Salvador,Office Supplies,Offline,C,12/1/2014,567707622,12/22/2014,6156,651.21,524.96,4008848.76,3231653.76,777195.00
+Asia,China,Household,Offline,C,12/5/2015,863480603,1/12/2016,1954,668.27,502.54,1305799.58,981963.16,323836.42
+Asia,Philippines,Beverages,Offline,L,7/22/2015,991341292,9/2/2015,8773,47.45,31.79,416278.85,278893.67,137385.18
+Sub-Saharan Africa,Central African Republic,Cereal,Online,H,12/15/2011,259151017,1/9/2012,7400,205.70,117.11,1522180.00,866614.00,655566.00
+Asia,Mongolia,Household,Offline,C,9/15/2015,745083606,9/30/2015,5651,668.27,502.54,3776393.77,2839853.54,936540.23
+Europe,Luxembourg,Personal Care,Offline,H,9/25/2015,547625386,9/29/2015,3376,81.73,56.67,275920.48,191317.92,84602.56
+Middle East and North Africa,Pakistan,Beverages,Offline,C,5/21/2013,535575187,6/13/2013,7454,47.45,31.79,353692.30,236962.66,116729.64
+Australia and Oceania,New Zealand,Meat,Online,M,1/30/2011,298044335,2/13/2011,6797,421.89,364.69,2867586.33,2478797.93,388788.40
+Europe,Montenegro,Fruits,Online,H,1/31/2016,394456660,2/9/2016,7346,9.33,6.92,68538.18,50834.32,17703.86
+Europe,Kosovo,Baby Food,Online,M,1/1/2014,104548490,1/5/2014,7076,255.28,159.42,1806361.28,1128055.92,678305.36
+Sub-Saharan Africa,Zambia,Vegetables,Online,M,6/14/2010,578368651,7/17/2010,991,154.06,90.93,152673.46,90111.63,62561.83
+Asia,Bhutan,Beverages,Offline,H,2/7/2012,786278474,3/19/2012,6128,47.45,31.79,290773.60,194809.12,95964.48
+Asia,Laos,Office Supplies,Online,H,5/3/2015,668951785,5/15/2015,6554,651.21,524.96,4268030.34,3440587.84,827442.50
+Europe,Greece,Cereal,Online,M,1/10/2010,687374913,2/26/2010,8367,205.70,117.11,1721091.90,979859.37,741232.53
+Central America and the Caribbean,Costa Rica,Meat,Online,L,8/11/2013,472846686,9/10/2013,4697,421.89,364.69,1981617.33,1712948.93,268668.40
+Middle East and North Africa,Turkey,Clothes,Online,C,4/23/2014,176978433,5/5/2014,706,109.28,35.84,77151.68,25303.04,51848.64
+Europe,Greece,Vegetables,Online,M,10/4/2012,921693980,11/4/2012,8586,154.06,90.93,1322759.16,780724.98,542034.18
+Sub-Saharan Africa,Eritrea,Cosmetics,Online,M,8/31/2010,749229657,10/8/2010,2560,437.20,263.33,1119232.00,674124.80,445107.20
+Central America and the Caribbean,Haiti,Meat,Offline,M,8/2/2014,472134292,8/25/2014,3884,421.89,364.69,1638620.76,1416455.96,222164.80
+Asia,Sri Lanka,Cosmetics,Online,M,12/28/2016,523269212,2/4/2017,5843,437.20,263.33,2554559.60,1538637.19,1015922.41
+Sub-Saharan Africa,Ethiopia,Fruits,Online,H,3/19/2015,505808246,4/12/2015,8755,9.33,6.92,81684.15,60584.60,21099.55
+Australia and Oceania,East Timor,Office Supplies,Online,H,3/19/2015,543237721,4/25/2015,4969,651.21,524.96,3235862.49,2608526.24,627336.25
+Europe,Montenegro,Household,Online,L,8/29/2012,829356467,9/16/2012,3864,668.27,502.54,2582195.28,1941814.56,640380.72
+Australia and Oceania,Solomon Islands,Office Supplies,Online,H,11/13/2011,278275811,12/7/2011,6851,651.21,524.96,4461439.71,3596500.96,864938.75
+Central America and the Caribbean,Honduras,Office Supplies,Online,L,5/31/2014,574419581,7/19/2014,2374,651.21,524.96,1545972.54,1246255.04,299717.50
+Europe,Czech Republic,Cereal,Offline,C,5/20/2015,322524106,5/20/2015,905,205.70,117.11,186158.50,105984.55,80173.95
+Europe,Portugal,Cereal,Offline,M,9/14/2014,897638213,10/8/2014,9950,205.70,117.11,2046715.00,1165244.50,881470.50
+Middle East and North Africa,Yemen,Personal Care,Offline,M,5/15/2013,595123231,6/13/2013,9044,81.73,56.67,739166.12,512523.48,226642.64
+Europe,Italy,Baby Food,Offline,L,3/23/2017,480652987,4/5/2017,4755,255.28,159.42,1213856.40,758042.10,455814.30
+Europe,France,Office Supplies,Online,C,6/20/2010,340213811,7/26/2010,5682,651.21,524.96,3700175.22,2982822.72,717352.50
+Asia,Malaysia,Cereal,Online,C,6/5/2012,930104529,7/24/2012,7454,205.70,117.11,1533287.80,872937.94,660349.86
+Europe,Iceland,Baby Food,Online,H,3/20/2013,826936471,3/30/2013,7733,255.28,159.42,1974080.24,1232794.86,741285.38
+Europe,Norway,Cosmetics,Online,H,5/14/2015,477633464,6/7/2015,1211,437.20,263.33,529449.20,318892.63,210556.57
+Europe,Latvia,Meat,Online,L,11/25/2014,849431836,11/28/2014,4611,421.89,364.69,1945334.79,1681585.59,263749.20
+Sub-Saharan Africa,Cape Verde,Snacks,Online,C,9/12/2012,279880416,10/31/2012,1689,152.58,97.44,257707.62,164576.16,93131.46
+Sub-Saharan Africa,Republic of the Congo,Snacks,Online,L,9/13/2010,326840531,10/10/2010,8231,152.58,97.44,1255885.98,802028.64,453857.34
+Middle East and North Africa,Qatar,Fruits,Online,M,9/12/2015,818486011,10/23/2015,7054,9.33,6.92,65813.82,48813.68,17000.14
+Sub-Saharan Africa,Sudan,Household,Offline,M,10/29/2012,303303182,11/6/2012,3006,668.27,502.54,2008819.62,1510635.24,498184.38
+Sub-Saharan Africa,Cote d'Ivoire,Personal Care,Online,L,10/21/2014,100090873,11/24/2014,7968,81.73,56.67,651224.64,451546.56,199678.08
+Sub-Saharan Africa,Cape Verde,Vegetables,Offline,M,9/5/2012,247960412,10/11/2012,5851,154.06,90.93,901405.06,532031.43,369373.63
+Asia,Taiwan,Meat,Online,M,7/5/2017,856335628,7/26/2017,7597,421.89,364.69,3205098.33,2770549.93,434548.40
+Middle East and North Africa,Libya,Cereal,Offline,H,2/11/2011,754952847,2/20/2011,6179,205.70,117.11,1271020.30,723622.69,547397.61
+Central America and the Caribbean,Belize,Meat,Online,C,6/19/2010,643860900,6/29/2010,1603,421.89,364.69,676289.67,584598.07,91691.60
+Sub-Saharan Africa,Republic of the Congo,Clothes,Offline,C,11/17/2010,843421113,12/31/2010,5905,109.28,35.84,645298.40,211635.20,433663.20
+Europe,United Kingdom,Baby Food,Online,H,7/8/2012,844307315,7/29/2012,8152,255.28,159.42,2081042.56,1299591.84,781450.72
+Sub-Saharan Africa,Guinea-Bissau,Baby Food,Offline,H,8/13/2016,657505834,8/28/2016,9442,255.28,159.42,2410353.76,1505243.64,905110.12
+Central America and the Caribbean,Saint Kitts and Nevis ,Snacks,Offline,H,2/11/2014,364315497,3/20/2014,7906,152.58,97.44,1206297.48,770360.64,435936.84
+Middle East and North Africa,Israel,Fruits,Offline,C,2/25/2012,566347634,3/6/2012,3705,9.33,6.92,34567.65,25638.60,8929.05
+Sub-Saharan Africa,Senegal,Baby Food,Offline,M,2/28/2015,135526072,2/28/2015,4031,255.28,159.42,1029033.68,642622.02,386411.66
+Australia and Oceania,Vanuatu,Household,Offline,M,6/26/2013,264087140,7/28/2013,8108,668.27,502.54,5418333.16,4074594.32,1343738.84
+Europe,Finland,Snacks,Online,H,6/20/2017,414579665,7/10/2017,2191,152.58,97.44,334302.78,213491.04,120811.74
+Europe,Switzerland,Cereal,Offline,M,10/18/2015,569864976,11/30/2015,4565,205.70,117.11,939020.50,534607.15,404413.35
+Europe,United Kingdom,Clothes,Online,L,2/26/2017,783116900,3/14/2017,548,109.28,35.84,59885.44,19640.32,40245.12
+Europe,Andorra,Cosmetics,Online,L,2/26/2016,727821767,3/16/2016,7489,437.20,263.33,3274190.80,1972078.37,1302112.43
+Asia,Maldives,Clothes,Offline,C,3/30/2012,147778403,4/19/2012,9768,109.28,35.84,1067447.04,350085.12,717361.92
+Asia,Philippines,Office Supplies,Online,C,7/11/2013,207098138,8/29/2013,3796,651.21,524.96,2471993.16,1992748.16,479245.00
+Australia and Oceania,East Timor,Meat,Online,L,3/21/2010,340204799,4/16/2010,3015,421.89,364.69,1271998.35,1099540.35,172458.00
+Asia,China,Beverages,Offline,C,5/4/2016,501834714,6/7/2016,2899,47.45,31.79,137557.55,92159.21,45398.34
+Middle East and North Africa,Tunisia ,Household,Offline,M,11/18/2012,717036712,12/30/2012,5952,668.27,502.54,3977543.04,2991118.08,986424.96
+Europe,Georgia,Meat,Offline,C,3/15/2012,631172120,4/20/2012,6711,421.89,364.69,2831303.79,2447434.59,383869.20
+Europe,San Marino,Office Supplies,Offline,M,5/11/2016,859914767,6/18/2016,6744,651.21,524.96,4391760.24,3540330.24,851430.00
+Central America and the Caribbean,Saint Kitts and Nevis ,Beverages,Offline,L,5/1/2013,739250981,6/3/2013,9648,47.45,31.79,457797.60,306709.92,151087.68
+Europe,Andorra,Snacks,Online,L,2/4/2011,575479590,3/22/2011,6054,152.58,97.44,923719.32,589901.76,333817.56
+Sub-Saharan Africa,Cameroon,Personal Care,Online,L,2/13/2011,295211923,2/25/2011,8623,81.73,56.67,704757.79,488665.41,216092.38
+Central America and the Caribbean,Costa Rica,Clothes,Offline,H,2/24/2012,795371806,3/4/2012,7047,109.28,35.84,770096.16,252564.48,517531.68
+North America,Greenland,Personal Care,Offline,L,12/29/2013,793195569,1/24/2014,3050,81.73,56.67,249276.50,172843.50,76433.00
+Central America and the Caribbean,Antigua and Barbuda ,Personal Care,Offline,H,9/30/2013,876232039,11/7/2013,5387,81.73,56.67,440279.51,305281.29,134998.22
+Europe,Spain,Snacks,Offline,M,2/19/2017,352342545,3/27/2017,4844,152.58,97.44,739097.52,471999.36,267098.16
+Central America and the Caribbean,Panama,Household,Offline,C,1/8/2012,399700915,2/27/2012,9238,668.27,502.54,6173478.26,4642464.52,1531013.74
+Asia,Taiwan,Baby Food,Online,C,1/16/2010,916793477,2/4/2010,8418,255.28,159.42,2148947.04,1341997.56,806949.48
+Europe,Slovenia,Cereal,Online,H,7/22/2012,972419059,8/17/2012,9264,205.70,117.11,1905604.80,1084907.04,820697.76
+Middle East and North Africa,Kuwait,Meat,Online,L,5/26/2014,155688989,6/9/2014,686,421.89,364.69,289416.54,250177.34,39239.20
+Asia,South Korea,Meat,Offline,M,4/8/2015,826027095,4/22/2015,8628,421.89,364.69,3640066.92,3146545.32,493521.60
+Sub-Saharan Africa,Lesotho,Meat,Offline,M,12/1/2015,463169705,12/22/2015,1063,421.89,364.69,448469.07,387665.47,60803.60
+Europe,Spain,Meat,Offline,M,5/20/2014,217165648,6/8/2014,2996,421.89,364.69,1263982.44,1092611.24,171371.20
+Middle East and North Africa,Israel,Snacks,Online,C,5/5/2017,858376252,5/9/2017,1463,152.58,97.44,223224.54,142554.72,80669.82
+Middle East and North Africa,Syria,Vegetables,Online,C,8/8/2013,527475345,8/20/2013,531,154.06,90.93,81805.86,48283.83,33522.03
+Australia and Oceania,Nauru,Cosmetics,Offline,M,10/3/2015,585449254,11/13/2015,6299,437.20,263.33,2753922.80,1658715.67,1095207.13
+Australia and Oceania,Samoa ,Baby Food,Offline,L,12/12/2010,663596808,1/6/2011,1897,255.28,159.42,484266.16,302419.74,181846.42
+Sub-Saharan Africa,South Sudan,Baby Food,Offline,C,2/11/2010,913529336,2/27/2010,2486,255.28,159.42,634626.08,396318.12,238307.96
+Central America and the Caribbean,Haiti,Office Supplies,Online,M,11/23/2013,657170665,11/24/2013,258,651.21,524.96,168012.18,135439.68,32572.50
+Asia,Cambodia,Vegetables,Offline,L,6/4/2016,636757123,7/8/2016,9438,154.06,90.93,1454018.28,858197.34,595820.94
+Europe,Denmark,Baby Food,Online,L,9/6/2016,764837539,9/6/2016,1279,255.28,159.42,326503.12,203898.18,122604.94
+Sub-Saharan Africa,Burkina Faso,Fruits,Online,C,9/20/2014,574273240,9/25/2014,9068,9.33,6.92,84604.44,62750.56,21853.88
+Central America and the Caribbean,Barbados,Cereal,Offline,C,6/7/2015,568238055,7/17/2015,3123,205.70,117.11,642401.10,365734.53,276666.57
+Europe,Latvia,Fruits,Offline,H,3/19/2017,870218312,3/27/2017,5792,9.33,6.92,54039.36,40080.64,13958.72
+Australia and Oceania,Samoa ,Personal Care,Online,C,9/26/2015,774012839,9/29/2015,6454,81.73,56.67,527485.42,365748.18,161737.24
+Australia and Oceania,Tonga,Clothes,Online,C,4/21/2015,993732964,5/22/2015,6522,109.28,35.84,712724.16,233748.48,478975.68
+Europe,Spain,Office Supplies,Online,L,7/2/2017,513802516,8/7/2017,4437,651.21,524.96,2889418.77,2329247.52,560171.25
+Europe,Slovakia,Beverages,Online,M,5/31/2017,638957822,6/24/2017,673,47.45,31.79,31933.85,21394.67,10539.18
+Europe,Bulgaria,Baby Food,Online,H,12/19/2014,944247710,1/31/2015,2736,255.28,159.42,698446.08,436173.12,262272.96
+Middle East and North Africa,Morocco,Clothes,Online,L,2/26/2011,625033509,2/26/2011,160,109.28,35.84,17484.80,5734.40,11750.40
+Sub-Saharan Africa,Niger,Household,Offline,H,10/29/2011,746989047,12/13/2011,9514,668.27,502.54,6357920.78,4781165.56,1576755.22
+Sub-Saharan Africa,Central African Republic,Snacks,Online,C,4/24/2016,196100652,5/31/2016,9395,152.58,97.44,1433489.10,915448.80,518040.30
+Sub-Saharan Africa,Eritrea,Office Supplies,Online,M,9/1/2013,628667151,9/26/2013,5435,651.21,524.96,3539326.35,2853157.60,686168.75
+Sub-Saharan Africa,Ghana,Meat,Offline,L,9/17/2016,621299874,10/8/2016,5294,421.89,364.69,2233485.66,1930668.86,302816.80
+Australia and Oceania,Palau,Cereal,Online,H,10/31/2012,620922648,11/27/2012,3665,205.70,117.11,753890.50,429208.15,324682.35
+Europe,Netherlands,Baby Food,Offline,H,3/16/2013,694771802,3/21/2013,7270,255.28,159.42,1855885.60,1158983.40,696902.20
+Sub-Saharan Africa,Burkina Faso,Cosmetics,Online,H,2/16/2011,980396163,2/24/2011,9866,437.20,263.33,4313415.20,2598013.78,1715401.42
+Asia,Kazakhstan,Cosmetics,Online,M,2/13/2016,335657060,2/15/2016,7238,437.20,263.33,3164453.60,1905982.54,1258471.06
+Europe,Bosnia and Herzegovina,Snacks,Offline,C,3/31/2012,388728320,5/10/2012,2203,152.58,97.44,336133.74,214660.32,121473.42
+Asia,Taiwan,Clothes,Online,L,12/13/2014,588096272,1/20/2015,9611,109.28,35.84,1050290.08,344458.24,705831.84
+Europe,Vatican City,Vegetables,Offline,L,3/18/2014,452559745,3/19/2014,1340,154.06,90.93,206440.40,121846.20,84594.20
+Europe,Portugal,Baby Food,Offline,M,3/27/2016,921230065,5/16/2016,1303,255.28,159.42,332629.84,207724.26,124905.58
+Middle East and North Africa,United Arab Emirates,Fruits,Offline,H,12/5/2016,303531062,1/14/2017,441,9.33,6.92,4114.53,3051.72,1062.81
+Asia,Turkmenistan,Fruits,Offline,C,4/6/2013,129199063,5/17/2013,1729,9.33,6.92,16131.57,11964.68,4166.89
+Sub-Saharan Africa,Cameroon,Cosmetics,Online,L,8/19/2014,198282897,8/30/2014,5170,437.20,263.33,2260324.00,1361416.10,898907.90
+Europe,Malta,Fruits,Online,M,5/9/2016,831143891,6/1/2016,2802,9.33,6.92,26142.66,19389.84,6752.82
+Middle East and North Africa,Saudi Arabia,Office Supplies,Offline,L,1/8/2011,618455874,2/13/2011,3692,651.21,524.96,2404267.32,1938152.32,466115.00
+Sub-Saharan Africa,Tanzania,Household,Online,L,1/4/2015,471205174,1/27/2015,8937,668.27,502.54,5972328.99,4491199.98,1481129.01
+Central America and the Caribbean,Costa Rica,Baby Food,Online,L,9/8/2011,470690619,10/24/2011,6669,255.28,159.42,1702462.32,1063171.98,639290.34
+Europe,Estonia,Cereal,Online,M,10/7/2015,318523538,11/5/2015,7048,205.70,117.11,1449773.60,825391.28,624382.32
+Central America and the Caribbean,Panama,Household,Offline,H,7/14/2016,686627757,8/18/2016,7267,668.27,502.54,4856318.09,3651958.18,1204359.91
+Sub-Saharan Africa,Mali,Office Supplies,Online,H,11/28/2011,967239606,1/9/2012,6548,651.21,524.96,4264123.08,3437438.08,826685.00
+Central America and the Caribbean,Dominican Republic,Beverages,Offline,H,3/24/2012,622907912,4/5/2012,1148,47.45,31.79,54472.60,36494.92,17977.68
+Central America and the Caribbean,Guatemala,Household,Offline,L,10/4/2013,536494004,10/29/2013,9353,668.27,502.54,6250329.31,4700256.62,1550072.69
+Sub-Saharan Africa,Sierra Leone,Cosmetics,Online,H,1/15/2010,761171710,3/3/2010,6479,437.20,263.33,2832618.80,1706115.07,1126503.73
+Europe,Armenia,Meat,Offline,H,10/26/2010,970427358,10/31/2010,9875,421.89,364.69,4166163.75,3601313.75,564850.00
+Asia,Vietnam,Fruits,Offline,L,7/23/2015,908059775,8/11/2015,3921,9.33,6.92,36582.93,27133.32,9449.61
+Central America and the Caribbean,Panama,Vegetables,Online,H,3/13/2017,838180291,4/2/2017,5029,154.06,90.93,774767.74,457286.97,317480.77
+Europe,Estonia,Cereal,Offline,H,7/18/2013,195212733,8/14/2013,6641,205.70,117.11,1366053.70,777727.51,588326.19
+Sub-Saharan Africa,Republic of the Congo,Vegetables,Online,C,1/13/2011,733893430,2/3/2011,4229,154.06,90.93,651519.74,384542.97,266976.77
+Central America and the Caribbean,Panama,Cosmetics,Online,L,5/20/2013,679271209,6/14/2013,300,437.20,263.33,131160.00,78999.00,52161.00
+Sub-Saharan Africa,Niger,Fruits,Online,L,3/23/2010,576707398,4/14/2010,9390,9.33,6.92,87608.70,64978.80,22629.90
+Europe,Poland,Household,Online,C,3/13/2011,141875827,4/16/2011,3065,668.27,502.54,2048247.55,1540285.10,507962.45
+Europe,Vatican City,Beverages,Offline,L,11/4/2011,510762822,12/22/2011,4924,47.45,31.79,233643.80,156533.96,77109.84
+Europe,Russia,Snacks,Offline,H,7/28/2012,189667212,9/3/2012,5598,152.58,97.44,854142.84,545469.12,308673.72
+Central America and the Caribbean,Grenada,Household,Offline,L,11/7/2014,905200326,12/15/2014,7747,668.27,502.54,5177087.69,3893177.38,1283910.31
+Central America and the Caribbean,Honduras,Fruits,Online,L,6/4/2017,854285991,6/30/2017,1064,9.33,6.92,9927.12,7362.88,2564.24
+Asia,Taiwan,Household,Offline,C,7/14/2012,554160535,8/25/2012,7272,668.27,502.54,4859659.44,3654470.88,1205188.56
+Asia,Laos,Meat,Offline,C,5/31/2012,592372786,6/11/2012,5126,421.89,364.69,2162608.14,1869400.94,293207.20
+Europe,Germany,Clothes,Online,C,3/21/2015,276784074,4/15/2015,5413,109.28,35.84,591532.64,194001.92,397530.72
+Middle East and North Africa,Syria,Snacks,Online,H,5/19/2016,785568225,5/30/2016,5950,152.58,97.44,907851.00,579768.00,328083.00
+Sub-Saharan Africa,Sudan,Household,Offline,C,5/26/2012,217211568,6/7/2012,6585,668.27,502.54,4400557.95,3309225.90,1091332.05
+Sub-Saharan Africa,Mozambique,Office Supplies,Online,C,3/13/2012,340512931,3/21/2012,4198,651.21,524.96,2733779.58,2203782.08,529997.50
+Europe,Spain,Clothes,Online,H,8/14/2010,744583642,9/26/2010,7701,109.28,35.84,841565.28,276003.84,565561.44
+Sub-Saharan Africa,Djibouti,Snacks,Offline,C,12/3/2014,188847529,1/19/2015,3035,152.58,97.44,463080.30,295730.40,167349.90
+Middle East and North Africa,Syria,Fruits,Offline,L,9/23/2010,653040921,10/9/2010,8175,9.33,6.92,76272.75,56571.00,19701.75
+Asia,Vietnam,Clothes,Offline,L,3/20/2011,587212646,4/24/2011,8126,109.28,35.84,888009.28,291235.84,596773.44
+Europe,Moldova ,Beverages,Online,H,6/26/2015,761724030,8/13/2015,9923,47.45,31.79,470846.35,315452.17,155394.18
+Europe,Slovakia,Office Supplies,Online,C,5/5/2012,217248904,6/15/2012,7633,651.21,524.96,4970685.93,4007019.68,963666.25
+Central America and the Caribbean,Grenada,Meat,Online,M,5/20/2014,314773595,6/1/2014,7357,421.89,364.69,3103844.73,2683024.33,420820.40
+Europe,Montenegro,Clothes,Online,L,4/29/2016,685596930,6/16/2016,2222,109.28,35.84,242820.16,79636.48,163183.68
+Central America and the Caribbean,Barbados,Office Supplies,Online,H,12/18/2013,581330239,2/5/2014,7391,651.21,524.96,4813093.11,3879979.36,933113.75
+Australia and Oceania,Australia,Household,Online,L,7/4/2015,223897349,7/4/2015,5056,668.27,502.54,3378773.12,2540842.24,837930.88
+Europe,Greece,Clothes,Online,H,1/31/2015,355534589,2/6/2015,9440,109.28,35.84,1031603.20,338329.60,693273.60
+Asia,Taiwan,Household,Offline,M,9/6/2011,888790786,9/12/2011,1799,668.27,502.54,1202217.73,904069.46,298148.27
+Europe,Belgium,Office Supplies,Offline,L,12/1/2012,456527268,12/2/2012,5419,651.21,524.96,3528906.99,2844758.24,684148.75
+Europe,Montenegro,Baby Food,Offline,C,2/15/2016,461917865,3/21/2016,616,255.28,159.42,157252.48,98202.72,59049.76
+Australia and Oceania,Fiji,Cosmetics,Online,L,2/12/2012,128448903,2/21/2012,9740,437.20,263.33,4258328.00,2564834.20,1693493.80
+Central America and the Caribbean,Belize,Clothes,Offline,M,9/16/2011,549919211,10/3/2011,2170,109.28,35.84,237137.60,77772.80,159364.80
+Asia,North Korea,Fruits,Online,L,8/22/2011,640440118,9/7/2011,9318,9.33,6.92,86936.94,64480.56,22456.38
+Europe,Montenegro,Personal Care,Offline,C,6/29/2013,284435451,6/29/2013,9625,81.73,56.67,786651.25,545448.75,241202.50
+Sub-Saharan Africa,Republic of the Congo,Baby Food,Online,C,5/6/2012,786641538,6/1/2012,3567,255.28,159.42,910583.76,568651.14,341932.62
+Middle East and North Africa,Pakistan,Cereal,Offline,H,9/14/2015,822107207,10/24/2015,8647,205.70,117.11,1778687.90,1012650.17,766037.73
+Middle East and North Africa,Oman,Cereal,Offline,H,12/26/2016,486193788,12/26/2016,4401,205.70,117.11,905285.70,515401.11,389884.59
+Europe,Finland,Meat,Online,H,6/21/2014,844575107,6/26/2014,7397,421.89,364.69,3120720.33,2697611.93,423108.40
+Asia,Taiwan,Office Supplies,Online,M,1/23/2015,783237493,2/7/2015,6234,651.21,524.96,4059643.14,3272600.64,787042.50
+Europe,Russia,Baby Food,Offline,L,5/19/2015,158479773,6/18/2015,6542,255.28,159.42,1670041.76,1042925.64,627116.12
+Middle East and North Africa,Morocco,Cosmetics,Online,H,2/8/2013,246913278,2/18/2013,5981,437.20,263.33,2614893.20,1574976.73,1039916.47
+North America,Mexico,Cosmetics,Online,H,10/10/2010,595461833,10/17/2010,9244,437.20,263.33,4041476.80,2434222.52,1607254.28
+North America,United States of America,Household,Offline,C,12/25/2011,371361768,1/30/2012,3054,668.27,502.54,2040896.58,1534757.16,506139.42
+Sub-Saharan Africa,Cote d'Ivoire,Personal Care,Offline,M,1/11/2010,612161910,2/27/2010,1168,81.73,56.67,95460.64,66190.56,29270.08
+Europe,Monaco,Household,Online,L,6/9/2014,175723588,6/14/2014,9370,668.27,502.54,6261689.90,4708799.80,1552890.10
+Europe,Netherlands,Household,Online,C,11/4/2016,690220630,11/19/2016,477,668.27,502.54,318764.79,239711.58,79053.21
+Europe,Macedonia,Beverages,Offline,M,7/17/2017,704139363,8/31/2017,9340,47.45,31.79,443183.00,296918.60,146264.40
+Europe,Italy,Fruits,Online,H,2/2/2014,636278617,3/22/2014,7837,9.33,6.92,73119.21,54232.04,18887.17
+Europe,Belarus,Snacks,Online,L,9/9/2012,525749719,10/22/2012,9880,152.58,97.44,1507490.40,962707.20,544783.20
+Europe,Romania,Fruits,Online,H,10/27/2016,481976497,12/3/2016,6411,9.33,6.92,59814.63,44364.12,15450.51
+Asia,Tajikistan,Meat,Offline,C,11/20/2015,234695279,1/9/2016,403,421.89,364.69,170021.67,146970.07,23051.60
+Sub-Saharan Africa,Sierra Leone,Cereal,Online,M,9/14/2011,483954894,10/24/2011,1863,205.70,117.11,383219.10,218175.93,165043.17
+Middle East and North Africa,Lebanon,Beverages,Online,H,9/25/2014,650116670,10/25/2014,2824,47.45,31.79,133998.80,89774.96,44223.84
+Asia,Bhutan,Cereal,Offline,M,7/28/2017,223854434,8/25/2017,2356,205.70,117.11,484629.20,275911.16,208718.04
+Asia,Maldives,Personal Care,Offline,M,11/16/2013,116154515,11/24/2013,1557,81.73,56.67,127253.61,88235.19,39018.42
+Central America and the Caribbean,Belize,Vegetables,Online,L,4/21/2017,408315742,5/23/2017,8556,154.06,90.93,1318137.36,777997.08,540140.28
+Central America and the Caribbean,Antigua and Barbuda ,Baby Food,Online,M,4/12/2012,801949441,5/7/2012,3516,255.28,159.42,897564.48,560520.72,337043.76
+Europe,San Marino,Meat,Online,H,10/22/2010,168979442,12/10/2010,3627,421.89,364.69,1530195.03,1322730.63,207464.40
+Sub-Saharan Africa,Burundi,Vegetables,Offline,H,10/21/2010,601642072,11/19/2010,8114,154.06,90.93,1250042.84,737806.02,512236.82
+Sub-Saharan Africa,Togo,Fruits,Offline,M,1/14/2015,662486159,2/15/2015,3231,9.33,6.92,30145.23,22358.52,7786.71
+Sub-Saharan Africa,Ghana,Meat,Online,H,3/13/2012,334373033,4/18/2012,7266,421.89,364.69,3065452.74,2649837.54,415615.20
+Europe,Albania,Household,Online,L,12/20/2010,570476520,12/24/2010,5534,668.27,502.54,3698206.18,2781056.36,917149.82
+Europe,Finland,Cereal,Online,H,7/13/2013,144282948,8/1/2013,5386,205.70,117.11,1107900.20,630754.46,477145.74
+Middle East and North Africa,Yemen,Baby Food,Offline,C,10/8/2011,599591147,11/25/2011,1200,255.28,159.42,306336.00,191304.00,115032.00
+Middle East and North Africa,Saudi Arabia,Meat,Offline,L,10/9/2013,400512444,10/29/2013,9387,421.89,364.69,3960281.43,3423345.03,536936.40
+Sub-Saharan Africa,Mauritania,Snacks,Online,H,5/5/2017,781470668,5/10/2017,3391,152.58,97.44,517398.78,330419.04,186979.74
+Europe,Russia,Beverages,Online,M,10/10/2013,797202146,11/17/2013,8685,47.45,31.79,412103.25,276096.15,136007.10
+Asia,Maldives,Snacks,Online,M,5/10/2014,472755706,6/15/2014,7774,152.58,97.44,1186156.92,757498.56,428658.36
+Europe,Hungary,Fruits,Offline,C,4/17/2016,353492677,5/23/2016,5193,9.33,6.92,48450.69,35935.56,12515.13
+Europe,Slovenia,Cosmetics,Offline,M,1/28/2014,155086886,2/5/2014,2511,437.20,263.33,1097809.20,661221.63,436587.57
+Europe,Russia,Cosmetics,Online,L,10/29/2010,113524663,12/9/2010,3325,437.20,263.33,1453690.00,875572.25,578117.75
+Sub-Saharan Africa,Equatorial Guinea,Beverages,Online,C,7/10/2014,535104835,7/15/2014,8267,47.45,31.79,392269.15,262807.93,129461.22
+Central America and the Caribbean,Dominica,Baby Food,Online,C,6/26/2011,446438729,8/6/2011,9996,255.28,159.42,2551778.88,1593562.32,958216.56
+Sub-Saharan Africa,Cote d'Ivoire,Beverages,Online,L,8/9/2015,744450175,8/30/2015,8205,47.45,31.79,389327.25,260836.95,128490.30
+Sub-Saharan Africa,Gabon,Beverages,Offline,H,7/20/2011,146375501,8/26/2011,4618,47.45,31.79,219124.10,146806.22,72317.88
+Central America and the Caribbean,Saint Lucia,Personal Care,Offline,C,7/21/2011,139763534,8/3/2011,7990,81.73,56.67,653022.70,452793.30,200229.40
+Europe,Andorra,Beverages,Offline,L,10/9/2013,932475602,11/21/2013,9107,47.45,31.79,432127.15,289511.53,142615.62
+Sub-Saharan Africa,Zimbabwe,Fruits,Online,L,8/22/2013,102685534,8/23/2013,5786,9.33,6.92,53983.38,40039.12,13944.26
+Sub-Saharan Africa,Republic of the Congo,Meat,Offline,H,3/25/2015,248879659,4/28/2015,7877,421.89,364.69,3323227.53,2872663.13,450564.40
+Middle East and North Africa,Oman,Beverages,Offline,H,4/24/2012,439856803,5/12/2012,2257,47.45,31.79,107094.65,71750.03,35344.62
+Sub-Saharan Africa,Seychelles ,Fruits,Online,H,11/18/2014,264728295,1/7/2015,7840,9.33,6.92,73147.20,54252.80,18894.40
+Europe,Russia,Office Supplies,Offline,L,1/20/2015,282917964,1/27/2015,567,651.21,524.96,369236.07,297652.32,71583.75
+Sub-Saharan Africa,Ghana,Cosmetics,Offline,M,8/3/2013,674162137,9/12/2013,8413,437.20,263.33,3678163.60,2215395.29,1462768.31
+Sub-Saharan Africa,Senegal,Fruits,Online,H,2/4/2016,788509643,3/3/2016,6381,9.33,6.92,59534.73,44156.52,15378.21
+Sub-Saharan Africa,Equatorial Guinea,Cosmetics,Online,L,2/5/2014,496321809,2/23/2014,1507,437.20,263.33,658860.40,396838.31,262022.09
+Sub-Saharan Africa,Madagascar,Household,Online,M,7/23/2011,638272464,9/9/2011,7861,668.27,502.54,5253270.47,3950466.94,1302803.53
+Europe,Croatia,Baby Food,Offline,C,6/27/2013,775347936,7/8/2013,1539,255.28,159.42,392875.92,245347.38,147528.54
+Australia and Oceania,Palau,Household,Offline,H,8/11/2014,538847053,9/29/2014,5672,668.27,502.54,3790427.44,2850406.88,940020.56
+Europe,Bulgaria,Baby Food,Offline,C,9/18/2010,980381143,9/26/2010,5421,255.28,159.42,1383872.88,864215.82,519657.06
+Europe,Belarus,Cosmetics,Offline,M,1/6/2010,521874034,2/3/2010,2979,437.20,263.33,1302418.80,784460.07,517958.73
+Sub-Saharan Africa,Ghana,Vegetables,Offline,C,3/20/2014,805562055,3/28/2014,2568,154.06,90.93,395626.08,233508.24,162117.84
+Australia and Oceania,Nauru,Personal Care,Online,M,9/22/2014,843994033,11/2/2014,5445,81.73,56.67,445019.85,308568.15,136451.70
+Australia and Oceania,Tonga,Snacks,Online,C,8/5/2011,170031297,8/31/2011,4894,152.58,97.44,746726.52,476871.36,269855.16
+Europe,Iceland,Cosmetics,Online,M,4/16/2017,186847674,4/23/2017,1234,437.20,263.33,539504.80,324949.22,214555.58
+Europe,Vatican City,Fruits,Offline,H,1/24/2015,117929494,3/2/2015,6813,9.33,6.92,63565.29,47145.96,16419.33
+Middle East and North Africa,Qatar,Baby Food,Offline,M,9/24/2015,157075583,10/3/2015,1011,255.28,159.42,258088.08,161173.62,96914.46
+Middle East and North Africa,Iraq,Baby Food,Online,C,1/9/2016,118397271,2/8/2016,5238,255.28,159.42,1337156.64,835041.96,502114.68
+Europe,Netherlands,Beverages,Offline,M,7/11/2017,786318385,8/23/2017,7939,47.45,31.79,376705.55,252380.81,124324.74
+Asia,Bangladesh,Cosmetics,Offline,C,4/29/2015,765575253,5/4/2015,9585,437.20,263.33,4190562.00,2524018.05,1666543.95
+Middle East and North Africa,Kuwait,Vegetables,Offline,L,11/29/2016,531216704,12/13/2016,7682,154.06,90.93,1183488.92,698524.26,484964.66
+Europe,Austria,Household,Online,C,9/20/2015,178604066,10/18/2015,1767,668.27,502.54,1180833.09,887988.18,292844.91
+Sub-Saharan Africa,Zambia,Personal Care,Offline,M,1/6/2010,773411166,2/19/2010,8406,81.73,56.67,687022.38,476368.02,210654.36
+Central America and the Caribbean,El Salvador,Cosmetics,Online,H,4/13/2014,301624333,5/5/2014,6198,437.20,263.33,2709765.60,1632119.34,1077646.26
+Middle East and North Africa,United Arab Emirates,Household,Online,C,7/26/2017,419542396,8/8/2017,773,668.27,502.54,516572.71,388463.42,128109.29
+Sub-Saharan Africa,Cote d'Ivoire,Cereal,Offline,C,7/20/2017,603776681,8/17/2017,9792,205.70,117.11,2014214.40,1146741.12,867473.28
+Middle East and North Africa,Iraq,Office Supplies,Online,L,10/5/2016,401251018,10/22/2016,7948,651.21,524.96,5175817.08,4172382.08,1003435.00
+Sub-Saharan Africa,Democratic Republic of the Congo,Meat,Online,C,3/26/2011,779201734,5/10/2011,1963,421.89,364.69,828170.07,715886.47,112283.60
+Sub-Saharan Africa,Niger,Fruits,Offline,M,12/24/2016,975177657,1/5/2017,5594,9.33,6.92,52192.02,38710.48,13481.54
+Sub-Saharan Africa,Swaziland,Office Supplies,Online,H,3/24/2013,747040116,4/30/2013,4626,651.21,524.96,3012497.46,2428464.96,584032.50
+Central America and the Caribbean,Saint Vincent and the Grenadines,Personal Care,Online,H,5/5/2014,822962939,5/25/2014,1877,81.73,56.67,153407.21,106369.59,47037.62
+Sub-Saharan Africa,Kenya,Office Supplies,Online,M,1/13/2013,651432454,2/12/2013,2194,651.21,524.96,1428754.74,1151762.24,276992.50
+Europe,Bulgaria,Vegetables,Offline,C,6/11/2014,651247489,7/2/2014,7459,154.06,90.93,1149133.54,678246.87,470886.67
+Middle East and North Africa,Jordan,Beverages,Online,H,3/11/2017,861519372,3/24/2017,1582,47.45,31.79,75065.90,50291.78,24774.12
+Sub-Saharan Africa,Equatorial Guinea,Office Supplies,Offline,L,3/10/2017,491671931,3/21/2017,5505,651.21,524.96,3584911.05,2889904.80,695006.25
+Middle East and North Africa,Iran,Baby Food,Online,H,5/30/2011,171441495,7/6/2011,2203,255.28,159.42,562381.84,351202.26,211179.58
+Asia,Sri Lanka,Cosmetics,Online,L,10/25/2016,600876891,12/11/2016,1680,437.20,263.33,734496.00,442394.40,292101.60
+Asia,Indonesia,Clothes,Online,M,8/1/2013,300339448,8/15/2013,5972,109.28,35.84,652620.16,214036.48,438583.68
+Sub-Saharan Africa,Rwanda,Baby Food,Offline,M,1/8/2017,560502994,2/26/2017,4146,255.28,159.42,1058390.88,660955.32,397435.56
+Europe,Cyprus,Household,Online,L,3/20/2013,492353856,4/11/2013,7302,668.27,502.54,4879707.54,3669547.08,1210160.46
+Central America and the Caribbean,Nicaragua,Snacks,Offline,L,10/27/2015,177190864,12/14/2015,3569,152.58,97.44,544558.02,347763.36,196794.66
+Sub-Saharan Africa,Namibia,Fruits,Offline,L,11/3/2016,216625344,12/22/2016,3108,9.33,6.92,28997.64,21507.36,7490.28
+Europe,Ireland,Personal Care,Offline,M,2/16/2013,382581126,3/27/2013,3112,81.73,56.67,254343.76,176357.04,77986.72
+Central America and the Caribbean,Honduras,Meat,Online,L,3/4/2010,967294538,4/18/2010,2804,421.89,364.69,1182979.56,1022590.76,160388.80
+Europe,Andorra,Household,Online,C,9/29/2010,533314406,10/29/2010,8439,668.27,502.54,5639530.53,4240935.06,1398595.47
+Australia and Oceania,Solomon Islands,Meat,Online,C,2/9/2011,863502061,3/5/2011,8304,421.89,364.69,3503374.56,3028385.76,474988.80
+Sub-Saharan Africa,Eritrea,Office Supplies,Online,C,5/15/2012,211031329,6/25/2012,7715,651.21,524.96,5024085.15,4050066.40,974018.75
+Europe,Russia,Snacks,Online,M,9/18/2016,949388539,9/30/2016,4021,152.58,97.44,613524.18,391806.24,221717.94
+Europe,Portugal,Beverages,Offline,L,1/10/2016,122372519,1/13/2016,1603,47.45,31.79,76062.35,50959.37,25102.98
+Sub-Saharan Africa,Tanzania,Snacks,Offline,L,10/26/2010,694094598,12/13/2010,6871,152.58,97.44,1048377.18,669510.24,378866.94
+Europe,France,Clothes,Offline,M,1/16/2014,298978602,1/28/2014,3267,109.28,35.84,357017.76,117089.28,239928.48
+Europe,Belarus,Clothes,Offline,C,12/27/2016,691760861,1/28/2017,6266,109.28,35.84,684748.48,224573.44,460175.04
+Central America and the Caribbean,Dominica,Household,Online,M,10/21/2015,997490203,11/15/2015,8372,668.27,502.54,5594756.44,4207264.88,1387491.56
+Australia and Oceania,Samoa ,Office Supplies,Online,M,4/7/2015,861527955,5/4/2015,4122,651.21,524.96,2684287.62,2163885.12,520402.50
+Central America and the Caribbean,El Salvador,Snacks,Offline,M,6/6/2017,899547946,6/17/2017,5082,152.58,97.44,775411.56,495190.08,280221.48
+Europe,Serbia,Meat,Offline,H,4/14/2010,447536504,4/25/2010,4852,421.89,364.69,2047010.28,1769475.88,277534.40
+Asia,South Korea,Fruits,Online,C,12/11/2016,711792457,12/13/2016,4060,9.33,6.92,37879.80,28095.20,9784.60
+Central America and the Caribbean,Nicaragua,Office Supplies,Offline,M,2/29/2016,718927133,3/22/2016,5370,651.21,524.96,3496997.70,2819035.20,677962.50
+Sub-Saharan Africa,Tanzania,Clothes,Offline,L,4/3/2014,465864360,5/18/2014,8471,109.28,35.84,925710.88,303600.64,622110.24
+Europe,Poland,Vegetables,Offline,H,1/13/2011,469840466,1/22/2011,5090,154.06,90.93,784165.40,462833.70,321331.70
+Europe,Armenia,Snacks,Offline,M,3/2/2011,418404281,4/15/2011,3979,152.58,97.44,607115.82,387713.76,219402.06
+Middle East and North Africa,United Arab Emirates,Cosmetics,Offline,C,10/20/2012,519417130,11/27/2012,5926,437.20,263.33,2590847.20,1560493.58,1030353.62
+Central America and the Caribbean,Saint Vincent and the Grenadines,Clothes,Online,M,5/18/2011,151052844,6/7/2011,8748,109.28,35.84,955981.44,313528.32,642453.12
+Central America and the Caribbean,Guatemala,Meat,Offline,L,12/17/2010,111797749,1/19/2011,2293,421.89,364.69,967393.77,836234.17,131159.60
+Sub-Saharan Africa,Botswana,Personal Care,Online,M,11/25/2012,370450675,12/1/2012,3442,81.73,56.67,281314.66,195058.14,86256.52
+Europe,Austria,Snacks,Online,M,1/18/2012,516122949,2/21/2012,1105,152.58,97.44,168600.90,107671.20,60929.70
+Europe,Albania,Cosmetics,Offline,L,8/29/2015,208238399,10/15/2015,1224,437.20,263.33,535132.80,322315.92,212816.88
+Europe,Georgia,Fruits,Online,M,12/2/2016,526533353,1/12/2017,1775,9.33,6.92,16560.75,12283.00,4277.75
+Central America and the Caribbean,Nicaragua,Beverages,Online,H,11/15/2013,821056640,1/3/2014,7760,47.45,31.79,368212.00,246690.40,121521.60
+Asia,Singapore,Personal Care,Offline,M,3/9/2013,962169587,3/26/2013,6217,81.73,56.67,508115.41,352317.39,155798.02
+Middle East and North Africa,Bahrain,Cereal,Online,H,3/31/2011,890546023,5/2/2011,1213,205.70,117.11,249514.10,142054.43,107459.67
+Asia,Myanmar,Household,Offline,L,1/23/2013,167172276,3/4/2013,8846,668.27,502.54,5911516.42,4445468.84,1466047.58
+Central America and the Caribbean,Antigua and Barbuda ,Snacks,Online,H,5/13/2013,223347175,6/10/2013,2247,152.58,97.44,342847.26,218947.68,123899.58
+Asia,Taiwan,Clothes,Online,L,7/7/2015,310682046,8/23/2015,6576,109.28,35.84,718625.28,235683.84,482941.44
+Sub-Saharan Africa,Djibouti,Snacks,Offline,M,7/28/2012,651100718,8/30/2012,4026,152.58,97.44,614287.08,392293.44,221993.64
+Middle East and North Africa,Saudi Arabia,Baby Food,Online,C,10/27/2013,186839520,12/4/2013,8821,255.28,159.42,2251824.88,1406243.82,845581.06
+Sub-Saharan Africa,Seychelles ,Household,Online,L,9/2/2010,630447280,9/4/2010,2215,668.27,502.54,1480218.05,1113126.10,367091.95
+Sub-Saharan Africa,Equatorial Guinea,Office Supplies,Offline,M,9/27/2010,614785325,10/26/2010,7494,651.21,524.96,4880167.74,3934050.24,946117.50
+Europe,Iceland,Meat,Online,H,5/11/2011,643027484,5/18/2011,4977,421.89,364.69,2099746.53,1815062.13,284684.40
+Middle East and North Africa,Israel,Personal Care,Offline,H,11/30/2010,838660085,1/13/2011,7011,81.73,56.67,573009.03,397313.37,175695.66
+Australia and Oceania,Nauru,Personal Care,Online,L,8/25/2012,495481956,9/24/2012,2976,81.73,56.67,243228.48,168649.92,74578.56
+Europe,Hungary,Beverages,Online,L,4/21/2013,327604424,5/13/2013,4284,47.45,31.79,203275.80,136188.36,67087.44
+Europe,Ukraine,Meat,Offline,M,6/18/2014,219451320,7/2/2014,9377,421.89,364.69,3956062.53,3419698.13,536364.40
+Europe,France,Personal Care,Online,H,3/15/2011,575758969,3/29/2011,8729,81.73,56.67,713421.17,494672.43,218748.74
+Middle East and North Africa,Saudi Arabia,Snacks,Online,H,1/9/2011,971576201,1/26/2011,9843,152.58,97.44,1501844.94,959101.92,542743.02
+Europe,Malta,Office Supplies,Offline,H,12/4/2014,602264344,1/7/2015,2258,651.21,524.96,1470432.18,1185359.68,285072.50
+North America,United States of America,Snacks,Online,H,8/9/2013,533497226,8/19/2013,2539,152.58,97.44,387400.62,247400.16,140000.46
+Asia,Uzbekistan,Cosmetics,Online,M,12/23/2013,551261174,12/30/2013,9287,437.20,263.33,4060276.40,2445545.71,1614730.69
+Asia,Tajikistan,Personal Care,Offline,M,8/27/2012,511855018,9/20/2012,8129,81.73,56.67,664383.17,460670.43,203712.74
+Europe,Belgium,Cereal,Offline,H,11/22/2014,791890084,12/15/2014,6728,205.70,117.11,1383949.60,787916.08,596033.52
+Sub-Saharan Africa,South Sudan,Snacks,Offline,L,8/26/2015,938290202,8/29/2015,9777,152.58,97.44,1491774.66,952670.88,539103.78
+Australia and Oceania,Nauru,Meat,Offline,M,12/15/2010,118291699,1/15/2011,3997,421.89,364.69,1686294.33,1457665.93,228628.40
+Asia,Bangladesh,Cosmetics,Online,M,10/30/2016,269443404,11/5/2016,3146,437.20,263.33,1375431.20,828436.18,546995.02
+Europe,Liechtenstein,Fruits,Offline,C,6/29/2012,249606645,8/14/2012,3008,9.33,6.92,28064.64,20815.36,7249.28
+Australia and Oceania,Australia,Clothes,Offline,L,4/24/2012,786955249,4/26/2012,6401,109.28,35.84,699501.28,229411.84,470089.44
+Middle East and North Africa,Lebanon,Baby Food,Online,L,7/29/2016,429975545,9/11/2016,8174,255.28,159.42,2086658.72,1303099.08,783559.64
+Europe,Belgium,Household,Offline,C,4/8/2015,497466361,5/1/2015,206,668.27,502.54,137663.62,103523.24,34140.38
+Middle East and North Africa,Afghanistan,Cereal,Online,C,8/5/2014,128539025,8/16/2014,6409,205.70,117.11,1318331.30,750557.99,567773.31
+Asia,Malaysia,Clothes,Online,M,6/16/2010,332617366,6/30/2010,7725,109.28,35.84,844188.00,276864.00,567324.00
+Europe,Belarus,Clothes,Offline,L,12/23/2014,839437711,12/24/2014,7128,109.28,35.84,778947.84,255467.52,523480.32
+Europe,Luxembourg,Office Supplies,Online,H,10/31/2014,549048888,12/2/2014,4622,651.21,524.96,3009892.62,2426365.12,583527.50
+Australia and Oceania,Fiji,Clothes,Online,L,11/27/2012,681812226,12/24/2012,2244,109.28,35.84,245224.32,80424.96,164799.36
+Sub-Saharan Africa,Ethiopia,Baby Food,Offline,C,12/11/2016,728401553,1/27/2017,9061,255.28,159.42,2313092.08,1444504.62,868587.46
+Central America and the Caribbean,Nicaragua,Beverages,Offline,H,1/10/2013,699803197,1/24/2013,6172,47.45,31.79,292861.40,196207.88,96653.52
+Sub-Saharan Africa,Ethiopia,Personal Care,Online,H,10/24/2014,677315986,12/4/2014,1706,81.73,56.67,139431.38,96679.02,42752.36
+Middle East and North Africa,Egypt,Personal Care,Offline,H,4/20/2014,362551248,4/20/2014,5826,81.73,56.67,476158.98,330159.42,145999.56
+Europe,Finland,Snacks,Online,H,12/3/2015,427432811,12/11/2015,5722,152.58,97.44,873062.76,557551.68,315511.08
+Central America and the Caribbean,Haiti,Snacks,Online,M,1/6/2010,264197003,2/14/2010,619,152.58,97.44,94447.02,60315.36,34131.66
+Sub-Saharan Africa,Comoros,Vegetables,Online,C,7/2/2014,235392653,7/8/2014,6772,154.06,90.93,1043294.32,615777.96,427516.36
+Middle East and North Africa,United Arab Emirates,Household,Offline,H,6/28/2010,323881089,8/8/2010,2467,668.27,502.54,1648622.09,1239766.18,408855.91
+Europe,Andorra,Office Supplies,Online,H,3/31/2014,582836139,4/5/2014,3020,651.21,524.96,1966654.20,1585379.20,381275.00
+Sub-Saharan Africa,Angola,Household,Online,H,10/19/2012,685744130,11/20/2012,5782,668.27,502.54,3863937.14,2905686.28,958250.86
+Sub-Saharan Africa,Comoros,Baby Food,Offline,M,3/7/2013,376403892,4/14/2013,5131,255.28,159.42,1309841.68,817984.02,491857.66
+Central America and the Caribbean,Haiti,Vegetables,Online,C,11/29/2015,818926751,12/2/2015,7479,154.06,90.93,1152214.74,680065.47,472149.27
+Australia and Oceania,Federated States of Micronesia,Beverages,Online,C,3/20/2011,547736537,5/7/2011,6268,47.45,31.79,297416.60,199259.72,98156.88
+Middle East and North Africa,Iran,Household,Offline,C,2/7/2013,417569577,2/10/2013,6972,668.27,502.54,4659178.44,3503708.88,1155469.56
+Middle East and North Africa,Algeria,Clothes,Online,C,2/24/2010,453474700,4/8/2010,2096,109.28,35.84,229050.88,75120.64,153930.24
+Central America and the Caribbean,Saint Kitts and Nevis ,Clothes,Offline,H,9/15/2014,300813233,11/2/2014,6175,109.28,35.84,674804.00,221312.00,453492.00
+Sub-Saharan Africa,Ghana,Household,Online,L,9/8/2013,575259006,10/20/2013,778,668.27,502.54,519914.06,390976.12,128937.94
+Central America and the Caribbean,The Bahamas,Cereal,Online,C,3/20/2010,612798345,3/30/2010,9503,205.70,117.11,1954767.10,1112896.33,841870.77
+Europe,Netherlands,Clothes,Offline,H,4/8/2012,719730079,5/6/2012,2979,109.28,35.84,325545.12,106767.36,218777.76
+Sub-Saharan Africa,Djibouti,Cereal,Offline,M,9/28/2013,822665536,10/29/2013,3868,205.70,117.11,795647.60,452981.48,342666.12
+Asia,Thailand,Clothes,Offline,H,5/19/2013,918528544,7/4/2013,1863,109.28,35.84,203588.64,66769.92,136818.72
+Middle East and North Africa,Oman,Baby Food,Offline,H,12/30/2010,624555432,1/9/2011,8686,255.28,159.42,2217362.08,1384722.12,832639.96
+Australia and Oceania,Tonga,Fruits,Online,H,4/3/2011,528295028,4/4/2011,3093,9.33,6.92,28857.69,21403.56,7454.13
+Europe,Bulgaria,Household,Online,H,4/21/2012,837608659,5/2/2012,5871,668.27,502.54,3923413.17,2950412.34,973000.83
+Europe,Norway,Meat,Online,L,2/26/2017,930670154,3/15/2017,4835,421.89,364.69,2039838.15,1763276.15,276562.00
+Central America and the Caribbean,Barbados,Clothes,Online,L,9/26/2014,705965840,10/6/2014,9835,109.28,35.84,1074768.80,352486.40,722282.40
+Middle East and North Africa,Jordan,Meat,Offline,H,12/18/2013,132294547,1/10/2014,7751,421.89,364.69,3270069.39,2826712.19,443357.20
+Sub-Saharan Africa,Guinea-Bissau,Household,Offline,C,4/4/2017,598767602,5/21/2017,7494,668.27,502.54,5008015.38,3766034.76,1241980.62
+Asia,Uzbekistan,Cereal,Offline,C,9/25/2016,864808833,10/9/2016,5007,205.70,117.11,1029939.90,586369.77,443570.13
+Australia and Oceania,Vanuatu,Meat,Offline,L,2/25/2013,210154569,3/17/2013,8262,421.89,364.69,3485655.18,3013068.78,472586.40
+Europe,Portugal,Clothes,Offline,H,2/15/2012,684853637,4/3/2012,2265,109.28,35.84,247519.20,81177.60,166341.60
+North America,Canada,Fruits,Offline,M,9/30/2012,359267365,11/14/2012,4052,9.33,6.92,37805.16,28039.84,9765.32
+Central America and the Caribbean,Dominican Republic,Clothes,Online,M,5/28/2011,974069583,7/12/2011,7690,109.28,35.84,840363.20,275609.60,564753.60
+Australia and Oceania,East Timor,Meat,Offline,C,2/10/2013,290246617,3/28/2013,9279,421.89,364.69,3914717.31,3383958.51,530758.80
+Middle East and North Africa,Libya,Cereal,Online,H,8/4/2012,639097297,9/8/2012,1947,205.70,117.11,400497.90,228013.17,172484.73
+Australia and Oceania,Tuvalu,Household,Online,C,3/18/2013,372232949,3/30/2013,856,668.27,502.54,572039.12,430174.24,141864.88
+Middle East and North Africa,Qatar,Household,Online,L,8/8/2015,611577403,8/23/2015,8199,668.27,502.54,5479145.73,4120325.46,1358820.27
+Sub-Saharan Africa,Ghana,Baby Food,Offline,M,11/25/2013,299366986,1/10/2014,8199,255.28,159.42,2093040.72,1307084.58,785956.14
+Sub-Saharan Africa,Namibia,Snacks,Online,H,8/30/2014,248150527,10/12/2014,2110,152.58,97.44,321943.80,205598.40,116345.40
+Central America and the Caribbean,Antigua and Barbuda ,Fruits,Online,H,5/12/2010,890789353,5/21/2010,3220,9.33,6.92,30042.60,22282.40,7760.20
+Europe,Montenegro,Cereal,Offline,H,6/20/2013,930457293,7/26/2013,1845,205.70,117.11,379516.50,216067.95,163448.55
+Sub-Saharan Africa,Uganda,Cereal,Online,M,10/22/2014,490640676,11/19/2014,334,205.70,117.11,68703.80,39114.74,29589.06
+Sub-Saharan Africa,Equatorial Guinea,Fruits,Online,H,1/17/2010,665138328,2/14/2010,8067,9.33,6.92,75265.11,55823.64,19441.47
+Central America and the Caribbean,Jamaica,Baby Food,Online,M,1/23/2011,368061578,3/6/2011,6455,255.28,159.42,1647832.40,1029056.10,618776.30
+Central America and the Caribbean,Saint Lucia,Cosmetics,Offline,M,11/15/2011,383834254,11/28/2011,3940,437.20,263.33,1722568.00,1037520.20,685047.80
+Sub-Saharan Africa,Ghana,Cosmetics,Offline,C,2/15/2015,217192685,2/15/2015,997,437.20,263.33,435888.40,262540.01,173348.39
+Europe,Estonia,Office Supplies,Offline,H,3/7/2013,343185698,4/25/2013,5129,651.21,524.96,3340056.09,2692519.84,647536.25
+Central America and the Caribbean,Honduras,Vegetables,Online,L,8/9/2014,857174623,8/27/2014,5874,154.06,90.93,904948.44,534122.82,370825.62
+Middle East and North Africa,Syria,Fruits,Offline,C,2/5/2010,124833285,2/10/2010,9798,9.33,6.92,91415.34,67802.16,23613.18
+Sub-Saharan Africa,Eritrea,Fruits,Offline,L,2/22/2014,632148015,3/14/2014,5500,9.33,6.92,51315.00,38060.00,13255.00
+Asia,Indonesia,Household,Online,M,10/15/2015,435417640,10/28/2015,8610,668.27,502.54,5753804.70,4326869.40,1426935.30
+Australia and Oceania,Kiribati,Office Supplies,Offline,L,9/15/2012,811253488,10/31/2012,6790,651.21,524.96,4421715.90,3564478.40,857237.50
+Central America and the Caribbean,Saint Kitts and Nevis ,Meat,Online,L,1/5/2015,406579387,1/24/2015,4730,421.89,364.69,1995539.70,1724983.70,270556.00
+Middle East and North Africa,Tunisia ,Clothes,Online,H,2/26/2011,188631665,4/13/2011,9156,109.28,35.84,1000567.68,328151.04,672416.64
+Middle East and North Africa,Somalia,Cosmetics,Online,C,2/25/2017,294959151,3/26/2017,3822,437.20,263.33,1670978.40,1006447.26,664531.14
+Australia and Oceania,Solomon Islands,Vegetables,Online,C,3/26/2012,483423173,4/29/2012,4514,154.06,90.93,695426.84,410458.02,284968.82
+Middle East and North Africa,Tunisia ,Cereal,Offline,M,10/4/2010,582197558,10/17/2010,4050,205.70,117.11,833085.00,474295.50,358789.50
+Sub-Saharan Africa,Cameroon,Snacks,Online,H,1/6/2013,939768636,2/10/2013,7278,152.58,97.44,1110477.24,709168.32,401308.92
+Europe,France,Cosmetics,Online,M,7/26/2016,174935233,7/29/2016,6078,437.20,263.33,2657301.60,1600519.74,1056781.86
+Middle East and North Africa,Egypt,Meat,Online,H,6/20/2012,126808679,7/29/2012,4361,421.89,364.69,1839862.29,1590413.09,249449.20
+Europe,Romania,Fruits,Offline,M,10/9/2011,904812800,11/24/2011,3069,9.33,6.92,28633.77,21237.48,7396.29
+Europe,Romania,Personal Care,Online,L,6/13/2011,438683927,7/29/2011,5177,81.73,56.67,423116.21,293380.59,129735.62
+Sub-Saharan Africa,Kenya,Snacks,Online,H,4/27/2013,328470885,6/12/2013,689,152.58,97.44,105127.62,67136.16,37991.46
+Sub-Saharan Africa,Tanzania,Baby Food,Offline,M,9/15/2012,894535005,10/3/2012,1641,255.28,159.42,418914.48,261608.22,157306.26
+Sub-Saharan Africa,Comoros,Fruits,Online,L,5/5/2017,727550113,5/29/2017,7101,9.33,6.92,66252.33,49138.92,17113.41
+Australia and Oceania,Vanuatu,Office Supplies,Online,C,4/25/2013,738502538,5/29/2013,8167,651.21,524.96,5318432.07,4287348.32,1031083.75
+Australia and Oceania,Fiji,Office Supplies,Offline,C,4/12/2014,108691108,4/24/2014,2969,651.21,524.96,1933442.49,1558606.24,374836.25
+Central America and the Caribbean,Costa Rica,Cosmetics,Online,C,3/27/2012,339727151,4/27/2012,1668,437.20,263.33,729249.60,439234.44,290015.16
+Europe,Iceland,Fruits,Offline,H,8/13/2011,303534495,8/18/2011,1457,9.33,6.92,13593.81,10082.44,3511.37
+Sub-Saharan Africa,Burkina Faso,Office Supplies,Online,L,5/1/2010,292349469,5/11/2010,1559,651.21,524.96,1015236.39,818412.64,196823.75
+Middle East and North Africa,Morocco,Cosmetics,Offline,H,2/26/2011,668720901,3/9/2011,8230,437.20,263.33,3598156.00,2167205.90,1430950.10
+Central America and the Caribbean,Guatemala,Cereal,Offline,L,5/7/2010,515510118,6/11/2010,9754,205.70,117.11,2006397.80,1142290.94,864106.86
+Sub-Saharan Africa,South Africa,Meat,Offline,C,8/6/2016,785890948,9/24/2016,1451,421.89,364.69,612162.39,529165.19,82997.20
+Sub-Saharan Africa,Zimbabwe,Snacks,Online,C,12/6/2016,253349721,1/6/2017,667,152.58,97.44,101770.86,64992.48,36778.38
+Asia,India,Fruits,Offline,L,10/24/2010,461685264,10/24/2010,1784,9.33,6.92,16644.72,12345.28,4299.44
+Europe,Liechtenstein,Baby Food,Online,M,11/26/2013,775008904,1/2/2014,1212,255.28,159.42,309399.36,193217.04,116182.32
+Central America and the Caribbean,Guatemala,Fruits,Online,C,6/7/2016,627744472,6/18/2016,2394,9.33,6.92,22336.02,16566.48,5769.54
+Asia,Taiwan,Beverages,Online,H,4/7/2017,874628293,4/11/2017,803,47.45,31.79,38102.35,25527.37,12574.98
+Sub-Saharan Africa,Lesotho,Baby Food,Online,M,7/17/2012,640709197,8/24/2012,8944,255.28,159.42,2283224.32,1425852.48,857371.84
+Europe,Greece,Fruits,Online,M,8/16/2014,471348512,10/1/2014,1354,9.33,6.92,12632.82,9369.68,3263.14
+Australia and Oceania,Tuvalu,Household,Offline,H,6/1/2010,982220065,6/1/2010,9599,668.27,502.54,6414723.73,4823881.46,1590842.27
+Sub-Saharan Africa,Cape Verde,Snacks,Offline,C,8/14/2010,609310185,9/21/2010,7279,152.58,97.44,1110629.82,709265.76,401364.06
+Sub-Saharan Africa,Tanzania,Office Supplies,Offline,L,8/21/2015,558917701,9/21/2015,5023,651.21,524.96,3271027.83,2636874.08,634153.75
+Sub-Saharan Africa,Togo,Beverages,Online,M,10/17/2011,757653939,11/4/2011,5492,47.45,31.79,260595.40,174590.68,86004.72
+Europe,Malta,Baby Food,Offline,C,12/23/2012,302442729,1/17/2013,8379,255.28,159.42,2138991.12,1335780.18,803210.94
+Asia,Kazakhstan,Snacks,Online,L,6/6/2011,610520398,7/15/2011,5408,152.58,97.44,825152.64,526955.52,298197.12
+Sub-Saharan Africa,Gabon,Beverages,Online,H,10/24/2011,469435775,12/2/2011,5333,47.45,31.79,253050.85,169536.07,83514.78
+Europe,Macedonia,Vegetables,Online,C,4/12/2012,987050187,4/25/2012,8940,154.06,90.93,1377296.40,812914.20,564382.20
+Europe,Bulgaria,Office Supplies,Online,H,11/2/2015,641537463,12/14/2015,4047,651.21,524.96,2635446.87,2124513.12,510933.75
+Central America and the Caribbean,Cuba,Cosmetics,Offline,C,5/31/2011,231383931,6/16/2011,502,437.20,263.33,219474.40,132191.66,87282.74
+Sub-Saharan Africa,Guinea-Bissau,Personal Care,Online,H,7/2/2015,625388419,7/19/2015,5186,81.73,56.67,423851.78,293890.62,129961.16
+Europe,Czech Republic,Household,Offline,L,5/15/2015,512662255,6/22/2015,7009,668.27,502.54,4683904.43,3522302.86,1161601.57
+Asia,Laos,Fruits,Online,L,9/17/2010,452629268,9/26/2010,1914,9.33,6.92,17857.62,13244.88,4612.74
+Sub-Saharan Africa,Chad,Baby Food,Online,H,6/7/2017,625025784,7/4/2017,7874,255.28,159.42,2010074.72,1255273.08,754801.64
+Europe,Germany,Clothes,Offline,L,11/7/2010,379900634,12/2/2010,9895,109.28,35.84,1081325.60,354636.80,726688.80
+Asia,China,Cereal,Online,C,10/12/2012,487615144,12/1/2012,5012,205.70,117.11,1030968.40,586955.32,444013.08
+Asia,Myanmar,Personal Care,Offline,L,1/15/2012,888843142,2/19/2012,7293,81.73,56.67,596056.89,413294.31,182762.58
+Sub-Saharan Africa,Namibia,Personal Care,Offline,H,8/20/2013,244570958,9/19/2013,2836,81.73,56.67,231786.28,160716.12,71070.16
+Australia and Oceania,Australia,Personal Care,Offline,L,4/17/2012,886097419,5/8/2012,4772,81.73,56.67,390015.56,270429.24,119586.32
+Australia and Oceania,Australia,Snacks,Offline,M,5/19/2011,265033853,5/26/2011,8261,152.58,97.44,1260463.38,804951.84,455511.54
+Sub-Saharan Africa,Lesotho,Household,Online,M,7/13/2011,403304088,8/9/2011,5497,668.27,502.54,3673480.19,2762462.38,911017.81
+Europe,Georgia,Cereal,Online,H,6/14/2014,243144452,7/16/2014,701,205.70,117.11,144195.70,82094.11,62101.59
+Sub-Saharan Africa,Seychelles ,Vegetables,Online,H,7/21/2011,597103774,8/1/2011,5131,154.06,90.93,790481.86,466561.83,323920.03
+Europe,Malta,Cosmetics,Online,H,6/15/2010,998043382,7/3/2010,2070,437.20,263.33,905004.00,545093.10,359910.90
+Central America and the Caribbean,Belize,Clothes,Offline,M,1/21/2016,149137103,3/4/2016,1838,109.28,35.84,200856.64,65873.92,134982.72
+Sub-Saharan Africa,Cameroon,Snacks,Offline,C,8/9/2011,873871266,9/19/2011,6782,152.58,97.44,1034797.56,660838.08,373959.48
+Central America and the Caribbean,Dominica,Cosmetics,Offline,C,6/27/2015,666044700,7/1/2015,6282,437.20,263.33,2746490.40,1654239.06,1092251.34
+Australia and Oceania,Marshall Islands,Vegetables,Online,L,11/12/2016,239768731,12/22/2016,1751,154.06,90.93,269759.06,159218.43,110540.63
+Sub-Saharan Africa,Niger,Cereal,Offline,C,4/29/2017,379467189,6/9/2017,1629,205.70,117.11,335085.30,190772.19,144313.11
+Middle East and North Africa,Somalia,Beverages,Online,L,12/14/2011,589876401,12/29/2011,6390,47.45,31.79,303205.50,203138.10,100067.40
+Europe,Spain,Fruits,Offline,L,10/24/2015,446045196,11/1/2015,3540,9.33,6.92,33028.20,24496.80,8531.40
+Sub-Saharan Africa,South Sudan,Meat,Offline,M,10/4/2014,943334901,11/3/2014,2615,421.89,364.69,1103242.35,953664.35,149578.00
+Asia,Bangladesh,Beverages,Offline,H,8/21/2014,447419345,9/18/2014,182,47.45,31.79,8635.90,5785.78,2850.12
+Europe,Lithuania,Household,Offline,M,10/14/2014,544284856,10/25/2014,4839,668.27,502.54,3233758.53,2431791.06,801967.47
+Asia,Brunei,Baby Food,Online,L,10/27/2011,190230262,11/27/2011,2217,255.28,159.42,565955.76,353434.14,212521.62
+Central America and the Caribbean,Panama,Snacks,Online,L,12/30/2010,661866891,2/16/2011,9976,152.58,97.44,1522138.08,972061.44,550076.64
+Europe,Romania,Vegetables,Offline,H,11/6/2014,606118571,11/18/2014,2809,154.06,90.93,432754.54,255422.37,177332.17
+Central America and the Caribbean,Guatemala,Cosmetics,Offline,H,10/28/2011,990221631,12/6/2011,7440,437.20,263.33,3252768.00,1959175.20,1293592.80
+North America,Canada,Office Supplies,Online,L,5/17/2010,151724898,6/16/2010,7624,651.21,524.96,4964825.04,4002295.04,962530.00
+Central America and the Caribbean,Jamaica,Personal Care,Offline,M,6/11/2012,548489701,7/31/2012,9146,81.73,56.67,747502.58,518303.82,229198.76
+Central America and the Caribbean,Saint Kitts and Nevis ,Personal Care,Online,L,4/1/2017,208689868,4/3/2017,4824,81.73,56.67,394265.52,273376.08,120889.44
+Middle East and North Africa,Somalia,Clothes,Online,H,7/2/2017,380811727,7/6/2017,9507,109.28,35.84,1038924.96,340730.88,698194.08
+Europe,Portugal,Snacks,Online,C,10/7/2010,583654105,10/19/2010,5075,152.58,97.44,774343.50,494508.00,279835.50
+Middle East and North Africa,Tunisia ,Cereal,Online,L,10/25/2010,856328332,12/8/2010,5438,205.70,117.11,1118596.60,636844.18,481752.42
+Australia and Oceania,East Timor,Baby Food,Offline,C,7/23/2013,408258235,7/27/2013,1539,255.28,159.42,392875.92,245347.38,147528.54
+Sub-Saharan Africa,Comoros,Household,Online,C,12/19/2015,769180142,1/4/2016,6352,668.27,502.54,4244851.04,3192134.08,1052716.96
+Middle East and North Africa,Libya,Meat,Online,H,4/13/2012,839142882,5/20/2012,9881,421.89,364.69,4168695.09,3603501.89,565193.20
+Australia and Oceania,Australia,Office Supplies,Online,L,12/23/2012,938507783,1/30/2013,4164,651.21,524.96,2711638.44,2185933.44,525705.00
+Sub-Saharan Africa,Djibouti,Household,Offline,L,8/22/2010,557948672,9/19/2010,8266,668.27,502.54,5523919.82,4153995.64,1369924.18
+Europe,Moldova ,Baby Food,Online,C,1/27/2014,608451879,3/1/2014,3287,255.28,159.42,839105.36,524013.54,315091.82
+Middle East and North Africa,Iran,Meat,Offline,H,3/20/2014,271316230,3/31/2014,7356,421.89,364.69,3103422.84,2682659.64,420763.20
+Asia,Japan,Snacks,Offline,H,8/23/2010,148153054,10/2/2010,636,152.58,97.44,97040.88,61971.84,35069.04
+Europe,Romania,Beverages,Online,M,5/10/2015,910886180,6/10/2015,317,47.45,31.79,15041.65,10077.43,4964.22
+Sub-Saharan Africa,Madagascar,Cereal,Online,C,2/13/2011,151751935,2/23/2011,5625,205.70,117.11,1157062.50,658743.75,498318.75
+Sub-Saharan Africa,Guinea-Bissau,Fruits,Offline,L,11/9/2015,933299148,12/23/2015,2813,9.33,6.92,26245.29,19465.96,6779.33
+Asia,Brunei,Personal Care,Offline,M,9/5/2010,538389146,9/12/2010,167,81.73,56.67,13648.91,9463.89,4185.02
+Europe,Vatican City,Snacks,Offline,L,11/5/2011,820195758,11/24/2011,3006,152.58,97.44,458655.48,292904.64,165750.84
+Middle East and North Africa,Qatar,Cereal,Online,H,12/18/2013,552205312,12/25/2013,8678,205.70,117.11,1785064.60,1016280.58,768784.02
+Europe,Lithuania,Clothes,Online,H,6/28/2016,378216636,8/8/2016,1562,109.28,35.84,170695.36,55982.08,114713.28
+Middle East and North Africa,Tunisia ,Beverages,Online,H,5/15/2012,562341058,7/4/2012,8070,47.45,31.79,382921.50,256545.30,126376.20
+Europe,Denmark,Clothes,Online,C,7/21/2014,539002406,7/23/2014,1645,109.28,35.84,179765.60,58956.80,120808.80
+Asia,Tajikistan,Fruits,Online,L,4/30/2014,262937009,6/2/2014,7759,9.33,6.92,72391.47,53692.28,18699.19
+Europe,Serbia,Office Supplies,Online,M,5/31/2015,659193694,6/11/2015,8918,651.21,524.96,5807490.78,4681593.28,1125897.50
+Middle East and North Africa,Algeria,Baby Food,Online,L,1/5/2015,473133790,1/27/2015,9657,255.28,159.42,2465238.96,1539518.94,925720.02
+Europe,Andorra,Beverages,Online,H,3/11/2015,320431125,4/17/2015,1545,47.45,31.79,73310.25,49115.55,24194.70
+Sub-Saharan Africa,Swaziland,Clothes,Online,M,7/1/2011,437072026,8/13/2011,8180,109.28,35.84,893910.40,293171.20,600739.20
+Europe,Liechtenstein,Vegetables,Offline,L,11/28/2011,229355323,12/10/2011,192,154.06,90.93,29579.52,17458.56,12120.96
+Asia,Turkmenistan,Baby Food,Offline,C,4/27/2010,523892343,5/31/2010,241,255.28,159.42,61522.48,38420.22,23102.26
+Sub-Saharan Africa,Kenya,Office Supplies,Offline,H,1/18/2013,417606914,2/19/2013,8021,651.21,524.96,5223355.41,4210704.16,1012651.25
+Australia and Oceania,Fiji,Snacks,Online,H,5/3/2012,427735364,6/18/2012,5254,152.58,97.44,801655.32,511949.76,289705.56
+Central America and the Caribbean,Cuba,Clothes,Offline,L,11/4/2012,241826522,11/6/2012,697,109.28,35.84,76168.16,24980.48,51187.68
+Central America and the Caribbean,Dominican Republic,Cosmetics,Offline,H,9/22/2012,967741715,11/4/2012,5134,437.20,263.33,2244584.80,1351936.22,892648.58
+Middle East and North Africa,Saudi Arabia,Personal Care,Offline,C,12/29/2014,183654773,2/12/2015,6383,81.73,56.67,521682.59,361724.61,159957.98
+Sub-Saharan Africa,Angola,Clothes,Online,M,2/19/2016,488052022,2/19/2016,4294,109.28,35.84,469248.32,153896.96,315351.36
+Europe,Macedonia,Beverages,Offline,L,7/5/2017,949732291,8/14/2017,5745,47.45,31.79,272600.25,182633.55,89966.70
+Australia and Oceania,Kiribati,Snacks,Online,C,12/15/2013,257806909,12/21/2013,9648,152.58,97.44,1472091.84,940101.12,531990.72
+Asia,South Korea,Meat,Online,L,9/26/2012,771699702,10/29/2012,1946,421.89,364.69,820997.94,709686.74,111311.20
+Europe,San Marino,Household,Online,C,8/12/2014,871147000,8/25/2014,611,668.27,502.54,408312.97,307051.94,101261.03
+Europe,Cyprus,Baby Food,Online,M,1/18/2010,806197631,2/18/2010,649,255.28,159.42,165676.72,103463.58,62213.14
+Central America and the Caribbean,Cuba,Cereal,Online,L,4/16/2013,447212922,5/19/2013,9097,205.70,117.11,1871252.90,1065349.67,805903.23
+Central America and the Caribbean,Saint Lucia,Personal Care,Offline,M,2/22/2013,634866702,2/25/2013,20,81.73,56.67,1634.60,1133.40,501.20
+Sub-Saharan Africa,Liberia,Clothes,Online,C,8/18/2014,930145299,9/30/2014,9519,109.28,35.84,1040236.32,341160.96,699075.36
+Sub-Saharan Africa,Central African Republic,Fruits,Offline,M,6/20/2012,964347541,7/24/2012,722,9.33,6.92,6736.26,4996.24,1740.02
+Australia and Oceania,Australia,Cosmetics,Offline,H,1/9/2010,889084756,2/8/2010,8792,437.20,263.33,3843862.40,2315197.36,1528665.04
+Europe,Lithuania,Beverages,Offline,H,7/5/2015,926280772,7/21/2015,5919,47.45,31.79,280856.55,188165.01,92691.54
+Asia,Bhutan,Office Supplies,Online,H,6/24/2015,918171918,8/9/2015,6329,651.21,524.96,4121508.09,3322471.84,799036.25
+Australia and Oceania,Nauru,Beverages,Online,H,6/28/2016,777307021,7/5/2016,1276,47.45,31.79,60546.20,40564.04,19982.16
+Europe,Greece,Vegetables,Offline,L,1/8/2011,936547410,1/12/2011,4046,154.06,90.93,623326.76,367902.78,255423.98
+Sub-Saharan Africa,Gabon,Household,Offline,C,7/17/2011,999066913,8/14/2011,4956,668.27,502.54,3311946.12,2490588.24,821357.88
+North America,Canada,Household,Online,C,6/11/2016,188351857,7/13/2016,6355,668.27,502.54,4246855.85,3193641.70,1053214.15
+Europe,Slovenia,Cosmetics,Online,H,10/29/2013,498201072,11/7/2013,7623,437.20,263.33,3332775.60,2007364.59,1325411.01
+Europe,Cyprus,Snacks,Offline,H,7/27/2015,842725884,8/11/2015,171,152.58,97.44,26091.18,16662.24,9428.94
+Asia,Nepal,Fruits,Offline,C,9/7/2015,206350123,10/23/2015,2442,9.33,6.92,22783.86,16898.64,5885.22
+Sub-Saharan Africa,Guinea-Bissau,Snacks,Online,C,10/27/2016,793810117,11/3/2016,4909,152.58,97.44,749015.22,478332.96,270682.26
+Sub-Saharan Africa,Cote d'Ivoire,Vegetables,Offline,H,5/5/2011,380154693,6/20/2011,5076,154.06,90.93,782008.56,461560.68,320447.88
+Middle East and North Africa,Kuwait,Clothes,Offline,M,5/21/2015,860745179,6/10/2015,2481,109.28,35.84,271123.68,88919.04,182204.64
+Sub-Saharan Africa,Mozambique,Household,Online,L,1/28/2012,601255404,2/26/2012,3690,668.27,502.54,2465916.30,1854372.60,611543.70
+Asia,Uzbekistan,Cosmetics,Offline,L,11/25/2015,287671697,12/26/2015,7303,437.20,263.33,3192871.60,1923098.99,1269772.61
+Asia,South Korea,Office Supplies,Online,M,11/25/2015,676292884,12/21/2015,8948,651.21,524.96,5827027.08,4697342.08,1129685.00
+Europe,Latvia,Office Supplies,Online,L,5/1/2017,343730294,5/28/2017,6287,651.21,524.96,4094157.27,3300423.52,793733.75
+Europe,Georgia,Vegetables,Online,C,2/26/2015,636907756,4/1/2015,4013,154.06,90.93,618242.78,364902.09,253340.69
+Asia,China,Clothes,Online,L,12/19/2012,723061597,12/29/2012,8849,109.28,35.84,967018.72,317148.16,649870.56
+Sub-Saharan Africa,Tanzania,Snacks,Online,L,8/24/2011,739740645,9/1/2011,4551,152.58,97.44,694391.58,443449.44,250942.14
+Europe,Czech Republic,Cereal,Online,H,2/16/2013,444806230,4/1/2013,6903,205.70,117.11,1419947.10,808410.33,611536.77
+Asia,Nepal,Vegetables,Online,H,8/21/2016,566432178,9/9/2016,8724,154.06,90.93,1344019.44,793273.32,550746.12
+Sub-Saharan Africa,Sao Tome and Principe,Baby Food,Online,H,11/21/2014,553104817,11/23/2014,4862,255.28,159.42,1241171.36,775100.04,466071.32
+Central America and the Caribbean,Saint Kitts and Nevis ,Clothes,Offline,C,1/4/2013,823622977,2/22/2013,7197,109.28,35.84,786488.16,257940.48,528547.68
+Europe,Latvia,Snacks,Online,M,3/18/2017,517097985,4/14/2017,9640,152.58,97.44,1470871.20,939321.60,531549.60
+Europe,Netherlands,Beverages,Offline,M,10/27/2015,642953670,12/9/2015,3134,47.45,31.79,148708.30,99629.86,49078.44
+Asia,Brunei,Beverages,Online,M,5/19/2013,930926358,6/4/2013,651,47.45,31.79,30889.95,20695.29,10194.66
+Sub-Saharan Africa,Central African Republic,Vegetables,Offline,L,9/20/2011,281064879,9/26/2011,2199,154.06,90.93,338777.94,199955.07,138822.87
+Asia,Bhutan,Baby Food,Offline,C,9/21/2013,813730561,10/26/2013,9811,255.28,159.42,2504552.08,1564069.62,940482.46
+Sub-Saharan Africa,Mauritius ,Fruits,Offline,H,12/25/2011,219597232,1/5/2012,2556,9.33,6.92,23847.48,17687.52,6159.96
+Australia and Oceania,Australia,Snacks,Offline,H,4/22/2015,309651219,5/1/2015,1532,152.58,97.44,233752.56,149278.08,84474.48
+Europe,Serbia,Snacks,Offline,M,8/18/2014,265191352,9/26/2014,4869,152.58,97.44,742912.02,474435.36,268476.66
+Central America and the Caribbean,Barbados,Snacks,Offline,L,2/4/2017,687828958,3/2/2017,2728,152.58,97.44,416238.24,265816.32,150421.92
+Central America and the Caribbean,Honduras,Household,Offline,C,12/29/2011,449487864,2/1/2012,2303,668.27,502.54,1539025.81,1157349.62,381676.19
+Australia and Oceania,Tonga,Baby Food,Online,L,5/19/2012,742404401,6/27/2012,2815,255.28,159.42,718613.20,448767.30,269845.90
+Europe,Latvia,Office Supplies,Online,L,6/16/2013,129127395,6/20/2013,520,651.21,524.96,338629.20,272979.20,65650.00
+Europe,Serbia,Vegetables,Offline,M,6/25/2011,392518174,7/3/2011,3705,154.06,90.93,570792.30,336895.65,233896.65
+Middle East and North Africa,Tunisia ,Vegetables,Online,H,2/21/2015,685750567,3/11/2015,7687,154.06,90.93,1184259.22,698978.91,485280.31
+Central America and the Caribbean,Guatemala,Personal Care,Offline,L,6/21/2011,682310903,7/3/2011,9813,81.73,56.67,802016.49,556102.71,245913.78
+Sub-Saharan Africa,Rwanda,Office Supplies,Online,C,1/25/2015,125998008,2/3/2015,4465,651.21,524.96,2907652.65,2343946.40,563706.25
+Middle East and North Africa,Azerbaijan,Baby Food,Online,M,4/24/2011,180923211,6/2/2011,8054,255.28,159.42,2056025.12,1283968.68,772056.44
+Asia,Taiwan,Meat,Online,M,2/22/2013,281510341,3/16/2013,4020,421.89,364.69,1695997.80,1466053.80,229944.00
+Middle East and North Africa,Jordan,Clothes,Offline,L,11/11/2011,382495725,12/21/2011,7840,109.28,35.84,856755.20,280985.60,575769.60
+Middle East and North Africa,Somalia,Baby Food,Online,L,3/7/2011,508928191,3/19/2011,2016,255.28,159.42,514644.48,321390.72,193253.76
+Asia,Bhutan,Snacks,Online,M,11/16/2015,306169068,12/12/2015,1086,152.58,97.44,165701.88,105819.84,59882.04
+Central America and the Caribbean,Panama,Fruits,Online,M,11/12/2012,389892184,11/14/2012,6616,9.33,6.92,61727.28,45782.72,15944.56
+Middle East and North Africa,Afghanistan,Snacks,Offline,H,11/5/2012,996083867,12/1/2012,2206,152.58,97.44,336591.48,214952.64,121638.84
+Australia and Oceania,Samoa ,Vegetables,Offline,C,3/23/2016,631042945,4/14/2016,8485,154.06,90.93,1307199.10,771541.05,535658.05
+Europe,Malta,Fruits,Online,C,11/21/2016,121380746,12/18/2016,8115,9.33,6.92,75712.95,56155.80,19557.15
+Middle East and North Africa,Kuwait,Baby Food,Offline,M,8/5/2013,364021098,8/22/2013,787,255.28,159.42,200905.36,125463.54,75441.82
+Sub-Saharan Africa,Sudan,Baby Food,Online,M,9/19/2013,976200330,10/20/2013,8226,255.28,159.42,2099933.28,1311388.92,788544.36
+Europe,Russia,Clothes,Offline,M,5/8/2014,745467269,6/23/2014,9186,109.28,35.84,1003846.08,329226.24,674619.84
+Sub-Saharan Africa,Namibia,Fruits,Offline,M,8/25/2013,779683244,8/25/2013,4453,9.33,6.92,41546.49,30814.76,10731.73
+Middle East and North Africa,Oman,Snacks,Online,C,8/15/2014,457022082,9/10/2014,1845,152.58,97.44,281510.10,179776.80,101733.30
+Sub-Saharan Africa,Malawi,Meat,Offline,M,10/4/2013,575970113,10/16/2013,1211,421.89,364.69,510908.79,441639.59,69269.20
+Asia,Tajikistan,Vegetables,Online,H,6/2/2012,205326163,7/12/2012,9429,154.06,90.93,1452631.74,857378.97,595252.77
+Central America and the Caribbean,Haiti,Cosmetics,Offline,M,1/5/2013,734201562,1/8/2013,5413,437.20,263.33,2366563.60,1425405.29,941158.31
+Asia,Singapore,Baby Food,Offline,C,3/27/2015,922020137,4/30/2015,5103,255.28,159.42,1302693.84,813520.26,489173.58
+Europe,Bulgaria,Meat,Offline,H,4/7/2012,948518216,5/4/2012,6473,421.89,364.69,2730893.97,2360638.37,370255.60
+Europe,Finland,Office Supplies,Offline,L,4/17/2017,163744628,5/1/2017,4529,651.21,524.96,2949330.09,2377543.84,571786.25
+Middle East and North Africa,Kuwait,Fruits,Offline,L,4/9/2014,238060700,5/24/2014,6306,9.33,6.92,58834.98,43637.52,15197.46
+Middle East and North Africa,United Arab Emirates,Clothes,Offline,M,9/22/2014,212140262,9/22/2014,5872,109.28,35.84,641692.16,210452.48,431239.68
+Sub-Saharan Africa,Mauritius ,Fruits,Offline,C,2/6/2016,546969640,3/10/2016,9326,9.33,6.92,87011.58,64535.92,22475.66
+North America,Greenland,Cosmetics,Online,M,2/12/2013,873847663,3/10/2013,9797,437.20,263.33,4283248.40,2579844.01,1703404.39
+Australia and Oceania,Samoa ,Household,Online,M,9/18/2016,444385659,10/18/2016,2447,668.27,502.54,1635256.69,1229715.38,405541.31
+Asia,Nepal,Fruits,Online,M,5/20/2012,380507457,6/23/2012,9467,9.33,6.92,88327.11,65511.64,22815.47
+Sub-Saharan Africa,Cote d'Ivoire,Beverages,Offline,M,12/22/2016,524449384,1/29/2017,5082,47.45,31.79,241140.90,161556.78,79584.12
+Asia,Sri Lanka,Clothes,Offline,L,4/30/2014,788760268,6/1/2014,546,109.28,35.84,59666.88,19568.64,40098.24
+Europe,Greece,Household,Offline,M,1/23/2012,706301438,2/11/2012,9146,668.27,502.54,6111997.42,4596230.84,1515766.58
+Asia,Bhutan,Snacks,Online,C,1/27/2015,780246722,3/9/2015,1199,152.58,97.44,182943.42,116830.56,66112.86
+Europe,Montenegro,Clothes,Online,C,3/9/2014,234082448,3/9/2014,9053,109.28,35.84,989311.84,324459.52,664852.32
+Europe,Romania,Meat,Offline,L,8/22/2012,161607444,10/3/2012,2089,421.89,364.69,881328.21,761837.41,119490.80
+Sub-Saharan Africa,Ghana,Meat,Offline,C,9/29/2014,376933038,10/19/2014,1717,421.89,364.69,724385.13,626172.73,98212.40
+Europe,Lithuania,Meat,Offline,C,7/6/2014,764483058,8/5/2014,6380,421.89,364.69,2691658.20,2326722.20,364936.00
+Europe,Iceland,Baby Food,Offline,M,8/5/2014,828993833,9/2/2014,6552,255.28,159.42,1672594.56,1044519.84,628074.72
+Asia,Brunei,Meat,Online,H,12/2/2014,145514190,12/13/2014,9737,421.89,364.69,4107942.93,3550986.53,556956.40
+Central America and the Caribbean,Cuba,Fruits,Online,L,6/25/2016,609405457,8/3/2016,5472,9.33,6.92,51053.76,37866.24,13187.52
+Sub-Saharan Africa,Chad,Household,Online,L,7/24/2017,586341464,7/31/2017,324,668.27,502.54,216519.48,162822.96,53696.52
+Australia and Oceania,East Timor,Beverages,Offline,C,6/27/2017,762308537,7/25/2017,2891,47.45,31.79,137177.95,91904.89,45273.06
+Middle East and North Africa,Bahrain,Cereal,Online,H,11/17/2012,993605506,11/17/2012,8804,205.70,117.11,1810982.80,1031036.44,779946.36
+Middle East and North Africa,Oman,Fruits,Online,H,7/26/2016,756843698,8/30/2016,5724,9.33,6.92,53404.92,39610.08,13794.84
+Europe,Bosnia and Herzegovina,Meat,Offline,C,12/9/2015,498946940,1/11/2016,8342,421.89,364.69,3519406.38,3042243.98,477162.40
+Europe,Switzerland,Personal Care,Offline,M,8/2/2014,287151563,8/11/2014,3383,81.73,56.67,276492.59,191714.61,84777.98
+Europe,Croatia,Office Supplies,Online,C,5/22/2013,259006392,6/6/2013,4602,651.21,524.96,2996868.42,2415865.92,581002.50
+Asia,Nepal,Clothes,Online,H,4/15/2014,172372758,4/30/2014,7784,109.28,35.84,850635.52,278978.56,571656.96
+Central America and the Caribbean,Haiti,Cosmetics,Online,C,7/3/2016,755424487,7/17/2016,5748,437.20,263.33,2513025.60,1513620.84,999404.76
+Europe,United Kingdom,Vegetables,Online,C,9/30/2012,556647908,10/29/2012,3341,154.06,90.93,514714.46,303797.13,210917.33
+Sub-Saharan Africa,South Africa,Clothes,Online,M,9/25/2015,894841849,10/8/2015,2443,109.28,35.84,266971.04,87557.12,179413.92
+Central America and the Caribbean,Grenada,Snacks,Online,L,7/3/2016,909117639,8/10/2016,6967,152.58,97.44,1063024.86,678864.48,384160.38
+Asia,India,Baby Food,Offline,M,12/24/2010,708899104,1/1/2011,7853,255.28,159.42,2004713.84,1251925.26,752788.58
+Europe,Ireland,Vegetables,Offline,M,4/9/2011,923922574,5/23/2011,8076,154.06,90.93,1244188.56,734350.68,509837.88
+Middle East and North Africa,Tunisia ,Vegetables,Offline,M,8/18/2011,454236876,8/22/2011,7641,154.06,90.93,1177172.46,694796.13,482376.33
+Middle East and North Africa,Algeria,Snacks,Online,L,12/9/2014,520203340,12/19/2014,8583,152.58,97.44,1309594.14,836327.52,473266.62
+Australia and Oceania,Papua New Guinea,Cereal,Online,L,10/19/2013,612495791,11/10/2013,9971,205.70,117.11,2051034.70,1167703.81,883330.89
+Europe,San Marino,Snacks,Offline,C,1/4/2017,742100560,1/17/2017,2902,152.58,97.44,442787.16,282770.88,160016.28
+Sub-Saharan Africa,Senegal,Fruits,Online,H,7/7/2015,990316474,8/21/2015,5507,9.33,6.92,51380.31,38108.44,13271.87
+Middle East and North Africa,Algeria,Beverages,Offline,M,6/13/2016,158754861,7/24/2016,7946,47.45,31.79,377037.70,252603.34,124434.36
+Sub-Saharan Africa,Niger,Household,Offline,C,9/5/2016,719339549,9/21/2016,7413,668.27,502.54,4953885.51,3725329.02,1228556.49
+Middle East and North Africa,Saudi Arabia,Cereal,Online,L,2/12/2014,264306867,3/29/2014,3130,205.70,117.11,643841.00,366554.30,277286.70
+Asia,Mongolia,Snacks,Offline,C,7/13/2011,956205642,8/25/2011,1353,152.58,97.44,206440.74,131836.32,74604.42
+Asia,Brunei,Vegetables,Offline,L,10/4/2012,977897202,11/11/2012,368,154.06,90.93,56694.08,33462.24,23231.84
+Asia,India,Baby Food,Online,L,5/4/2011,382555377,6/19/2011,5492,255.28,159.42,1401997.76,875534.64,526463.12
+Asia,Kazakhstan,Fruits,Offline,L,1/8/2017,643666493,2/23/2017,4074,9.33,6.92,38010.42,28192.08,9818.34
+Europe,France,Fruits,Offline,H,2/12/2014,605029380,2/18/2014,493,9.33,6.92,4599.69,3411.56,1188.13
+Asia,Turkmenistan,Fruits,Online,L,9/22/2010,530755364,9/29/2010,1162,9.33,6.92,10841.46,8041.04,2800.42
+Australia and Oceania,Palau,Vegetables,Offline,M,3/18/2012,755268275,4/6/2012,9521,154.06,90.93,1466805.26,865744.53,601060.73
+Europe,Cyprus,Meat,Online,L,6/11/2017,333304440,7/5/2017,1046,421.89,364.69,441296.94,381465.74,59831.20
+Asia,South Korea,Snacks,Offline,M,12/28/2014,189912688,2/9/2015,8240,152.58,97.44,1257259.20,802905.60,454353.60
+Australia and Oceania,Australia,Beverages,Online,M,3/18/2017,870454347,3/26/2017,5639,47.45,31.79,267570.55,179263.81,88306.74
+Asia,Kazakhstan,Beverages,Online,C,1/6/2011,290603244,2/21/2011,4813,47.45,31.79,228376.85,153005.27,75371.58
+Europe,Russia,Cosmetics,Offline,H,9/3/2014,486345708,10/11/2014,9357,437.20,263.33,4090880.40,2463978.81,1626901.59
+Central America and the Caribbean,Haiti,Personal Care,Offline,M,6/10/2013,863980567,6/20/2013,9904,81.73,56.67,809453.92,561259.68,248194.24
+Sub-Saharan Africa,Kenya,Personal Care,Offline,C,5/12/2016,450119149,7/1/2016,9114,81.73,56.67,744887.22,516490.38,228396.84
+Sub-Saharan Africa,Burkina Faso,Snacks,Online,H,8/12/2014,141685283,9/12/2014,6679,152.58,97.44,1019081.82,650801.76,368280.06
+Sub-Saharan Africa,Togo,Office Supplies,Online,L,7/28/2015,455915296,9/11/2015,4322,651.21,524.96,2814529.62,2268877.12,545652.50
+Europe,Malta,Beverages,Online,M,4/30/2016,180358016,5/16/2016,800,47.45,31.79,37960.00,25432.00,12528.00
+Asia,Thailand,Meat,Offline,H,1/17/2015,422874772,2/23/2015,6897,421.89,364.69,2909775.33,2515266.93,394508.40
+Middle East and North Africa,Yemen,Vegetables,Offline,M,9/20/2014,561639392,10/25/2014,432,154.06,90.93,66553.92,39281.76,27272.16
+Asia,Bhutan,Meat,Offline,L,11/9/2011,495138204,11/11/2011,1252,421.89,364.69,528206.28,456591.88,71614.40
+Sub-Saharan Africa,Tanzania,Baby Food,Online,H,5/17/2015,192170035,6/5/2015,6239,255.28,159.42,1592691.92,994621.38,598070.54
+Europe,Georgia,Clothes,Online,H,7/18/2012,141846215,8/16/2012,4302,109.28,35.84,470122.56,154183.68,315938.88
+Middle East and North Africa,Oman,Clothes,Offline,L,8/19/2010,903590571,9/1/2010,1385,109.28,35.84,151352.80,49638.40,101714.40
+Middle East and North Africa,Libya,Meat,Online,L,5/24/2010,857139432,6/11/2010,5460,421.89,364.69,2303519.40,1991207.40,312312.00
+Europe,Moldova ,Baby Food,Offline,C,6/9/2017,252541625,7/5/2017,1534,255.28,159.42,391599.52,244550.28,147049.24
+Sub-Saharan Africa,South Sudan,Household,Offline,H,9/22/2015,760158479,10/26/2015,6641,668.27,502.54,4437981.07,3337368.14,1100612.93
+Australia and Oceania,Marshall Islands,Cosmetics,Offline,C,10/11/2016,520663821,11/6/2016,4850,437.20,263.33,2120420.00,1277150.50,843269.50
+Sub-Saharan Africa,Uganda,Snacks,Offline,H,6/20/2010,895043981,6/21/2010,2259,152.58,97.44,344678.22,220116.96,124561.26
+Europe,Montenegro,Cosmetics,Offline,C,3/29/2014,614597785,5/14/2014,1997,437.20,263.33,873088.40,525870.01,347218.39
+Asia,Philippines,Office Supplies,Online,L,4/21/2016,730936563,4/30/2016,9227,651.21,524.96,6008714.67,4843805.92,1164908.75
+Sub-Saharan Africa,Nigeria,Snacks,Online,C,4/22/2017,565984141,5/22/2017,6140,152.58,97.44,936841.20,598281.60,338559.60
+Europe,Sweden,Personal Care,Offline,H,5/17/2011,861976850,5/25/2011,6960,81.73,56.67,568840.80,394423.20,174417.60
+Europe,Czech Republic,Clothes,Offline,L,8/21/2012,631463515,9/25/2012,2942,109.28,35.84,321501.76,105441.28,216060.48
+Europe,Moldova ,Fruits,Online,M,7/29/2013,307305467,8/10/2013,7371,9.33,6.92,68771.43,51007.32,17764.11
+Europe,Cyprus,Cereal,Offline,H,7/5/2011,392676532,8/6/2011,567,205.70,117.11,116631.90,66401.37,50230.53
+Europe,Luxembourg,Baby Food,Online,L,5/26/2012,111063039,7/13/2012,4876,255.28,159.42,1244745.28,777331.92,467413.36
+Europe,Spain,Beverages,Online,M,12/5/2011,556263816,12/7/2011,9679,47.45,31.79,459268.55,307695.41,151573.14
+Middle East and North Africa,Yemen,Vegetables,Online,C,5/24/2014,642390191,5/26/2014,6388,154.06,90.93,984135.28,580860.84,403274.44
+Sub-Saharan Africa,Liberia,Baby Food,Online,M,10/24/2013,253865993,12/4/2013,3444,255.28,159.42,879184.32,549042.48,330141.84
+Asia,Indonesia,Vegetables,Offline,M,11/2/2012,695427548,11/29/2012,1320,154.06,90.93,203359.20,120027.60,83331.60
+Europe,Greece,Beverages,Online,M,5/25/2011,642123687,5/30/2011,7523,47.45,31.79,356966.35,239156.17,117810.18
+Asia,China,Beverages,Online,M,6/26/2010,189315736,8/1/2010,1588,47.45,31.79,75350.60,50482.52,24868.08
+Central America and the Caribbean,Trinidad and Tobago,Snacks,Offline,C,12/12/2015,402677524,12/27/2015,82,152.58,97.44,12511.56,7990.08,4521.48
+Sub-Saharan Africa,Kenya,Clothes,Offline,L,12/23/2011,168195378,12/27/2011,1605,109.28,35.84,175394.40,57523.20,117871.20
+Europe,Czech Republic,Beverages,Online,M,5/2/2010,242168128,5/3/2010,1785,47.45,31.79,84698.25,56745.15,27953.10
+Asia,Singapore,Fruits,Offline,C,4/11/2016,101207101,5/2/2016,8285,9.33,6.92,77299.05,57332.20,19966.85
+Europe,Croatia,Beverages,Offline,H,3/11/2017,192236125,3/22/2017,5796,47.45,31.79,275020.20,184254.84,90765.36
+Asia,South Korea,Personal Care,Offline,M,9/3/2016,582491528,10/10/2016,1042,81.73,56.67,85162.66,59050.14,26112.52
+Sub-Saharan Africa,Madagascar,Fruits,Offline,L,8/9/2015,509522140,9/28/2015,7779,9.33,6.92,72578.07,53830.68,18747.39
+Australia and Oceania,Australia,Personal Care,Offline,M,12/2/2015,631189286,12/17/2015,1791,81.73,56.67,146378.43,101495.97,44882.46
+Middle East and North Africa,Jordan,Fruits,Online,C,11/3/2016,775666797,12/11/2016,5897,9.33,6.92,55019.01,40807.24,14211.77
+Middle East and North Africa,United Arab Emirates,Beverages,Offline,L,1/31/2011,391440999,3/5/2011,4945,47.45,31.79,234640.25,157201.55,77438.70
+Middle East and North Africa,Iran,Baby Food,Offline,C,5/8/2011,797310721,5/14/2011,815,255.28,159.42,208053.20,129927.30,78125.90
+Sub-Saharan Africa,South Africa,Baby Food,Offline,H,4/10/2016,232387292,5/7/2016,7419,255.28,159.42,1893922.32,1182736.98,711185.34
+Sub-Saharan Africa,Burkina Faso,Fruits,Offline,L,3/9/2014,606094539,3/10/2014,5698,9.33,6.92,53162.34,39430.16,13732.18
+Sub-Saharan Africa,Mali,Baby Food,Offline,M,3/16/2017,748168790,5/5/2017,8626,255.28,159.42,2202045.28,1375156.92,826888.36
+Sub-Saharan Africa,Sierra Leone,Meat,Offline,M,1/4/2012,458658874,2/3/2012,6208,421.89,364.69,2619093.12,2263995.52,355097.60
+Europe,Greece,Snacks,Online,L,8/18/2016,957926118,9/1/2016,480,152.58,97.44,73238.40,46771.20,26467.20
+Middle East and North Africa,Iraq,Baby Food,Offline,L,2/2/2016,836644351,2/13/2016,510,255.28,159.42,130192.80,81304.20,48888.60
+Asia,Philippines,Cereal,Online,C,8/14/2011,105799901,9/29/2011,7397,205.70,117.11,1521562.90,866262.67,655300.23
+Europe,Austria,Beverages,Online,H,11/14/2016,646691596,12/13/2016,9269,47.45,31.79,439814.05,294661.51,145152.54
+Sub-Saharan Africa,Mali,Cosmetics,Offline,M,4/11/2016,360930764,5/15/2016,6289,437.20,263.33,2749550.80,1656082.37,1093468.43
+Asia,Sri Lanka,Snacks,Online,C,4/7/2014,820441234,5/2/2014,5648,152.58,97.44,861771.84,550341.12,311430.72
+North America,Mexico,Vegetables,Online,C,4/28/2016,517459332,5/27/2016,6570,154.06,90.93,1012174.20,597410.10,414764.10
+Sub-Saharan Africa,Niger,Office Supplies,Online,H,1/29/2010,714533889,2/7/2010,5311,651.21,524.96,3458576.31,2788062.56,670513.75
+Central America and the Caribbean,Guatemala,Office Supplies,Online,M,7/5/2014,494526231,8/19/2014,156,651.21,524.96,101588.76,81893.76,19695.00
+Sub-Saharan Africa,South Sudan,Beverages,Offline,L,7/31/2015,810610187,7/31/2015,6423,47.45,31.79,304771.35,204187.17,100584.18
+North America,United States of America,Cereal,Online,L,6/22/2015,436272084,6/28/2015,1460,205.70,117.11,300322.00,170980.60,129341.40
+Sub-Saharan Africa,Zimbabwe,Vegetables,Online,L,8/23/2013,915310752,9/23/2013,9647,154.06,90.93,1486216.82,877201.71,609015.11
+Middle East and North Africa,Egypt,Household,Offline,M,8/11/2010,711837518,8/14/2010,7395,668.27,502.54,4941856.65,3716283.30,1225573.35
+Sub-Saharan Africa,South Sudan,Office Supplies,Online,M,10/1/2011,160276210,11/15/2011,8147,651.21,524.96,5305407.87,4276849.12,1028558.75
+Europe,Ukraine,Office Supplies,Offline,H,12/4/2015,115363156,1/10/2016,7376,651.21,524.96,4803324.96,3872104.96,931220.00
+Australia and Oceania,Kiribati,Snacks,Offline,H,9/15/2011,602147185,9/15/2011,7588,152.58,97.44,1157777.04,739374.72,418402.32
+Sub-Saharan Africa,Tanzania,Fruits,Online,C,6/13/2011,365989625,7/2/2011,3318,9.33,6.92,30956.94,22960.56,7996.38
+Europe,Vatican City,Household,Offline,L,3/17/2017,922564303,4/2/2017,6134,668.27,502.54,4099168.18,3082580.36,1016587.82
+Sub-Saharan Africa,Senegal,Household,Online,M,12/20/2016,707857549,1/16/2017,9634,668.27,502.54,6438113.18,4841470.36,1596642.82
+Europe,Bulgaria,Cereal,Offline,H,2/17/2011,928168189,3/15/2011,4448,205.70,117.11,914953.60,520905.28,394048.32
+Middle East and North Africa,Kuwait,Fruits,Online,M,4/23/2016,610107553,6/12/2016,3238,9.33,6.92,30210.54,22406.96,7803.58
+Middle East and North Africa,Pakistan,Clothes,Offline,H,2/7/2016,650599467,3/1/2016,5695,109.28,35.84,622349.60,204108.80,418240.80
+Australia and Oceania,Samoa ,Baby Food,Online,M,4/29/2010,666880261,6/4/2010,3544,255.28,159.42,904712.32,564984.48,339727.84
+Europe,Monaco,Vegetables,Online,L,3/18/2011,346498763,4/2/2011,5539,154.06,90.93,853338.34,503661.27,349677.07
+Europe,Serbia,Beverages,Offline,H,11/29/2016,797316300,11/29/2016,2466,47.45,31.79,117011.70,78394.14,38617.56
+Europe,Ireland,Baby Food,Online,H,4/18/2015,497506701,5/10/2015,2144,255.28,159.42,547320.32,341796.48,205523.84
+Europe,Andorra,Personal Care,Online,C,6/5/2010,245556294,6/25/2010,4419,81.73,56.67,361164.87,250424.73,110740.14
+Sub-Saharan Africa,Democratic Republic of the Congo,Snacks,Offline,M,3/26/2011,910263907,4/21/2011,6173,152.58,97.44,941876.34,601497.12,340379.22
+Middle East and North Africa,Algeria,Meat,Online,H,7/19/2012,280740869,8/20/2012,6317,421.89,364.69,2665079.13,2303746.73,361332.40
+Europe,Latvia,Personal Care,Online,L,1/27/2014,716411006,2/17/2014,792,81.73,56.67,64730.16,44882.64,19847.52
+Middle East and North Africa,Egypt,Clothes,Offline,L,7/25/2016,597010648,9/2/2016,7572,109.28,35.84,827468.16,271380.48,556087.68
+Central America and the Caribbean,Costa Rica,Clothes,Offline,L,6/26/2010,172588622,7/12/2010,1663,109.28,35.84,181732.64,59601.92,122130.72
+Central America and the Caribbean,Honduras,Fruits,Offline,L,1/30/2010,213506257,1/31/2010,101,9.33,6.92,942.33,698.92,243.41
+Sub-Saharan Africa,Burundi,Clothes,Offline,M,9/25/2011,660437381,10/24/2011,6952,109.28,35.84,759714.56,249159.68,510554.88
+Asia,South Korea,Personal Care,Online,C,11/19/2012,174368321,1/6/2013,8316,81.73,56.67,679666.68,471267.72,208398.96
+Europe,Liechtenstein,Office Supplies,Online,M,11/1/2015,186597907,12/15/2015,7322,651.21,524.96,4768159.62,3843757.12,924402.50
+Europe,Armenia,Vegetables,Online,L,5/15/2016,848737466,5/31/2016,9132,154.06,90.93,1406875.92,830372.76,576503.16
+Central America and the Caribbean,Saint Vincent and the Grenadines,Household,Online,C,2/17/2015,582710826,2/20/2015,5937,668.27,502.54,3967518.99,2983579.98,983939.01
+Europe,France,Office Supplies,Online,H,10/27/2013,130754315,11/2/2013,1962,651.21,524.96,1277674.02,1029971.52,247702.50
+Central America and the Caribbean,Guatemala,Beverages,Online,L,6/4/2011,305416762,6/20/2011,8462,47.45,31.79,401521.90,269006.98,132514.92
+Central America and the Caribbean,Antigua and Barbuda ,Beverages,Offline,L,7/24/2015,639559495,8/27/2015,8722,47.45,31.79,413858.90,277272.38,136586.52
+Sub-Saharan Africa,Central African Republic,Personal Care,Online,L,12/27/2015,736356341,12/28/2015,3060,81.73,56.67,250093.80,173410.20,76683.60
+Europe,Netherlands,Office Supplies,Offline,M,2/2/2011,719293630,2/25/2011,3824,651.21,524.96,2490227.04,2007447.04,482780.00
+Central America and the Caribbean,El Salvador,Personal Care,Online,L,9/9/2011,782170188,10/21/2011,395,81.73,56.67,32283.35,22384.65,9898.70
+Sub-Saharan Africa,Niger,Vegetables,Offline,M,7/8/2014,739097344,7/20/2014,4183,154.06,90.93,644432.98,380360.19,264072.79
+Middle East and North Africa,Saudi Arabia,Household,Online,H,8/3/2013,474498927,9/3/2013,3632,668.27,502.54,2427156.64,1825225.28,601931.36
+Sub-Saharan Africa,The Gambia,Snacks,Online,M,7/23/2011,393111264,7/26/2011,9214,152.58,97.44,1405872.12,897812.16,508059.96
+Sub-Saharan Africa,Kenya,Meat,Online,C,12/2/2015,969983184,12/29/2015,8434,421.89,364.69,3558220.26,3075795.46,482424.80
+North America,Canada,Snacks,Offline,M,7/12/2012,500476014,7/22/2012,829,152.58,97.44,126488.82,80777.76,45711.06
+Sub-Saharan Africa,Angola,Fruits,Offline,H,10/21/2014,950263583,10/21/2014,2966,9.33,6.92,27672.78,20524.72,7148.06
+Sub-Saharan Africa,Central African Republic,Snacks,Offline,L,7/5/2014,305332219,7/12/2014,3444,152.58,97.44,525485.52,335583.36,189902.16
+Central America and the Caribbean,The Bahamas,Baby Food,Online,C,11/1/2015,221980750,12/3/2015,7892,255.28,159.42,2014669.76,1258142.64,756527.12
+Asia,South Korea,Meat,Online,H,6/17/2016,176820504,7/22/2016,3971,421.89,364.69,1675325.19,1448183.99,227141.20
+Europe,Kosovo,Office Supplies,Offline,C,5/7/2011,616775310,5/24/2011,6375,651.21,524.96,4151463.75,3346620.00,804843.75
+Sub-Saharan Africa,Angola,Clothes,Online,L,9/1/2011,709081494,10/13/2011,1826,109.28,35.84,199545.28,65443.84,134101.44
+Europe,Finland,Fruits,Offline,L,9/20/2010,591287887,10/2/2010,4080,9.33,6.92,38066.40,28233.60,9832.80
+Sub-Saharan Africa,Mauritania,Personal Care,Offline,H,6/14/2010,921255815,7/28/2010,8923,81.73,56.67,729276.79,505666.41,223610.38
+Sub-Saharan Africa,Niger,Meat,Online,M,1/29/2010,627159106,3/9/2010,9171,421.89,364.69,3869153.19,3344571.99,524581.20
+Asia,South Korea,Household,Online,L,6/18/2017,957484090,7/3/2017,9674,668.27,502.54,6464843.98,4861571.96,1603272.02
+North America,Greenland,Office Supplies,Online,C,1/6/2015,531029593,2/2/2015,2312,651.21,524.96,1505597.52,1213707.52,291890.00
+Middle East and North Africa,Lebanon,Vegetables,Offline,C,7/7/2016,286906945,8/21/2016,996,154.06,90.93,153443.76,90566.28,62877.48
+Europe,Italy,Clothes,Online,M,4/18/2010,334539973,5/11/2010,6667,109.28,35.84,728569.76,238945.28,489624.48
+Europe,Belarus,Snacks,Offline,C,1/16/2016,403665006,2/19/2016,2300,152.58,97.44,350934.00,224112.00,126822.00
+North America,United States of America,Beverages,Offline,C,11/12/2012,294330871,12/16/2012,7900,47.45,31.79,374855.00,251141.00,123714.00
+Central America and the Caribbean,Saint Kitts and Nevis ,Baby Food,Offline,H,3/22/2011,326898896,5/7/2011,5503,255.28,159.42,1404805.84,877288.26,527517.58
+Europe,Poland,Cosmetics,Offline,H,4/13/2011,892042911,5/12/2011,4175,437.20,263.33,1825310.00,1099402.75,725907.25
+Sub-Saharan Africa,Kenya,Office Supplies,Offline,H,4/9/2014,200749242,4/15/2014,5017,651.21,524.96,3267120.57,2633724.32,633396.25
+Sub-Saharan Africa,Kenya,Clothes,Offline,L,2/17/2011,134316718,3/30/2011,6157,109.28,35.84,672836.96,220666.88,452170.08
+Europe,United Kingdom,Household,Online,C,7/30/2016,394356667,8/4/2016,7756,668.27,502.54,5183102.12,3897700.24,1285401.88
+Europe,Norway,Fruits,Offline,M,4/29/2012,752792918,5/12/2012,7008,9.33,6.92,65384.64,48495.36,16889.28
+Sub-Saharan Africa,Zimbabwe,Snacks,Offline,L,6/8/2011,601861798,7/20/2011,3136,152.58,97.44,478490.88,305571.84,172919.04
+Central America and the Caribbean,Saint Lucia,Fruits,Offline,H,9/3/2016,304112136,9/7/2016,2394,9.33,6.92,22336.02,16566.48,5769.54
+Middle East and North Africa,United Arab Emirates,Clothes,Online,M,9/24/2016,742405259,10/24/2016,3069,109.28,35.84,335380.32,109992.96,225387.36
+Sub-Saharan Africa,Lesotho,Baby Food,Online,L,9/21/2012,169914996,10/25/2012,478,255.28,159.42,122023.84,76202.76,45821.08
+Asia,Sri Lanka,Cereal,Offline,H,5/26/2014,960127675,7/11/2014,1970,205.70,117.11,405229.00,230706.70,174522.30
+North America,Mexico,Personal Care,Offline,M,8/22/2013,156842124,9/25/2013,1925,81.73,56.67,157330.25,109089.75,48240.50
+Middle East and North Africa,Yemen,Vegetables,Offline,L,12/21/2010,724169671,1/18/2011,6753,154.06,90.93,1040367.18,614050.29,426316.89
+Sub-Saharan Africa,Sao Tome and Principe,Clothes,Offline,C,10/6/2011,296534144,11/24/2011,9898,109.28,35.84,1081653.44,354744.32,726909.12
+Sub-Saharan Africa,Guinea,Personal Care,Online,C,11/17/2014,628671872,12/15/2014,6832,81.73,56.67,558379.36,387169.44,171209.92
+Sub-Saharan Africa,Sudan,Baby Food,Online,M,6/19/2016,845631682,7/26/2016,61,255.28,159.42,15572.08,9724.62,5847.46
+Australia and Oceania,Kiribati,Household,Offline,M,9/24/2013,592774903,10/2/2013,4122,668.27,502.54,2754608.94,2071469.88,683139.06
+Asia,Laos,Personal Care,Offline,L,4/21/2016,485775363,5/7/2016,580,81.73,56.67,47403.40,32868.60,14534.80
+Europe,Bosnia and Herzegovina,Vegetables,Online,C,3/2/2012,760619390,4/16/2012,3035,154.06,90.93,467572.10,275972.55,191599.55
+Asia,Malaysia,Household,Offline,M,11/13/2016,823605811,12/3/2016,2117,668.27,502.54,1414727.59,1063877.18,350850.41
+Sub-Saharan Africa,Burkina Faso,Baby Food,Offline,H,9/23/2016,601345956,10/20/2016,486,255.28,159.42,124066.08,77478.12,46587.96
+Sub-Saharan Africa,Namibia,Beverages,Offline,L,6/30/2010,990763652,8/12/2010,7836,47.45,31.79,371818.20,249106.44,122711.76
+Asia,Taiwan,Clothes,Online,M,2/15/2013,709095227,2/20/2013,5890,109.28,35.84,643659.20,211097.60,432561.60
+Europe,Ukraine,Beverages,Online,M,2/19/2014,343889510,4/2/2014,3403,47.45,31.79,161472.35,108181.37,53290.98
+Sub-Saharan Africa,Uganda,Meat,Offline,M,9/7/2011,103007829,10/20/2011,1160,421.89,364.69,489392.40,423040.40,66352.00
+Central America and the Caribbean,Antigua and Barbuda ,Snacks,Offline,H,5/5/2016,264624011,6/12/2016,6980,152.58,97.44,1065008.40,680131.20,384877.20
+Central America and the Caribbean,Guatemala,Beverages,Online,C,1/16/2017,727224385,2/1/2017,711,47.45,31.79,33736.95,22602.69,11134.26
+Central America and the Caribbean,Honduras,Snacks,Offline,H,2/18/2015,559607779,3/1/2015,9233,152.58,97.44,1408771.14,899663.52,509107.62
+Asia,Cambodia,Office Supplies,Online,L,1/10/2013,250885522,1/24/2013,1456,651.21,524.96,948161.76,764341.76,183820.00
+Central America and the Caribbean,Panama,Household,Offline,C,6/2/2010,360481441,6/9/2010,3324,668.27,502.54,2221329.48,1670442.96,550886.52
+Middle East and North Africa,Jordan,Cosmetics,Online,L,8/22/2015,168131864,9/28/2015,2810,437.20,263.33,1228532.00,739957.30,488574.70
+Sub-Saharan Africa,Lesotho,Clothes,Offline,C,7/30/2011,823885619,9/2/2011,4918,109.28,35.84,537439.04,176261.12,361177.92
+Europe,Malta,Baby Food,Offline,L,6/25/2012,398104035,8/12/2012,6686,255.28,159.42,1706802.08,1065882.12,640919.96
+Europe,Slovenia,Meat,Offline,M,9/25/2014,631460940,10/5/2014,2180,421.89,364.69,919720.20,795024.20,124696.00
+Middle East and North Africa,Yemen,Personal Care,Online,C,10/10/2015,184942662,11/2/2015,7498,81.73,56.67,612811.54,424911.66,187899.88
+Europe,Moldova ,Snacks,Offline,M,5/1/2010,489848029,5/20/2010,5772,152.58,97.44,880691.76,562423.68,318268.08
+Europe,Vatican City,Office Supplies,Online,L,11/27/2016,797788369,11/28/2016,2162,651.21,524.96,1407916.02,1134963.52,272952.50
+Europe,United Kingdom,Personal Care,Online,C,6/5/2013,430687510,6/10/2013,8860,81.73,56.67,724127.80,502096.20,222031.60
+Middle East and North Africa,Tunisia ,Meat,Offline,M,9/27/2016,130781781,10/31/2016,90,421.89,364.69,37970.10,32822.10,5148.00
+Australia and Oceania,Federated States of Micronesia,Vegetables,Offline,H,9/6/2010,710620009,10/1/2010,7107,154.06,90.93,1094904.42,646239.51,448664.91
+Sub-Saharan Africa,Equatorial Guinea,Snacks,Online,M,6/13/2010,803063523,7/16/2010,3197,152.58,97.44,487798.26,311515.68,176282.58
+Asia,Uzbekistan,Fruits,Online,L,5/13/2013,911286151,7/1/2013,8678,9.33,6.92,80965.74,60051.76,20913.98
+North America,Mexico,Cereal,Offline,M,4/2/2010,258774220,4/28/2010,5897,205.70,117.11,1213012.90,690597.67,522415.23
+Sub-Saharan Africa,The Gambia,Vegetables,Offline,C,12/4/2011,839326560,12/12/2011,4236,154.06,90.93,652598.16,385179.48,267418.68
+Europe,Portugal,Personal Care,Online,H,2/11/2015,667054498,2/12/2015,5104,81.73,56.67,417149.92,289243.68,127906.24
+Sub-Saharan Africa,Equatorial Guinea,Meat,Offline,M,11/2/2013,526381862,12/21/2013,6945,421.89,364.69,2930026.05,2532772.05,397254.00
+North America,United States of America,Personal Care,Online,C,9/30/2010,822044980,10/9/2010,232,81.73,56.67,18961.36,13147.44,5813.92
+Middle East and North Africa,Turkey,Fruits,Offline,C,5/5/2013,229092681,6/1/2013,2470,9.33,6.92,23045.10,17092.40,5952.70
+Asia,Singapore,Snacks,Online,C,1/18/2015,642886292,1/31/2015,3195,152.58,97.44,487493.10,311320.80,176172.30
+Sub-Saharan Africa,Djibouti,Snacks,Offline,H,2/19/2014,429099643,3/4/2014,8975,152.58,97.44,1369405.50,874524.00,494881.50
+Sub-Saharan Africa,Burkina Faso,Cosmetics,Offline,C,7/8/2017,273719060,8/17/2017,8407,437.20,263.33,3675540.40,2213815.31,1461725.09
+Sub-Saharan Africa,Sao Tome and Principe,Cosmetics,Offline,L,3/27/2014,933043372,5/6/2014,7123,437.20,263.33,3114175.60,1875699.59,1238476.01
+Asia,Laos,Snacks,Online,M,2/11/2017,983683907,3/10/2017,2783,152.58,97.44,424630.14,271175.52,153454.62
+North America,Canada,Fruits,Offline,C,7/19/2013,872564494,7/19/2013,79,9.33,6.92,737.07,546.68,190.39
+Europe,Denmark,Cereal,Online,H,9/14/2014,666921460,10/10/2014,5735,205.70,117.11,1179689.50,671625.85,508063.65
+Australia and Oceania,Nauru,Office Supplies,Online,C,11/19/2013,504303634,11/22/2013,3507,651.21,524.96,2283793.47,1841034.72,442758.75
+Sub-Saharan Africa,Ghana,Clothes,Offline,H,1/11/2013,142572343,3/2/2013,9179,109.28,35.84,1003081.12,328975.36,674105.76
+North America,Greenland,Baby Food,Offline,C,5/14/2011,309901416,6/1/2011,5570,255.28,159.42,1421909.60,887969.40,533940.20
+Australia and Oceania,Australia,Personal Care,Offline,H,9/28/2016,454777181,10/23/2016,7529,81.73,56.67,615345.17,426668.43,188676.74
+Australia and Oceania,Palau,Cereal,Online,H,8/1/2011,995998466,8/27/2011,6934,205.70,117.11,1426323.80,812040.74,614283.06
+Central America and the Caribbean,El Salvador,Snacks,Offline,C,3/25/2017,172676599,5/4/2017,7698,152.58,97.44,1174560.84,750093.12,424467.72
+Middle East and North Africa,Algeria,Vegetables,Online,H,6/13/2014,794235408,7/6/2014,762,154.06,90.93,117393.72,69288.66,48105.06
+Sub-Saharan Africa,Sao Tome and Principe,Snacks,Online,L,5/9/2015,790411221,6/24/2015,9100,152.58,97.44,1388478.00,886704.00,501774.00
+Europe,Austria,Office Supplies,Online,L,3/12/2014,861252868,3/28/2014,2717,651.21,524.96,1769337.57,1426316.32,343021.25
+Australia and Oceania,Samoa ,Vegetables,Offline,L,11/10/2013,427121675,11/15/2013,3650,154.06,90.93,562319.00,331894.50,230424.50
+Sub-Saharan Africa,Liberia,Personal Care,Offline,L,7/8/2014,778691470,8/1/2014,965,81.73,56.67,78869.45,54686.55,24182.90
+Europe,Vatican City,Baby Food,Online,C,5/24/2017,126948583,7/9/2017,5762,255.28,159.42,1470923.36,918578.04,552345.32
+Europe,Estonia,Clothes,Offline,H,6/8/2013,353191840,7/9/2013,6169,109.28,35.84,674148.32,221096.96,453051.36
+Europe,Belgium,Vegetables,Online,L,5/9/2017,259032571,5/13/2017,2349,154.06,90.93,361886.94,213594.57,148292.37
+Sub-Saharan Africa,Senegal,Clothes,Online,M,11/10/2010,516394603,12/9/2010,1493,109.28,35.84,163155.04,53509.12,109645.92
+Europe,Georgia,Meat,Offline,L,8/3/2014,517514264,9/4/2014,2826,421.89,364.69,1192261.14,1030613.94,161647.20
+Europe,United Kingdom,Cosmetics,Offline,H,3/2/2016,624940383,3/30/2016,2602,437.20,263.33,1137594.40,685184.66,452409.74
+Australia and Oceania,Solomon Islands,Fruits,Offline,L,11/9/2011,821534287,12/23/2011,9107,9.33,6.92,84968.31,63020.44,21947.87
+Sub-Saharan Africa,Gabon,Fruits,Online,M,5/4/2010,260469806,6/19/2010,7659,9.33,6.92,71458.47,53000.28,18458.19
+Sub-Saharan Africa,Equatorial Guinea,Vegetables,Online,H,10/18/2013,415233266,10/31/2013,5606,154.06,90.93,863660.36,509753.58,353906.78
+Middle East and North Africa,Saudi Arabia,Baby Food,Online,M,2/10/2014,129623496,2/25/2014,7328,255.28,159.42,1870691.84,1168229.76,702462.08
+Europe,Malta,Cosmetics,Online,C,10/21/2011,567751824,11/21/2011,9236,437.20,263.33,4037979.20,2432115.88,1605863.32
+Sub-Saharan Africa,Swaziland,Cosmetics,Online,L,3/31/2012,264042079,5/1/2012,4774,437.20,263.33,2087192.80,1257137.42,830055.38
+Asia,Myanmar,Snacks,Online,H,4/22/2014,973230588,6/8/2014,9413,152.58,97.44,1436235.54,917202.72,519032.82
+Sub-Saharan Africa,Swaziland,Vegetables,Online,C,2/15/2014,920366179,2/15/2014,5660,154.06,90.93,871979.60,514663.80,357315.80
+Asia,Indonesia,Vegetables,Offline,M,6/26/2016,650810182,7/21/2016,8050,154.06,90.93,1240183.00,731986.50,508196.50
+Sub-Saharan Africa,Benin,Clothes,Offline,H,11/15/2015,780236423,12/29/2015,8151,109.28,35.84,890741.28,292131.84,598609.44
+Sub-Saharan Africa,Mauritania,Fruits,Offline,C,5/31/2015,644631230,7/11/2015,9561,9.33,6.92,89204.13,66162.12,23042.01
+Sub-Saharan Africa,Tanzania,Meat,Online,C,7/4/2015,550293433,8/15/2015,2910,421.89,364.69,1227699.90,1061247.90,166452.00
+Middle East and North Africa,Pakistan,Baby Food,Offline,H,1/18/2010,423834359,2/20/2010,860,255.28,159.42,219540.80,137101.20,82439.60
+Europe,Spain,Fruits,Offline,H,12/6/2012,262177836,1/16/2013,3103,9.33,6.92,28950.99,21472.76,7478.23
+Europe,Croatia,Household,Online,L,5/25/2016,582560193,5/28/2016,1362,668.27,502.54,910183.74,684459.48,225724.26
+Central America and the Caribbean,Trinidad and Tobago,Household,Online,H,7/14/2017,172530257,8/31/2017,4392,668.27,502.54,2935041.84,2207155.68,727886.16
+Europe,Kosovo,Vegetables,Online,H,7/1/2014,139949357,7/14/2014,2980,154.06,90.93,459098.80,270971.40,188127.40
+Sub-Saharan Africa,Lesotho,Beverages,Offline,L,4/16/2010,762991321,5/17/2010,4942,47.45,31.79,234497.90,157106.18,77391.72
+Australia and Oceania,Vanuatu,Meat,Offline,C,7/23/2016,140142476,9/2/2016,128,421.89,364.69,54001.92,46680.32,7321.60
+Central America and the Caribbean,Costa Rica,Cereal,Offline,C,12/8/2011,940201652,1/1/2012,5417,205.70,117.11,1114276.90,634384.87,479892.03
+Australia and Oceania,Marshall Islands,Personal Care,Offline,M,12/23/2013,952280175,1/15/2014,9720,81.73,56.67,794415.60,550832.40,243583.20
+Australia and Oceania,Kiribati,Beverages,Online,M,10/23/2014,735801875,11/13/2014,8981,47.45,31.79,426148.45,285505.99,140642.46
+Europe,Albania,Clothes,Offline,H,3/9/2015,470503079,3/21/2015,1172,109.28,35.84,128076.16,42004.48,86071.68
+Asia,South Korea,Beverages,Online,H,2/21/2013,406432616,3/23/2013,1298,47.45,31.79,61590.10,41263.42,20326.68
+Europe,Austria,Beverages,Offline,C,5/10/2015,413951814,5/31/2015,6395,47.45,31.79,303442.75,203297.05,100145.70
+Europe,Germany,Office Supplies,Offline,L,8/19/2010,433734500,9/8/2010,532,651.21,524.96,346443.72,279278.72,67165.00
+North America,Mexico,Clothes,Offline,H,7/25/2011,926767003,8/20/2011,9806,109.28,35.84,1071599.68,351447.04,720152.64
+Europe,Ukraine,Office Supplies,Online,C,11/14/2012,624348151,12/8/2012,7347,651.21,524.96,4784439.87,3856881.12,927558.75
+Sub-Saharan Africa,Nigeria,Household,Online,C,5/6/2010,578089272,5/20/2010,8317,668.27,502.54,5558001.59,4179625.18,1378376.41
+Europe,Poland,Clothes,Offline,M,3/12/2012,109914195,4/16/2012,4908,109.28,35.84,536346.24,175902.72,360443.52
+Middle East and North Africa,Oman,Clothes,Online,H,7/23/2012,862059247,8/30/2012,1343,109.28,35.84,146763.04,48133.12,98629.92
+Europe,Georgia,Snacks,Online,C,5/31/2010,947073256,6/12/2010,8878,152.58,97.44,1354605.24,865072.32,489532.92
+Australia and Oceania,Tuvalu,Beverages,Offline,M,5/19/2013,797817552,5/29/2013,798,47.45,31.79,37865.10,25368.42,12496.68
+Central America and the Caribbean,Panama,Cereal,Offline,C,3/21/2011,917465960,4/14/2011,7421,205.70,117.11,1526499.70,869073.31,657426.39
+Sub-Saharan Africa,Central African Republic,Beverages,Offline,C,6/17/2017,529504811,6/24/2017,1095,47.45,31.79,51957.75,34810.05,17147.70
+Australia and Oceania,Solomon Islands,Vegetables,Offline,L,8/18/2012,727732932,8/21/2012,1201,154.06,90.93,185026.06,109206.93,75819.13
+Middle East and North Africa,Algeria,Baby Food,Offline,H,3/8/2016,426261651,3/26/2016,9150,255.28,159.42,2335812.00,1458693.00,877119.00
+Europe,Bosnia and Herzegovina,Personal Care,Online,L,7/24/2014,409514796,9/7/2014,3383,81.73,56.67,276492.59,191714.61,84777.98
+Europe,Latvia,Office Supplies,Online,L,5/31/2010,182228696,7/12/2010,4375,651.21,524.96,2849043.75,2296700.00,552343.75
+Sub-Saharan Africa,Liberia,Fruits,Offline,C,3/29/2011,219452178,4/3/2011,9631,9.33,6.92,89857.23,66646.52,23210.71
+Sub-Saharan Africa,Equatorial Guinea,Cereal,Offline,M,6/20/2010,616546571,8/3/2010,8686,205.70,117.11,1786710.20,1017217.46,769492.74
+Sub-Saharan Africa,Sierra Leone,Personal Care,Offline,H,12/10/2013,639185702,12/15/2013,8108,81.73,56.67,662666.84,459480.36,203186.48
+Sub-Saharan Africa,Republic of the Congo,Personal Care,Online,M,6/4/2013,973355901,7/24/2013,6496,81.73,56.67,530918.08,368128.32,162789.76
+Middle East and North Africa,Libya,Personal Care,Online,C,2/8/2013,575355994,3/6/2013,9479,81.73,56.67,774718.67,537174.93,237543.74
+Asia,Vietnam,Office Supplies,Online,H,9/2/2010,721797311,10/19/2010,4719,651.21,524.96,3073059.99,2477286.24,595773.75
+Sub-Saharan Africa,Djibouti,Cosmetics,Offline,H,3/22/2016,959603679,4/4/2016,6908,437.20,263.33,3020177.60,1819083.64,1201093.96
+Asia,Kyrgyzstan,Personal Care,Online,H,8/22/2010,456011426,9/29/2010,2769,81.73,56.67,226310.37,156919.23,69391.14
+Central America and the Caribbean,Jamaica,Clothes,Online,M,7/9/2017,248569381,8/1/2017,6058,109.28,35.84,662018.24,217118.72,444899.52
+Sub-Saharan Africa,Kenya,Cosmetics,Offline,M,1/31/2016,995138871,3/5/2016,2561,437.20,263.33,1119669.20,674388.13,445281.07
+Europe,Bosnia and Herzegovina,Household,Online,C,2/13/2013,723893725,3/11/2013,5095,668.27,502.54,3404835.65,2560441.30,844394.35
+Sub-Saharan Africa,Rwanda,Household,Online,C,6/30/2016,683320271,7/13/2016,8508,668.27,502.54,5685641.16,4275610.32,1410030.84
+Europe,Norway,Snacks,Offline,L,3/12/2016,392217338,3/15/2016,4681,152.58,97.44,714226.98,456116.64,258110.34
+Asia,South Korea,Personal Care,Offline,H,11/5/2010,789696252,11/19/2010,7525,81.73,56.67,615018.25,426441.75,188576.50
+Australia and Oceania,Tonga,Fruits,Offline,M,7/3/2011,185180842,7/4/2011,7981,9.33,6.92,74462.73,55228.52,19234.21
+Europe,Romania,Baby Food,Offline,C,2/19/2015,108407437,3/27/2015,9025,255.28,159.42,2303902.00,1438765.50,865136.50
+Asia,Nepal,Cosmetics,Offline,L,12/30/2015,359424865,1/25/2016,660,437.20,263.33,288552.00,173797.80,114754.20
+Europe,Iceland,Snacks,Offline,L,12/20/2016,358594453,2/2/2017,4922,152.58,97.44,750998.76,479599.68,271399.08
+Middle East and North Africa,Jordan,Cereal,Online,L,8/27/2010,496590030,10/14/2010,880,205.70,117.11,181016.00,103056.80,77959.20
+Europe,Denmark,Snacks,Offline,C,6/3/2013,784397923,6/15/2013,9631,152.58,97.44,1469497.98,938444.64,531053.34
+Australia and Oceania,New Zealand,Beverages,Online,H,3/18/2016,403316962,5/6/2016,9307,47.45,31.79,441617.15,295869.53,145747.62
+Asia,Vietnam,Fruits,Online,L,1/10/2011,854958474,2/10/2011,66,9.33,6.92,615.78,456.72,159.06
+Europe,Cyprus,Meat,Offline,M,6/9/2017,111246287,7/2/2017,9103,421.89,364.69,3840464.67,3319773.07,520691.60
+Sub-Saharan Africa,Sao Tome and Principe,Vegetables,Online,C,8/24/2010,264416730,8/24/2010,5641,154.06,90.93,869052.46,512936.13,356116.33
+Europe,Poland,Vegetables,Online,L,2/19/2016,777018630,3/19/2016,5935,154.06,90.93,914346.10,539669.55,374676.55
+Sub-Saharan Africa,Ghana,Beverages,Offline,M,1/10/2015,731913316,2/14/2015,8270,47.45,31.79,392411.50,262903.30,129508.20
+Sub-Saharan Africa,Lesotho,Household,Online,H,1/1/2016,182274615,2/5/2016,7964,668.27,502.54,5322102.28,4002228.56,1319873.72
+Europe,Moldova ,Clothes,Offline,H,9/1/2013,601588857,9/10/2013,2366,109.28,35.84,258556.48,84797.44,173759.04
+Australia and Oceania,Tonga,Personal Care,Offline,C,1/20/2015,833654868,2/13/2015,5856,81.73,56.67,478610.88,331859.52,146751.36
+Central America and the Caribbean,Saint Lucia,Cosmetics,Online,L,2/9/2013,242583978,2/20/2013,4845,437.20,263.33,2118234.00,1275833.85,842400.15
+Australia and Oceania,Tonga,Snacks,Online,L,3/16/2013,962800014,4/26/2013,2774,152.58,97.44,423256.92,270298.56,152958.36
+Europe,Russia,Vegetables,Offline,L,3/17/2014,249039304,5/1/2014,5119,154.06,90.93,788633.14,465470.67,323162.47
+Australia and Oceania,New Zealand,Beverages,Online,C,4/5/2012,826350677,5/18/2012,4383,47.45,31.79,207973.35,139335.57,68637.78
+Middle East and North Africa,Lebanon,Cosmetics,Online,L,2/22/2012,540095460,3/13/2012,5104,437.20,263.33,2231468.80,1344036.32,887432.48
+Europe,Denmark,Cereal,Online,C,11/30/2015,905947482,1/18/2016,8847,205.70,117.11,1819827.90,1036072.17,783755.73
+Europe,Italy,Vegetables,Online,H,7/22/2011,359893071,8/6/2011,9212,154.06,90.93,1419200.72,837647.16,581553.56
+Sub-Saharan Africa,Kenya,Meat,Online,L,8/13/2014,108231055,9/24/2014,6829,421.89,364.69,2881086.81,2490468.01,390618.80
+Sub-Saharan Africa,Namibia,Cosmetics,Online,M,5/31/2011,977572762,6/17/2011,4359,437.20,263.33,1905754.80,1147855.47,757899.33
+Middle East and North Africa,Qatar,Snacks,Online,H,11/5/2015,264842021,11/22/2015,1494,152.58,97.44,227954.52,145575.36,82379.16
+Central America and the Caribbean,Cuba,Snacks,Offline,H,7/28/2012,287275159,8/26/2012,9958,152.58,97.44,1519391.64,970307.52,549084.12
+Sub-Saharan Africa,Senegal,Personal Care,Online,M,11/1/2013,732421004,12/1/2013,8506,81.73,56.67,695195.38,482035.02,213160.36
+Australia and Oceania,Kiribati,Vegetables,Online,H,3/19/2010,908140885,3/31/2010,7924,154.06,90.93,1220771.44,720529.32,500242.12
+Asia,Mongolia,Cosmetics,Offline,H,4/14/2012,192608630,4/16/2012,6029,437.20,263.33,2635878.80,1587616.57,1048262.23
+Europe,Poland,Cosmetics,Offline,M,7/20/2016,284310567,9/2/2016,2670,437.20,263.33,1167324.00,703091.10,464232.90
+Central America and the Caribbean,Dominican Republic,Meat,Offline,H,10/13/2016,252045524,10/28/2016,4726,421.89,364.69,1993852.14,1723524.94,270327.20
+Australia and Oceania,Fiji,Snacks,Offline,M,5/28/2015,584924829,6/8/2015,1110,152.58,97.44,169363.80,108158.40,61205.40
+Europe,Bosnia and Herzegovina,Vegetables,Offline,M,2/6/2012,942372310,2/19/2012,7763,154.06,90.93,1195967.78,705889.59,490078.19
+Europe,Macedonia,Meat,Online,C,3/16/2015,604124295,4/2/2015,2659,421.89,364.69,1121805.51,969710.71,152094.80
+Europe,Kosovo,Fruits,Online,C,3/7/2015,720229613,3/11/2015,803,9.33,6.92,7491.99,5556.76,1935.23
+Middle East and North Africa,Oman,Cereal,Online,L,2/17/2011,261049592,3/12/2011,9230,205.70,117.11,1898611.00,1080925.30,817685.70
+Europe,Austria,Personal Care,Online,M,7/31/2014,967258059,8/8/2014,2009,81.73,56.67,164195.57,113850.03,50345.54
+Sub-Saharan Africa,Sudan,Cosmetics,Offline,L,5/26/2015,599841344,6/1/2015,5238,437.20,263.33,2290053.60,1379322.54,910731.06
+Sub-Saharan Africa,Benin,Fruits,Offline,M,11/20/2015,590098273,11/26/2015,2047,9.33,6.92,19098.51,14165.24,4933.27
+Middle East and North Africa,Libya,Cereal,Offline,L,10/30/2011,189640176,11/4/2011,7597,205.70,117.11,1562702.90,889684.67,673018.23
+Europe,Poland,Cereal,Offline,M,6/10/2011,520390880,7/24/2011,4080,205.70,117.11,839256.00,477808.80,361447.20
+Middle East and North Africa,Tunisia ,Cosmetics,Offline,C,6/3/2016,524586713,6/24/2016,5721,437.20,263.33,2501221.20,1506510.93,994710.27
+Sub-Saharan Africa,Mozambique,Personal Care,Offline,H,8/14/2010,114776504,9/10/2010,3773,81.73,56.67,308367.29,213815.91,94551.38
+Europe,Bosnia and Herzegovina,Fruits,Offline,L,10/15/2016,623821580,10/31/2016,1523,9.33,6.92,14209.59,10539.16,3670.43
+Middle East and North Africa,Lebanon,Cereal,Online,M,2/12/2017,754895770,3/12/2017,9289,205.70,117.11,1910747.30,1087834.79,822912.51
+Australia and Oceania,Australia,Beverages,Online,L,7/26/2017,631485402,8/12/2017,9418,47.45,31.79,446884.10,299398.22,147485.88
+Middle East and North Africa,United Arab Emirates,Personal Care,Online,L,10/23/2013,447389304,11/19/2013,1292,81.73,56.67,105595.16,73217.64,32377.52
+Sub-Saharan Africa,Zambia,Household,Online,M,2/25/2010,916718804,3/9/2010,6321,668.27,502.54,4224134.67,3176555.34,1047579.33
+Australia and Oceania,Kiribati,Snacks,Offline,M,10/4/2015,123897731,10/23/2015,2947,152.58,97.44,449653.26,287155.68,162497.58
+Europe,Bulgaria,Meat,Online,C,7/20/2010,273662412,7/23/2010,1644,421.89,364.69,693587.16,599550.36,94036.80
+Europe,Kosovo,Vegetables,Offline,M,3/8/2017,941061675,3/20/2017,9917,154.06,90.93,1527813.02,901752.81,626060.21
+Europe,Moldova ,Meat,Online,M,12/7/2013,421456849,12/10/2013,7302,421.89,364.69,3080640.78,2662966.38,417674.40
+Asia,Kyrgyzstan,Meat,Offline,L,3/21/2014,680521762,4/15/2014,367,421.89,364.69,154833.63,133841.23,20992.40
+Sub-Saharan Africa,Mozambique,Fruits,Online,M,5/18/2017,604242742,6/25/2017,7710,9.33,6.92,71934.30,53353.20,18581.10
+Central America and the Caribbean,Jamaica,Cosmetics,Offline,M,6/14/2012,948918616,7/25/2012,4960,437.20,263.33,2168512.00,1306116.80,862395.20
+Europe,Andorra,Cosmetics,Online,H,4/10/2012,291160714,5/26/2012,9780,437.20,263.33,4275816.00,2575367.40,1700448.60
+Australia and Oceania,Vanuatu,Fruits,Online,C,10/19/2011,877892863,10/21/2011,6862,9.33,6.92,64022.46,47485.04,16537.42
+Sub-Saharan Africa,Seychelles ,Vegetables,Online,M,8/16/2014,976351392,9/12/2014,2928,154.06,90.93,451087.68,266243.04,184844.64
+Europe,Georgia,Fruits,Offline,M,1/21/2014,724085128,2/10/2014,1735,9.33,6.92,16187.55,12006.20,4181.35
+Sub-Saharan Africa,Seychelles ,Clothes,Offline,H,1/13/2012,778955399,2/29/2012,9068,109.28,35.84,990951.04,324997.12,665953.92
+Asia,Turkmenistan,Meat,Online,M,5/9/2015,969136035,5/20/2015,7744,421.89,364.69,3267116.16,2824159.36,442956.80
+Sub-Saharan Africa,Namibia,Baby Food,Online,H,9/21/2016,743113362,10/21/2016,2612,255.28,159.42,666791.36,416405.04,250386.32
+Asia,Bangladesh,Snacks,Offline,L,9/15/2013,519686210,9/24/2013,5553,152.58,97.44,847276.74,541084.32,306192.42
+Central America and the Caribbean,Costa Rica,Meat,Online,C,7/4/2012,337965905,7/20/2012,477,421.89,364.69,201241.53,173957.13,27284.40
+Sub-Saharan Africa,Sudan,Fruits,Offline,C,8/8/2016,307376277,8/15/2016,8326,9.33,6.92,77681.58,57615.92,20065.66
+Asia,Vietnam,Vegetables,Offline,H,5/23/2015,157653653,5/27/2015,2074,154.06,90.93,319520.44,188588.82,130931.62
+Australia and Oceania,New Zealand,Cosmetics,Offline,C,9/12/2010,588846862,9/26/2010,1727,437.20,263.33,755044.40,454770.91,300273.49
+Sub-Saharan Africa,Niger,Personal Care,Offline,C,12/24/2012,121317231,1/2/2013,9319,81.73,56.67,761641.87,528107.73,233534.14
+Central America and the Caribbean,Trinidad and Tobago,Snacks,Online,C,11/2/2014,945738589,12/22/2014,3920,152.58,97.44,598113.60,381964.80,216148.80
+Middle East and North Africa,Lebanon,Clothes,Offline,H,6/29/2017,373097264,7/6/2017,6626,109.28,35.84,724089.28,237475.84,486613.44
+Central America and the Caribbean,Saint Lucia,Vegetables,Offline,M,11/22/2011,284692084,1/7/2012,5569,154.06,90.93,857960.14,506389.17,351570.97
+Asia,Kazakhstan,Fruits,Online,C,9/30/2012,382134377,11/6/2012,909,9.33,6.92,8480.97,6290.28,2190.69
+Sub-Saharan Africa,Sao Tome and Principe,Office Supplies,Online,C,12/1/2016,437347972,1/16/2017,9839,651.21,524.96,6407255.19,5165081.44,1242173.75
+Europe,Luxembourg,Vegetables,Online,M,9/30/2014,742569196,11/17/2014,1581,154.06,90.93,243568.86,143760.33,99808.53
+Europe,Poland,Household,Online,M,7/29/2016,760346877,8/6/2016,2392,668.27,502.54,1598501.84,1202075.68,396426.16
+Central America and the Caribbean,Guatemala,Snacks,Online,H,2/5/2011,473542344,2/9/2011,558,152.58,97.44,85139.64,54371.52,30768.12
+Sub-Saharan Africa,Sudan,Vegetables,Online,M,7/25/2014,835329425,7/27/2014,1395,154.06,90.93,214913.70,126847.35,88066.35
+Middle East and North Africa,Iraq,Vegetables,Online,L,1/5/2014,619194447,2/7/2014,2252,154.06,90.93,346943.12,204774.36,142168.76
+Sub-Saharan Africa,Malawi,Vegetables,Online,M,6/21/2016,468936240,7/2/2016,7509,154.06,90.93,1156836.54,682793.37,474043.17
+Australia and Oceania,Fiji,Office Supplies,Offline,L,11/21/2014,648666131,12/12/2014,3578,651.21,524.96,2330029.38,1878306.88,451722.50
+Middle East and North Africa,Afghanistan,Household,Offline,C,8/21/2014,592807948,9/19/2014,3900,668.27,502.54,2606253.00,1959906.00,646347.00
+Sub-Saharan Africa,Zimbabwe,Baby Food,Offline,M,8/1/2014,256098020,8/21/2014,3950,255.28,159.42,1008356.00,629709.00,378647.00
+Asia,Nepal,Household,Online,C,11/13/2010,563585174,11/26/2010,6232,668.27,502.54,4164658.64,3131829.28,1032829.36
+Europe,Moldova ,Cosmetics,Online,M,11/5/2015,260630738,12/19/2015,5282,437.20,263.33,2309290.40,1390909.06,918381.34
+Asia,Kyrgyzstan,Household,Offline,H,6/6/2016,862908542,7/9/2016,2668,668.27,502.54,1782944.36,1340776.72,442167.64
+Asia,China,Personal Care,Offline,C,9/30/2015,806404912,10/17/2015,1988,81.73,56.67,162479.24,112659.96,49819.28
+Sub-Saharan Africa,Djibouti,Household,Offline,C,3/13/2014,397418677,4/2/2014,3873,668.27,502.54,2588209.71,1946337.42,641872.29
+Europe,Spain,Meat,Online,H,4/2/2013,462561166,5/2/2013,983,421.89,364.69,414717.87,358490.27,56227.60
+Asia,China,Personal Care,Online,M,8/28/2011,998756206,9/18/2011,3011,81.73,56.67,246089.03,170633.37,75455.66
+Sub-Saharan Africa,Uganda,Cosmetics,Offline,H,10/16/2016,723240125,11/18/2016,1680,437.20,263.33,734496.00,442394.40,292101.60
+Asia,Tajikistan,Clothes,Offline,H,8/10/2010,223561751,9/21/2010,5745,109.28,35.84,627813.60,205900.80,421912.80
+North America,United States of America,Meat,Offline,M,12/22/2013,607582414,1/30/2014,5993,421.89,364.69,2528386.77,2185587.17,342799.60
+Europe,Netherlands,Personal Care,Offline,H,10/2/2014,353475940,10/4/2014,240,81.73,56.67,19615.20,13600.80,6014.40
+Australia and Oceania,Papua New Guinea,Cereal,Offline,H,1/5/2017,259728658,1/29/2017,8336,205.70,117.11,1714715.20,976228.96,738486.24
+Sub-Saharan Africa,Botswana,Cereal,Offline,L,7/14/2014,295139396,8/18/2014,7161,205.70,117.11,1473017.70,838624.71,634392.99
+Australia and Oceania,Solomon Islands,Vegetables,Online,L,4/20/2017,948819482,5/17/2017,5624,154.06,90.93,866433.44,511390.32,355043.12
+Sub-Saharan Africa,Djibouti,Baby Food,Offline,M,6/8/2017,980192744,7/12/2017,9670,255.28,159.42,2468557.60,1541591.40,926966.20
+Central America and the Caribbean,Nicaragua,Meat,Online,C,9/12/2015,568995511,11/1/2015,7271,421.89,364.69,3067562.19,2651660.99,415901.20
+Sub-Saharan Africa,Liberia,Snacks,Online,C,2/13/2010,865276610,2/19/2010,3432,152.58,97.44,523654.56,334414.08,189240.48
+Middle East and North Africa,Morocco,Office Supplies,Online,L,12/14/2014,839397370,12/17/2014,5190,651.21,524.96,3379779.90,2724542.40,655237.50
+Europe,Armenia,Beverages,Online,H,6/5/2011,432031619,6/29/2011,6612,47.45,31.79,313739.40,210195.48,103543.92
+Europe,Armenia,Household,Online,L,2/19/2012,104165685,3/6/2012,3796,668.27,502.54,2536752.92,1907641.84,629111.08
+Sub-Saharan Africa,Sudan,Fruits,Offline,M,10/20/2011,387098395,11/5/2011,9872,9.33,6.92,92105.76,68314.24,23791.52
+Central America and the Caribbean,Saint Kitts and Nevis ,Clothes,Offline,L,10/14/2013,532441079,11/8/2013,2,109.28,35.84,218.56,71.68,146.88
+Europe,Ukraine,Personal Care,Online,M,2/26/2011,762117564,3/28/2011,6378,81.73,56.67,521273.94,361441.26,159832.68
+Europe,Finland,Snacks,Offline,H,3/10/2013,918364179,4/11/2013,3223,152.58,97.44,491765.34,314049.12,177716.22
+Europe,Georgia,Meat,Online,M,4/18/2011,913729751,5/9/2011,1793,421.89,364.69,756448.77,653889.17,102559.60
+Sub-Saharan Africa,Burkina Faso,Household,Offline,H,2/4/2013,281075608,3/26/2013,5373,668.27,502.54,3590614.71,2700147.42,890467.29
+Sub-Saharan Africa,Namibia,Vegetables,Offline,H,12/1/2015,423575580,12/10/2015,4282,154.06,90.93,659684.92,389362.26,270322.66
+Middle East and North Africa,Libya,Cereal,Offline,L,7/30/2010,564715993,8/3/2010,866,205.70,117.11,178136.20,101417.26,76718.94
+Central America and the Caribbean,Guatemala,Beverages,Offline,H,6/19/2015,898295676,7/17/2015,4508,47.45,31.79,213904.60,143309.32,70595.28
+Sub-Saharan Africa,Cote d'Ivoire,Office Supplies,Offline,H,3/3/2012,338425958,4/8/2012,6616,651.21,524.96,4308405.36,3473135.36,835270.00
+Central America and the Caribbean,Nicaragua,Fruits,Online,M,6/4/2017,569530665,6/25/2017,5635,9.33,6.92,52574.55,38994.20,13580.35
+Europe,Armenia,Snacks,Online,H,2/28/2011,196346127,4/12/2011,2037,152.58,97.44,310805.46,198485.28,112320.18
+Asia,South Korea,Household,Online,M,1/11/2016,593921172,2/27/2016,3328,668.27,502.54,2224002.56,1672453.12,551549.44
+Middle East and North Africa,Jordan,Cosmetics,Online,L,4/20/2010,957617127,5/31/2010,9043,437.20,263.33,3953599.60,2381293.19,1572306.41
+Europe,Cyprus,Personal Care,Online,M,12/21/2014,553107821,1/13/2015,5751,81.73,56.67,470029.23,325909.17,144120.06
+Australia and Oceania,Tonga,Cereal,Offline,L,3/26/2014,966379582,3/29/2014,2048,205.70,117.11,421273.60,239841.28,181432.32
+Asia,Singapore,Baby Food,Online,H,4/10/2012,253731238,5/13/2012,3567,255.28,159.42,910583.76,568651.14,341932.62
+Europe,San Marino,Cereal,Online,M,5/8/2014,591774117,5/30/2014,7967,205.70,117.11,1638811.90,933015.37,705796.53
+Europe,Cyprus,Personal Care,Online,C,6/2/2015,627432048,6/23/2015,9941,81.73,56.67,812477.93,563356.47,249121.46
+Sub-Saharan Africa,Republic of the Congo,Fruits,Online,C,7/5/2011,427941358,8/20/2011,6212,9.33,6.92,57957.96,42987.04,14970.92
+Middle East and North Africa,Algeria,Baby Food,Online,L,1/24/2011,130850875,3/11/2011,537,255.28,159.42,137085.36,85608.54,51476.82
+Asia,Bangladesh,Meat,Offline,C,1/13/2016,394021928,2/20/2016,8699,421.89,364.69,3670021.11,3172438.31,497582.80
+Asia,China,Meat,Online,C,6/26/2010,145628345,7/21/2010,3518,421.89,364.69,1484209.02,1282979.42,201229.60
+Sub-Saharan Africa,South Sudan,Meat,Offline,M,6/3/2017,634156453,6/28/2017,9842,421.89,364.69,4152241.38,3589278.98,562962.40
+Central America and the Caribbean,Haiti,Cereal,Online,L,9/11/2011,478405082,10/24/2011,9550,205.70,117.11,1964435.00,1118400.50,846034.50
+Middle East and North Africa,Azerbaijan,Personal Care,Offline,C,8/23/2014,617485558,10/8/2014,6554,81.73,56.67,535658.42,371415.18,164243.24
+Sub-Saharan Africa,Nigeria,Meat,Offline,C,8/8/2014,260821712,9/19/2014,1795,421.89,364.69,757292.55,654618.55,102674.00
+Sub-Saharan Africa,Sudan,Beverages,Offline,C,2/14/2016,938149869,2/14/2016,8249,47.45,31.79,391415.05,262235.71,129179.34
+Sub-Saharan Africa,Swaziland,Fruits,Online,L,6/12/2013,649518859,7/13/2013,5919,9.33,6.92,55224.27,40959.48,14264.79
+Europe,Germany,Meat,Offline,M,1/14/2017,615290009,1/18/2017,6842,421.89,364.69,2886571.38,2495208.98,391362.40
+Middle East and North Africa,Iraq,Clothes,Online,M,12/3/2011,326137149,1/2/2012,85,109.28,35.84,9288.80,3046.40,6242.40
+Asia,Turkmenistan,Beverages,Online,L,6/20/2014,693046605,7/21/2014,6746,47.45,31.79,320097.70,214455.34,105642.36
+Europe,Italy,Beverages,Online,H,8/13/2015,897317206,9/1/2015,4957,47.45,31.79,235209.65,157583.03,77626.62
+Asia,Bhutan,Meat,Offline,L,12/10/2014,640560281,12/30/2014,4877,421.89,364.69,2057557.53,1778593.13,278964.40
+Europe,Montenegro,Personal Care,Offline,L,11/14/2016,594699656,12/30/2016,3699,81.73,56.67,302319.27,209622.33,92696.94
+Asia,Indonesia,Personal Care,Offline,M,10/1/2011,151971662,10/24/2011,647,81.73,56.67,52879.31,36665.49,16213.82
+Europe,Ukraine,Cosmetics,Offline,M,6/28/2017,574925124,7/13/2017,1975,437.20,263.33,863470.00,520076.75,343393.25
+Europe,Ukraine,Beverages,Offline,M,3/19/2015,946421372,3/21/2015,5971,47.45,31.79,283323.95,189818.09,93505.86
+Asia,Japan,Cereal,Offline,L,8/7/2013,419634234,9/25/2013,7950,205.70,117.11,1635315.00,931024.50,704290.50
+Australia and Oceania,Vanuatu,Cosmetics,Offline,H,10/31/2014,468050038,12/4/2014,5262,437.20,263.33,2300546.40,1385642.46,914903.94
+Sub-Saharan Africa,Burundi,Vegetables,Online,L,10/16/2010,835467612,11/12/2010,2287,154.06,90.93,352335.22,207956.91,144378.31
+Europe,Armenia,Clothes,Offline,C,2/21/2017,885998284,2/28/2017,5436,109.28,35.84,594046.08,194826.24,399219.84
+Europe,Hungary,Household,Offline,L,7/17/2016,954065883,9/1/2016,8151,668.27,502.54,5447068.77,4096203.54,1350865.23
+Europe,Malta,Beverages,Online,M,6/7/2015,994406735,6/30/2015,5906,47.45,31.79,280239.70,187751.74,92487.96
+Europe,Austria,Personal Care,Online,M,7/9/2017,132069671,7/20/2017,1205,81.73,56.67,98484.65,68287.35,30197.30
+Sub-Saharan Africa,Republic of the Congo,Office Supplies,Offline,H,6/12/2012,712416017,7/27/2012,8586,651.21,524.96,5591289.06,4507306.56,1083982.50
+Sub-Saharan Africa,Sao Tome and Principe,Vegetables,Offline,M,6/2/2017,651119601,7/17/2017,9614,154.06,90.93,1481132.84,874201.02,606931.82
+Sub-Saharan Africa,Democratic Republic of the Congo,Baby Food,Online,L,11/2/2012,184166753,12/20/2012,7890,255.28,159.42,2014159.20,1257823.80,756335.40
+Sub-Saharan Africa,Eritrea,Cereal,Online,H,4/3/2014,517856299,4/30/2014,4042,205.70,117.11,831439.40,473358.62,358080.78
+Middle East and North Africa,Qatar,Baby Food,Offline,H,7/26/2015,678799569,8/15/2015,732,255.28,159.42,186864.96,116695.44,70169.52
+Sub-Saharan Africa,Sudan,Meat,Online,C,7/7/2015,663920390,7/10/2015,7652,421.89,364.69,3228302.28,2790607.88,437694.40
+Europe,Belarus,Household,Online,M,11/30/2013,990455090,12/14/2013,6526,668.27,502.54,4361130.02,3279576.04,1081553.98
+Europe,Norway,Cereal,Offline,C,6/6/2015,445952498,7/7/2015,6109,205.70,117.11,1256621.30,715424.99,541196.31
+Middle East and North Africa,Oman,Snacks,Offline,C,8/21/2010,138273942,10/4/2010,7187,152.58,97.44,1096592.46,700301.28,396291.18
+Sub-Saharan Africa,Sierra Leone,Cosmetics,Offline,L,2/13/2010,345593249,3/15/2010,7577,437.20,263.33,3312664.40,1995251.41,1317412.99
+Central America and the Caribbean,Antigua and Barbuda ,Cosmetics,Offline,H,5/18/2010,966396749,6/20/2010,7128,437.20,263.33,3116361.60,1877016.24,1239345.36
+Sub-Saharan Africa,Mauritius ,Snacks,Online,L,10/3/2012,169483268,11/4/2012,2720,152.58,97.44,415017.60,265036.80,149980.80
+Asia,Nepal,Cereal,Online,M,2/6/2012,243964135,2/27/2012,3264,205.70,117.11,671404.80,382247.04,289157.76
+Middle East and North Africa,Oman,Clothes,Online,C,9/4/2015,849263179,10/6/2015,4702,109.28,35.84,513834.56,168519.68,345314.88
+Sub-Saharan Africa,Togo,Household,Offline,M,8/30/2016,365116727,9/8/2016,5008,668.27,502.54,3346696.16,2516720.32,829975.84
+Middle East and North Africa,Tunisia ,Meat,Online,H,2/7/2013,841573607,3/17/2013,9187,421.89,364.69,3875903.43,3350407.03,525496.40
+Middle East and North Africa,Yemen,Beverages,Offline,C,9/3/2011,348995149,9/14/2011,4275,47.45,31.79,202848.75,135902.25,66946.50
+Europe,Estonia,Office Supplies,Offline,M,4/26/2016,628055179,5/13/2016,4339,651.21,524.96,2825600.19,2277801.44,547798.75
+Sub-Saharan Africa,Ethiopia,Office Supplies,Offline,C,12/1/2016,339740025,12/4/2016,5478,651.21,524.96,3567328.38,2875730.88,691597.50
+Middle East and North Africa,Azerbaijan,Office Supplies,Online,L,10/6/2015,915348517,10/10/2015,822,651.21,524.96,535294.62,431517.12,103777.50
+Asia,Uzbekistan,Personal Care,Online,C,3/20/2016,706491982,4/11/2016,5532,81.73,56.67,452130.36,313498.44,138631.92
+Central America and the Caribbean,Panama,Vegetables,Offline,C,5/7/2011,835094249,6/20/2011,1801,154.06,90.93,277462.06,163764.93,113697.13
+Europe,Slovenia,Personal Care,Online,C,6/6/2010,243391644,6/27/2010,3851,81.73,56.67,314742.23,218236.17,96506.06
+Australia and Oceania,Federated States of Micronesia,Household,Offline,H,6/12/2012,643932998,7/25/2012,2938,668.27,502.54,1963377.26,1476462.52,486914.74
+Asia,Taiwan,Vegetables,Offline,H,6/13/2017,669579637,6/24/2017,2349,154.06,90.93,361886.94,213594.57,148292.37
+Europe,Ukraine,Clothes,Online,H,3/11/2015,823505389,3/30/2015,2400,109.28,35.84,262272.00,86016.00,176256.00
+Central America and the Caribbean,Antigua and Barbuda ,Meat,Offline,H,8/19/2011,329196584,9/9/2011,5439,421.89,364.69,2294659.71,1983548.91,311110.80
+Asia,Cambodia,Meat,Online,L,1/7/2010,280452048,1/14/2010,848,421.89,364.69,357762.72,309257.12,48505.60
+Central America and the Caribbean,Grenada,Office Supplies,Offline,H,8/29/2014,491383111,10/5/2014,37,651.21,524.96,24094.77,19423.52,4671.25
+Europe,Ireland,Snacks,Online,L,12/30/2011,846413600,12/31/2011,1448,152.58,97.44,220935.84,141093.12,79842.72
+Europe,Cyprus,Fruits,Offline,C,3/31/2012,850279843,4/10/2012,5556,9.33,6.92,51837.48,38447.52,13389.96
+Sub-Saharan Africa,Kenya,Fruits,Offline,M,5/6/2015,978030669,5/14/2015,9864,9.33,6.92,92031.12,68258.88,23772.24
+Asia,Bhutan,Beverages,Offline,H,9/18/2014,425027406,9/23/2014,3909,47.45,31.79,185482.05,124267.11,61214.94
+Central America and the Caribbean,Saint Lucia,Beverages,Online,M,3/12/2016,256943881,4/30/2016,4259,47.45,31.79,202089.55,135393.61,66695.94
+Middle East and North Africa,Oman,Cosmetics,Offline,H,7/24/2011,259766423,9/11/2011,9512,437.20,263.33,4158646.40,2504794.96,1653851.44
+Central America and the Caribbean,Saint Lucia,Beverages,Online,H,7/26/2012,289793860,7/29/2012,5298,47.45,31.79,251390.10,168423.42,82966.68
+Sub-Saharan Africa,Eritrea,Fruits,Offline,H,11/24/2016,723637521,12/20/2016,9278,9.33,6.92,86563.74,64203.76,22359.98
+Sub-Saharan Africa,Comoros,Cereal,Offline,H,12/10/2011,208221232,12/28/2011,6145,205.70,117.11,1264026.50,719640.95,544385.55
+Central America and the Caribbean,Panama,Vegetables,Online,C,6/9/2016,610781323,7/21/2016,2621,154.06,90.93,403791.26,238327.53,165463.73
+Asia,Brunei,Beverages,Offline,H,2/14/2016,268866622,4/4/2016,2463,47.45,31.79,116869.35,78298.77,38570.58
+Middle East and North Africa,Lebanon,Office Supplies,Offline,H,12/6/2012,740338456,12/12/2012,1456,651.21,524.96,948161.76,764341.76,183820.00
+Australia and Oceania,Solomon Islands,Household,Offline,C,8/30/2013,953370654,9/16/2013,2417,668.27,502.54,1615208.59,1214639.18,400569.41
+Australia and Oceania,Tuvalu,Cosmetics,Offline,H,1/9/2011,356449544,2/26/2011,196,437.20,263.33,85691.20,51612.68,34078.52
+Europe,Austria,Office Supplies,Online,H,2/25/2010,268373954,2/28/2010,6672,651.21,524.96,4344873.12,3502533.12,842340.00
+Sub-Saharan Africa,Malawi,Snacks,Offline,H,4/1/2017,728255212,4/4/2017,5755,152.58,97.44,878097.90,560767.20,317330.70
+Sub-Saharan Africa,Seychelles ,Snacks,Offline,C,1/28/2013,945517146,2/1/2013,8390,152.58,97.44,1280146.20,817521.60,462624.60
+Sub-Saharan Africa,Burundi,Household,Offline,H,4/28/2017,649896085,5/24/2017,7548,668.27,502.54,5044101.96,3793171.92,1250930.04
+Sub-Saharan Africa,South Sudan,Personal Care,Online,M,9/1/2016,541440856,9/27/2016,3236,81.73,56.67,264478.28,183384.12,81094.16
+Australia and Oceania,Marshall Islands,Personal Care,Offline,M,12/30/2013,940512788,1/25/2014,7489,81.73,56.67,612075.97,424401.63,187674.34
+Sub-Saharan Africa,Ghana,Snacks,Offline,H,1/18/2017,437785708,2/25/2017,9375,152.58,97.44,1430437.50,913500.00,516937.50
+Asia,Thailand,Fruits,Online,M,11/30/2011,844245946,1/1/2012,9991,9.33,6.92,93216.03,69137.72,24078.31
+Middle East and North Africa,Kuwait,Household,Offline,C,3/29/2012,441192328,4/20/2012,7469,668.27,502.54,4991308.63,3753471.26,1237837.37
+Asia,Indonesia,Beverages,Online,L,1/13/2010,730236184,2/14/2010,1969,47.45,31.79,93429.05,62594.51,30834.54
+Asia,Nepal,Snacks,Offline,L,4/19/2017,583301341,5/13/2017,684,152.58,97.44,104364.72,66648.96,37715.76
+Sub-Saharan Africa,Democratic Republic of the Congo,Beverages,Online,L,10/18/2016,292624127,11/13/2016,2837,47.45,31.79,134615.65,90188.23,44427.42
+Central America and the Caribbean,Saint Kitts and Nevis ,Beverages,Online,C,4/22/2011,220753371,4/23/2011,4683,47.45,31.79,222208.35,148872.57,73335.78
+Europe,Serbia,Cosmetics,Online,H,3/25/2012,350550401,4/22/2012,4508,437.20,263.33,1970897.60,1187091.64,783805.96
+Middle East and North Africa,Turkey,Cereal,Offline,L,2/9/2013,735189044,3/3/2013,7631,205.70,117.11,1569696.70,893666.41,676030.29
+Sub-Saharan Africa,South Africa,Cereal,Offline,M,2/15/2016,148155629,2/29/2016,1398,205.70,117.11,287568.60,163719.78,123848.82
+Central America and the Caribbean,Jamaica,Meat,Offline,C,2/25/2013,133248984,3/17/2013,190,421.89,364.69,80159.10,69291.10,10868.00
+Sub-Saharan Africa,Cape Verde,Vegetables,Offline,L,4/18/2012,954580438,5/11/2012,419,154.06,90.93,64551.14,38099.67,26451.47
+Central America and the Caribbean,Trinidad and Tobago,Snacks,Offline,L,5/8/2011,246573817,6/17/2011,5527,152.58,97.44,843309.66,538550.88,304758.78
+Australia and Oceania,Tuvalu,Beverages,Offline,L,10/1/2016,663965451,10/5/2016,987,47.45,31.79,46833.15,31376.73,15456.42
+North America,Mexico,Household,Offline,H,1/27/2017,431804168,3/6/2017,9304,668.27,502.54,6217584.08,4675632.16,1541951.92
+Asia,Laos,Snacks,Online,M,2/4/2017,995451295,2/28/2017,5014,152.58,97.44,765036.12,488564.16,276471.96
+Sub-Saharan Africa,Chad,Fruits,Offline,H,4/23/2011,270580661,5/28/2011,9685,9.33,6.92,90361.05,67020.20,23340.85
+Europe,San Marino,Personal Care,Online,C,5/27/2010,293178594,6/1/2010,6916,81.73,56.67,565244.68,391929.72,173314.96
+Sub-Saharan Africa,Mauritania,Household,Offline,C,10/14/2014,469543921,10/25/2014,7336,668.27,502.54,4902428.72,3686633.44,1215795.28
+Asia,Cambodia,Clothes,Online,M,10/11/2010,726287972,11/19/2010,3606,109.28,35.84,394063.68,129239.04,264824.64
+Sub-Saharan Africa,Malawi,Personal Care,Offline,C,4/9/2012,160334575,4/23/2012,5418,81.73,56.67,442813.14,307038.06,135775.08
+Sub-Saharan Africa,Eritrea,Vegetables,Online,C,7/5/2011,188920056,7/30/2011,4498,154.06,90.93,692961.88,409003.14,283958.74
+Sub-Saharan Africa,Nigeria,Personal Care,Online,H,2/23/2013,499593245,4/13/2013,9598,81.73,56.67,784444.54,543918.66,240525.88
+Australia and Oceania,Nauru,Office Supplies,Offline,C,5/6/2015,400215470,6/1/2015,1506,651.21,524.96,980722.26,790589.76,190132.50
+Europe,Georgia,Baby Food,Online,H,7/14/2013,168960559,8/19/2013,8039,255.28,159.42,2052195.92,1281577.38,770618.54
+Middle East and North Africa,Kuwait,Office Supplies,Offline,M,10/15/2011,604314839,11/4/2011,9045,651.21,524.96,5890194.45,4748263.20,1141931.25
+Asia,China,Snacks,Offline,L,6/15/2011,775077140,6/22/2011,1404,152.58,97.44,214222.32,136805.76,77416.56
+Europe,Albania,Beverages,Offline,M,12/11/2014,270358788,1/24/2015,4028,47.45,31.79,191128.60,128050.12,63078.48
+Sub-Saharan Africa,Guinea,Clothes,Online,C,5/21/2014,549583613,5/29/2014,2859,109.28,35.84,312431.52,102466.56,209964.96
+Middle East and North Africa,Saudi Arabia,Baby Food,Offline,H,7/13/2010,892487943,8/31/2010,5870,255.28,159.42,1498493.60,935795.40,562698.20
+Sub-Saharan Africa,Guinea-Bissau,Office Supplies,Online,L,7/24/2016,649120604,9/8/2016,8067,651.21,524.96,5253311.07,4234852.32,1018458.75
+Europe,Italy,Personal Care,Offline,M,6/9/2016,589842927,7/28/2016,6485,81.73,56.67,530019.05,367504.95,162514.10
+Europe,Poland,Cereal,Offline,C,2/10/2014,655328738,3/22/2014,5191,205.70,117.11,1067788.70,607918.01,459870.69
+Europe,Albania,Vegetables,Online,M,8/7/2014,406564366,8/25/2014,286,154.06,90.93,44061.16,26005.98,18055.18
+Europe,Spain,Clothes,Online,H,8/16/2012,374848639,9/6/2012,4897,109.28,35.84,535144.16,175508.48,359635.68
+Sub-Saharan Africa,Central African Republic,Personal Care,Online,L,7/19/2011,711792886,9/6/2011,4187,81.73,56.67,342203.51,237277.29,104926.22
+Sub-Saharan Africa,Mauritius ,Fruits,Online,L,1/4/2012,739320933,2/10/2012,348,9.33,6.92,3246.84,2408.16,838.68
+Sub-Saharan Africa,Comoros,Personal Care,Online,L,9/18/2015,299669110,10/26/2015,7604,81.73,56.67,621474.92,430918.68,190556.24
+Central America and the Caribbean,Grenada,Baby Food,Offline,H,1/26/2014,205386245,3/9/2014,7209,255.28,159.42,1840313.52,1149258.78,691054.74
+Central America and the Caribbean,Haiti,Cosmetics,Offline,M,9/14/2014,889333665,9/15/2014,2449,437.20,263.33,1070702.80,644895.17,425807.63
+Middle East and North Africa,Yemen,Vegetables,Offline,L,12/8/2014,154685199,12/15/2014,3643,154.06,90.93,561240.58,331257.99,229982.59
+Australia and Oceania,New Zealand,Cereal,Offline,C,2/27/2013,824927175,3/13/2013,3138,205.70,117.11,645486.60,367491.18,277995.42
+Europe,Slovakia,Fruits,Offline,L,8/14/2012,393858420,8/29/2012,314,9.33,6.92,2929.62,2172.88,756.74
+North America,Mexico,Personal Care,Online,M,1/19/2010,475590264,2/4/2010,6583,81.73,56.67,538028.59,373058.61,164969.98
+Middle East and North Africa,Lebanon,Household,Online,M,8/11/2014,954546535,8/21/2014,387,668.27,502.54,258620.49,194482.98,64137.51
+Europe,Malta,Beverages,Online,C,10/21/2013,435463559,10/27/2013,2199,47.45,31.79,104342.55,69906.21,34436.34
+Central America and the Caribbean,Belize,Beverages,Offline,C,2/19/2015,293390166,4/10/2015,9525,47.45,31.79,451961.25,302799.75,149161.50
+Sub-Saharan Africa,Tanzania,Beverages,Offline,H,1/10/2012,623687684,2/29/2012,1900,47.45,31.79,90155.00,60401.00,29754.00
+Asia,India,Office Supplies,Offline,L,4/28/2010,692029941,4/30/2010,5893,651.21,524.96,3837580.53,3093589.28,743991.25
+Europe,Sweden,Vegetables,Offline,C,12/7/2016,284403264,12/27/2016,101,154.06,90.93,15560.06,9183.93,6376.13
+Middle East and North Africa,Tunisia ,Cereal,Offline,L,5/2/2013,157106482,5/3/2013,154,205.70,117.11,31677.80,18034.94,13642.86
+Asia,Laos,Personal Care,Offline,H,5/7/2012,686750924,5/16/2012,3714,81.73,56.67,303545.22,210472.38,93072.84
+Middle East and North Africa,Azerbaijan,Snacks,Offline,L,7/4/2016,520260417,8/16/2016,5474,152.58,97.44,835222.92,533386.56,301836.36
+Central America and the Caribbean,Honduras,Household,Online,H,4/8/2014,624871289,4/23/2014,2155,668.27,502.54,1440121.85,1082973.70,357148.15
+Australia and Oceania,Fiji,Cereal,Online,C,1/29/2014,238132369,3/1/2014,7515,205.70,117.11,1545835.50,880081.65,665753.85
+Europe,Romania,Personal Care,Online,L,4/21/2010,917904984,4/24/2010,7338,81.73,56.67,599734.74,415844.46,183890.28
+Australia and Oceania,Vanuatu,Cereal,Offline,H,4/24/2017,692362964,5/31/2017,4442,205.70,117.11,913719.40,520202.62,393516.78
+Middle East and North Africa,Bahrain,Baby Food,Online,H,9/1/2012,809992635,10/20/2012,3675,255.28,159.42,938154.00,585868.50,352285.50
+Asia,China,Baby Food,Offline,C,8/28/2016,789592826,10/11/2016,6919,255.28,159.42,1766282.32,1103026.98,663255.34
+Europe,Switzerland,Vegetables,Online,C,10/4/2012,670274865,11/13/2012,8082,154.06,90.93,1245112.92,734896.26,510216.66
+Australia and Oceania,Federated States of Micronesia,Meat,Offline,M,1/10/2012,561462581,2/24/2012,8109,421.89,364.69,3421106.01,2957271.21,463834.80
+Central America and the Caribbean,Antigua and Barbuda ,Personal Care,Offline,M,6/6/2011,192892301,7/4/2011,9973,81.73,56.67,815093.29,565169.91,249923.38
+Australia and Oceania,Fiji,Cereal,Offline,L,10/15/2012,264612853,12/3/2012,3678,205.70,117.11,756564.60,430730.58,325834.02
+Central America and the Caribbean,Dominican Republic,Beverages,Offline,L,6/6/2011,196985566,7/3/2011,1261,47.45,31.79,59834.45,40087.19,19747.26
+Europe,Luxembourg,Cosmetics,Offline,M,1/30/2015,380684268,2/23/2015,1789,437.20,263.33,782150.80,471097.37,311053.43
+Middle East and North Africa,Israel,Clothes,Offline,L,5/28/2017,826695287,6/9/2017,6361,109.28,35.84,695130.08,227978.24,467151.84
+Asia,Laos,Household,Offline,H,11/29/2016,716317451,12/1/2016,3107,668.27,502.54,2076314.89,1561391.78,514923.11
+Asia,Thailand,Personal Care,Online,C,3/5/2013,651162087,3/26/2013,2187,81.73,56.67,178743.51,123937.29,54806.22
+Sub-Saharan Africa,Mauritania,Vegetables,Online,H,8/16/2010,403153026,9/16/2010,794,154.06,90.93,122323.64,72198.42,50125.22
+Europe,Romania,Personal Care,Offline,H,9/30/2014,264526593,10/7/2014,8152,81.73,56.67,666262.96,461973.84,204289.12
+Sub-Saharan Africa,Namibia,Snacks,Offline,M,3/2/2013,597831618,3/17/2013,516,152.58,97.44,78731.28,50279.04,28452.24
+Europe,Ukraine,Personal Care,Offline,C,4/17/2017,485929429,5/19/2017,6171,81.73,56.67,504355.83,349710.57,154645.26
+North America,Mexico,Vegetables,Online,L,2/3/2013,881993854,2/28/2013,436,154.06,90.93,67170.16,39645.48,27524.68
+Sub-Saharan Africa,Mauritania,Fruits,Online,L,4/25/2010,559511220,5/17/2010,658,9.33,6.92,6139.14,4553.36,1585.78
+Central America and the Caribbean,Jamaica,Snacks,Offline,M,12/29/2015,162280356,2/10/2016,1219,152.58,97.44,185995.02,118779.36,67215.66
+Middle East and North Africa,Bahrain,Cereal,Online,L,7/1/2015,854412591,7/17/2015,8527,205.70,117.11,1754003.90,998596.97,755406.93
+Asia,Bhutan,Fruits,Offline,C,3/15/2014,270331752,3/27/2014,6028,9.33,6.92,56241.24,41713.76,14527.48
+Central America and the Caribbean,Honduras,Cosmetics,Online,M,12/22/2010,164774167,1/5/2011,9193,437.20,263.33,4019179.60,2420792.69,1598386.91
+Sub-Saharan Africa,Seychelles ,Baby Food,Online,M,2/6/2017,562788665,3/21/2017,527,255.28,159.42,134532.56,84014.34,50518.22
+Europe,Serbia,Office Supplies,Offline,C,8/24/2014,209736573,9/24/2014,4568,651.21,524.96,2974727.28,2398017.28,576710.00
+Central America and the Caribbean,Honduras,Vegetables,Offline,H,3/29/2013,621291720,3/31/2013,2881,154.06,90.93,443846.86,261969.33,181877.53
+Europe,Belgium,Office Supplies,Offline,M,1/5/2016,233440434,2/17/2016,9067,651.21,524.96,5904521.07,4759812.32,1144708.75
+Australia and Oceania,Federated States of Micronesia,Office Supplies,Online,H,10/15/2015,252481544,11/8/2015,3754,651.21,524.96,2444642.34,1970699.84,473942.50
+Sub-Saharan Africa,South Sudan,Household,Offline,H,1/13/2014,605026376,2/18/2014,9604,668.27,502.54,6418065.08,4826394.16,1591670.92
+Sub-Saharan Africa,Kenya,Snacks,Online,H,1/28/2017,387998759,1/30/2017,6310,152.58,97.44,962779.80,614846.40,347933.40
+Middle East and North Africa,United Arab Emirates,Fruits,Online,L,2/23/2017,118635022,3/8/2017,5594,9.33,6.92,52192.02,38710.48,13481.54
+Europe,Austria,Vegetables,Offline,L,5/5/2011,384483993,6/19/2011,6212,154.06,90.93,957020.72,564857.16,392163.56
+Sub-Saharan Africa,Ethiopia,Cereal,Offline,C,12/14/2012,493406999,1/21/2013,8950,205.70,117.11,1841015.00,1048134.50,792880.50
+Sub-Saharan Africa,Togo,Baby Food,Online,H,6/3/2017,723577868,6/23/2017,1626,255.28,159.42,415085.28,259216.92,155868.36
+Sub-Saharan Africa,Togo,Beverages,Online,H,9/2/2013,973482930,10/7/2013,4087,47.45,31.79,193928.15,129925.73,64002.42
+Europe,Belarus,Beverages,Online,H,8/15/2010,311921012,8/26/2010,3214,47.45,31.79,152504.30,102173.06,50331.24
+Europe,Switzerland,Baby Food,Online,L,9/9/2010,128003442,10/23/2010,7918,255.28,159.42,2021307.04,1262287.56,759019.48
+Europe,Italy,Beverages,Offline,C,7/27/2013,981154048,8/9/2013,4141,47.45,31.79,196490.45,131642.39,64848.06
+Central America and the Caribbean,Panama,Meat,Online,H,6/11/2012,351109158,6/26/2012,9857,421.89,364.69,4158569.73,3594749.33,563820.40
+Europe,Germany,Personal Care,Online,L,12/3/2012,287917602,1/5/2013,71,81.73,56.67,5802.83,4023.57,1779.26
+Central America and the Caribbean,Barbados,Meat,Offline,H,2/9/2014,661940705,2/21/2014,1819,421.89,364.69,767417.91,663371.11,104046.80
+Central America and the Caribbean,Saint Kitts and Nevis ,Baby Food,Offline,L,5/18/2012,513852298,6/27/2012,9169,255.28,159.42,2340662.32,1461721.98,878940.34
+Sub-Saharan Africa,Seychelles ,Office Supplies,Offline,H,10/3/2012,304638707,10/15/2012,8218,651.21,524.96,5351643.78,4314121.28,1037522.50
+Sub-Saharan Africa,Togo,Vegetables,Online,H,7/13/2017,565598762,7/29/2017,2097,154.06,90.93,323063.82,190680.21,132383.61
+Europe,Cyprus,Snacks,Offline,L,12/4/2014,548343789,12/6/2014,5967,152.58,97.44,910444.86,581424.48,329020.38
+Asia,Laos,Vegetables,Offline,L,2/22/2013,474797618,3/1/2013,2021,154.06,90.93,311355.26,183769.53,127585.73
+Australia and Oceania,Tuvalu,Clothes,Offline,C,11/24/2013,187196576,12/27/2013,4482,109.28,35.84,489792.96,160634.88,329158.08
+Europe,Cyprus,Meat,Online,L,3/2/2016,498089492,3/22/2016,4604,421.89,364.69,1942381.56,1679032.76,263348.80
+Middle East and North Africa,Iraq,Fruits,Offline,C,6/6/2012,940337693,6/25/2012,5675,9.33,6.92,52947.75,39271.00,13676.75
+Asia,Maldives,Cereal,Online,M,2/26/2015,217115008,3/22/2015,8011,205.70,117.11,1647862.70,938168.21,709694.49
+Europe,Moldova ,Snacks,Offline,C,3/1/2015,251907765,4/7/2015,3961,152.58,97.44,604369.38,385959.84,218409.54
+Asia,China,Fruits,Offline,H,9/11/2015,338514792,9/12/2015,2904,9.33,6.92,27094.32,20095.68,6998.64
+North America,United States of America,Beverages,Online,H,6/27/2013,291047418,7/20/2013,6253,47.45,31.79,296704.85,198782.87,97921.98
+Asia,Maldives,Household,Online,M,2/15/2010,893929469,4/3/2010,2450,668.27,502.54,1637261.50,1231223.00,406038.50
+Central America and the Caribbean,Dominica,Clothes,Online,H,11/1/2015,751897275,12/1/2015,1967,109.28,35.84,214953.76,70497.28,144456.48
+Europe,Malta,Snacks,Online,L,5/26/2015,339999663,6/13/2015,2311,152.58,97.44,352612.38,225183.84,127428.54
+Sub-Saharan Africa,Nigeria,Cosmetics,Online,H,5/21/2017,653597962,6/11/2017,3016,437.20,263.33,1318595.20,794203.28,524391.92
+Europe,Russia,Cereal,Offline,M,6/29/2012,958366000,8/3/2012,651,205.70,117.11,133910.70,76238.61,57672.09
+Sub-Saharan Africa,Seychelles ,Clothes,Offline,H,3/18/2015,140290105,4/8/2015,3814,109.28,35.84,416793.92,136693.76,280100.16
+Sub-Saharan Africa,Zimbabwe,Office Supplies,Offline,M,7/29/2014,755669105,8/27/2014,8136,651.21,524.96,5298244.56,4271074.56,1027170.00
+Europe,Norway,Cereal,Online,M,11/4/2015,481114327,11/24/2015,1276,205.70,117.11,262473.20,149432.36,113040.84
+Sub-Saharan Africa,Botswana,Household,Online,M,12/23/2013,663549602,2/6/2014,7927,668.27,502.54,5297376.29,3983634.58,1313741.71
+Sub-Saharan Africa,Angola,Cosmetics,Offline,L,7/28/2012,470211255,8/15/2012,4814,437.20,263.33,2104680.80,1267670.62,837010.18
+Sub-Saharan Africa,Zimbabwe,Vegetables,Online,H,7/4/2012,938648116,8/14/2012,5691,154.06,90.93,876755.46,517482.63,359272.83
+Sub-Saharan Africa,Madagascar,Beverages,Online,L,9/21/2015,926721513,10/20/2015,6344,47.45,31.79,301022.80,201675.76,99347.04
+Asia,Malaysia,Household,Offline,L,11/11/2013,262605273,12/16/2013,9591,668.27,502.54,6409377.57,4819861.14,1589516.43
+Europe,Liechtenstein,Cereal,Offline,L,10/16/2014,194785726,11/13/2014,280,205.70,117.11,57596.00,32790.80,24805.20
+Sub-Saharan Africa,Mozambique,Clothes,Online,H,1/24/2016,242061698,2/4/2016,290,109.28,35.84,31691.20,10393.60,21297.60
+Europe,Andorra,Beverages,Online,C,4/24/2016,443544518,4/28/2016,3534,47.45,31.79,167688.30,112345.86,55342.44
+Asia,Myanmar,Fruits,Online,H,6/12/2011,908658015,6/25/2011,954,9.33,6.92,8900.82,6601.68,2299.14
+Europe,San Marino,Clothes,Online,H,7/30/2013,467138516,8/8/2013,5523,109.28,35.84,603553.44,197944.32,405609.12
+Asia,North Korea,Clothes,Offline,M,12/16/2016,719034850,2/4/2017,7246,109.28,35.84,791842.88,259696.64,532146.24
+Europe,Bosnia and Herzegovina,Vegetables,Online,H,11/27/2016,184708344,12/2/2016,8159,154.06,90.93,1256975.54,741897.87,515077.67
+Asia,Thailand,Household,Offline,C,8/1/2013,154832828,9/8/2013,7329,668.27,502.54,4897750.83,3683115.66,1214635.17
+Europe,Bosnia and Herzegovina,Office Supplies,Offline,H,10/19/2015,640394628,11/7/2015,5856,651.21,524.96,3813485.76,3074165.76,739320.00
+Australia and Oceania,Vanuatu,Clothes,Online,L,6/26/2014,822692573,7/7/2014,1869,109.28,35.84,204244.32,66984.96,137259.36
+Europe,Andorra,Vegetables,Offline,L,10/15/2016,403337991,11/24/2016,5529,154.06,90.93,851797.74,502751.97,349045.77
+Central America and the Caribbean,Dominican Republic,Baby Food,Online,C,12/31/2011,954254710,1/15/2012,4029,255.28,159.42,1028523.12,642303.18,386219.94
+Europe,Andorra,Vegetables,Online,C,3/3/2013,967679059,3/19/2013,6592,154.06,90.93,1015563.52,599410.56,416152.96
+Asia,Maldives,Beverages,Online,M,7/3/2015,806159865,7/9/2015,9474,47.45,31.79,449541.30,301178.46,148362.84
+Central America and the Caribbean,Guatemala,Cosmetics,Offline,H,4/4/2015,452558457,4/18/2015,959,437.20,263.33,419274.80,252533.47,166741.33
+Sub-Saharan Africa,Sudan,Household,Offline,H,7/19/2013,860048663,7/23/2013,6366,668.27,502.54,4254206.82,3199169.64,1055037.18
+Sub-Saharan Africa,Mauritania,Household,Online,M,7/21/2012,802116811,7/29/2012,3044,668.27,502.54,2034213.88,1529731.76,504482.12
+Sub-Saharan Africa,Cameroon,Office Supplies,Offline,M,9/24/2011,922561728,11/5/2011,5372,651.21,524.96,3498300.12,2820085.12,678215.00
+Sub-Saharan Africa,Central African Republic,Cereal,Offline,C,8/6/2011,585494744,9/13/2011,9761,205.70,117.11,2007837.70,1143110.71,864726.99
+Europe,Macedonia,Snacks,Online,L,7/11/2017,125339686,7/24/2017,9653,152.58,97.44,1472854.74,940588.32,532266.42
+Europe,Croatia,Personal Care,Offline,M,3/29/2013,396832883,3/31/2013,523,81.73,56.67,42744.79,29638.41,13106.38
+Middle East and North Africa,Syria,Meat,Offline,L,1/11/2010,525023162,2/6/2010,4876,421.89,364.69,2057135.64,1778228.44,278907.20
+Australia and Oceania,New Zealand,Cosmetics,Online,C,9/1/2012,155271852,9/18/2012,7246,437.20,263.33,3167951.20,1908089.18,1259862.02
+Central America and the Caribbean,El Salvador,Personal Care,Offline,M,8/26/2015,803252780,10/14/2015,9202,81.73,56.67,752079.46,521477.34,230602.12
+Middle East and North Africa,Israel,Office Supplies,Offline,H,7/10/2014,904952275,7/17/2014,4343,651.21,524.96,2828205.03,2279901.28,548303.75
+Middle East and North Africa,Afghanistan,Vegetables,Offline,M,4/6/2017,766669166,4/21/2017,3298,154.06,90.93,508089.88,299887.14,208202.74
+Sub-Saharan Africa,Madagascar,Clothes,Online,H,3/12/2010,315014779,3/23/2010,8728,109.28,35.84,953795.84,312811.52,640984.32
+Sub-Saharan Africa,Mozambique,Vegetables,Offline,L,10/13/2014,446912944,11/1/2014,326,154.06,90.93,50223.56,29643.18,20580.38
+Sub-Saharan Africa,Niger,Vegetables,Online,C,9/9/2015,779599988,10/9/2015,9816,154.06,90.93,1512252.96,892568.88,619684.08
+Sub-Saharan Africa,Mali,Cosmetics,Online,M,1/2/2010,100624740,1/20/2010,5951,437.20,263.33,2601777.20,1567076.83,1034700.37
+Central America and the Caribbean,Guatemala,Baby Food,Offline,M,1/13/2011,417848527,2/9/2011,9519,255.28,159.42,2430010.32,1517518.98,912491.34
+Europe,Switzerland,Cosmetics,Offline,M,3/18/2014,209445178,4/20/2014,8337,437.20,263.33,3644936.40,2195382.21,1449554.19
+Sub-Saharan Africa,Benin,Meat,Online,H,1/11/2016,273901021,2/8/2016,2254,421.89,364.69,950940.06,822011.26,128928.80
+Central America and the Caribbean,Jamaica,Fruits,Online,C,4/7/2010,580014884,5/21/2010,8148,9.33,6.92,76020.84,56384.16,19636.68
+Sub-Saharan Africa,Mauritania,Fruits,Offline,H,6/25/2014,716898095,7/17/2014,4932,9.33,6.92,46015.56,34129.44,11886.12
+Asia,Kyrgyzstan,Vegetables,Offline,M,3/24/2013,343974483,5/9/2013,8548,154.06,90.93,1316904.88,777269.64,539635.24
+Asia,Nepal,Fruits,Offline,M,10/30/2014,540980374,11/9/2014,6969,9.33,6.92,65020.77,48225.48,16795.29
+Asia,Bhutan,Snacks,Online,C,4/30/2017,657964599,6/17/2017,5201,152.58,97.44,793568.58,506785.44,286783.14
+Sub-Saharan Africa,Mali,Personal Care,Offline,M,4/1/2012,565288484,4/6/2012,279,81.73,56.67,22802.67,15810.93,6991.74
+Sub-Saharan Africa,Sudan,Cereal,Offline,C,2/13/2011,203625857,3/3/2011,6271,205.70,117.11,1289944.70,734396.81,555547.89
+Europe,Switzerland,Clothes,Offline,M,5/21/2011,933963048,6/24/2011,9275,109.28,35.84,1013572.00,332416.00,681156.00
+Europe,Greece,Cereal,Online,H,5/5/2015,587598884,6/13/2015,2422,205.70,117.11,498205.40,283640.42,214564.98
+Asia,Bangladesh,Fruits,Online,C,3/15/2011,216144692,4/18/2011,873,9.33,6.92,8145.09,6041.16,2103.93
+Europe,Ireland,Personal Care,Online,C,10/3/2014,941524302,10/9/2014,6819,81.73,56.67,557316.87,386432.73,170884.14
+Europe,Denmark,Cosmetics,Offline,M,7/22/2012,805974042,7/28/2012,4484,437.20,263.33,1960404.80,1180771.72,779633.08
+Asia,Philippines,Cosmetics,Online,H,3/2/2011,622042739,3/28/2011,5124,437.20,263.33,2240212.80,1349302.92,890909.88
+Sub-Saharan Africa,Malawi,Office Supplies,Online,L,8/18/2010,822591722,9/3/2010,2025,651.21,524.96,1318700.25,1063044.00,255656.25
+Australia and Oceania,Nauru,Cereal,Online,M,11/6/2015,110794818,11/24/2015,5504,205.70,117.11,1132172.80,644573.44,487599.36
+Australia and Oceania,Palau,Clothes,Offline,H,1/24/2010,410138356,3/2/2010,7909,109.28,35.84,864295.52,283458.56,580836.96
+Central America and the Caribbean,Jamaica,Vegetables,Offline,L,9/2/2011,114421164,9/17/2011,8620,154.06,90.93,1327997.20,783816.60,544180.60
+Central America and the Caribbean,Honduras,Meat,Online,C,5/25/2017,837754571,6/2/2017,9049,421.89,364.69,3817682.61,3300079.81,517602.80
+Asia,China,Snacks,Offline,L,9/8/2013,664562404,9/19/2013,7638,152.58,97.44,1165406.04,744246.72,421159.32
+Sub-Saharan Africa,Mali,Clothes,Online,C,10/7/2010,899580991,11/8/2010,4861,109.28,35.84,531210.08,174218.24,356991.84
+Europe,Estonia,Beverages,Offline,L,2/19/2016,217859160,3/5/2016,8222,47.45,31.79,390133.90,261377.38,128756.52
+Sub-Saharan Africa,Rwanda,Meat,Online,L,8/24/2015,514758241,9/13/2015,7257,421.89,364.69,3061655.73,2646555.33,415100.40
+Australia and Oceania,Tonga,Beverages,Online,M,2/20/2015,155952060,4/6/2015,8535,47.45,31.79,404985.75,271327.65,133658.10
+Europe,Andorra,Vegetables,Offline,L,12/15/2013,727426946,2/3/2014,653,154.06,90.93,100601.18,59377.29,41223.89
+Central America and the Caribbean,Saint Lucia,Baby Food,Online,M,4/14/2016,285481727,5/18/2016,9242,255.28,159.42,2359297.76,1473359.64,885938.12
+Sub-Saharan Africa,Togo,Clothes,Online,C,3/28/2012,106727731,4/5/2012,1962,109.28,35.84,214407.36,70318.08,144089.28
+Middle East and North Africa,Syria,Clothes,Offline,L,12/2/2011,638088786,12/28/2011,3506,109.28,35.84,383135.68,125655.04,257480.64
+Sub-Saharan Africa,Guinea,Snacks,Offline,M,5/8/2011,146801221,6/26/2011,598,152.58,97.44,91242.84,58269.12,32973.72
+Australia and Oceania,New Zealand,Snacks,Offline,L,5/30/2011,570413863,6/28/2011,6993,152.58,97.44,1066991.94,681397.92,385594.02
+Middle East and North Africa,Israel,Office Supplies,Offline,L,1/15/2014,766788041,2/16/2014,8476,651.21,524.96,5519655.96,4449560.96,1070095.00
+Middle East and North Africa,Oman,Office Supplies,Online,L,11/21/2010,564097583,12/2/2010,7865,651.21,524.96,5121766.65,4128810.40,992956.25
+Sub-Saharan Africa,Central African Republic,Vegetables,Online,H,5/20/2017,310828816,6/24/2017,9,154.06,90.93,1386.54,818.37,568.17
+Sub-Saharan Africa,Cameroon,Household,Online,L,12/11/2015,425780570,12/18/2015,6787,668.27,502.54,4535548.49,3410738.98,1124809.51
+Asia,Sri Lanka,Snacks,Offline,H,10/7/2012,948064172,11/23/2012,2111,152.58,97.44,322096.38,205695.84,116400.54
+Europe,Belgium,Fruits,Offline,M,5/4/2011,187103450,5/14/2011,6924,9.33,6.92,64600.92,47914.08,16686.84
+Europe,Romania,Cereal,Online,H,3/14/2016,572634732,4/1/2016,4197,205.70,117.11,863322.90,491510.67,371812.23
+Middle East and North Africa,Qatar,Household,Online,H,1/10/2014,104706847,2/7/2014,3938,668.27,502.54,2631647.26,1979002.52,652644.74
+Asia,Maldives,Baby Food,Online,C,4/14/2015,903681123,4/26/2015,8181,255.28,159.42,2088445.68,1304215.02,784230.66
+Sub-Saharan Africa,Uganda,Vegetables,Online,L,7/24/2012,660231387,8/23/2012,5994,154.06,90.93,923435.64,545034.42,378401.22
+Europe,Serbia,Vegetables,Online,C,8/31/2014,285343968,9/5/2014,8476,154.06,90.93,1305812.56,770722.68,535089.88
+Australia and Oceania,Vanuatu,Cereal,Online,L,7/12/2012,760317695,8/30/2012,3757,205.70,117.11,772814.90,439982.27,332832.63
+Europe,Slovenia,Vegetables,Offline,M,4/21/2013,886763894,5/27/2013,1997,154.06,90.93,307657.82,181587.21,126070.61
+Europe,Moldova ,Beverages,Offline,C,11/4/2013,436606395,12/3/2013,389,47.45,31.79,18458.05,12366.31,6091.74
+Middle East and North Africa,Algeria,Fruits,Online,H,1/24/2012,602081525,1/28/2012,8158,9.33,6.92,76114.14,56453.36,19660.78
+Europe,Kosovo,Cosmetics,Online,L,9/26/2010,845738112,10/23/2010,1557,437.20,263.33,680720.40,410004.81,270715.59
+Sub-Saharan Africa,Ghana,Baby Food,Online,L,9/11/2013,250437486,10/5/2013,8872,255.28,159.42,2264844.16,1414374.24,850469.92
+Europe,Belarus,Fruits,Online,C,6/24/2014,669353473,7/7/2014,5422,9.33,6.92,50587.26,37520.24,13067.02
+Sub-Saharan Africa,South Sudan,Cosmetics,Offline,M,4/7/2015,875972402,4/29/2015,8555,437.20,263.33,3740246.00,2252788.15,1487457.85
+Sub-Saharan Africa,Mauritius ,Cosmetics,Offline,L,7/7/2015,614093101,7/27/2015,2650,437.20,263.33,1158580.00,697824.50,460755.50
+Europe,Belgium,Cosmetics,Online,M,9/29/2015,147826898,11/5/2015,4119,437.20,263.33,1800826.80,1084656.27,716170.53
+Sub-Saharan Africa,Tanzania,Personal Care,Offline,M,10/2/2013,711597621,11/14/2013,6404,81.73,56.67,523398.92,362914.68,160484.24
+Asia,Malaysia,Cosmetics,Online,L,12/25/2015,460141599,1/12/2016,4979,437.20,263.33,2176818.80,1311120.07,865698.73
+Sub-Saharan Africa,Cameroon,Cosmetics,Online,M,1/1/2011,318507659,2/7/2011,2349,437.20,263.33,1026982.80,618562.17,408420.63
+Europe,Spain,Cosmetics,Online,C,3/2/2011,832057130,4/2/2011,3050,437.20,263.33,1333460.00,803156.50,530303.50
+Central America and the Caribbean,Panama,Cereal,Online,H,12/17/2010,816463840,1/9/2011,8649,205.70,117.11,1779099.30,1012884.39,766214.91
+Asia,Turkmenistan,Personal Care,Online,M,7/4/2013,507714116,8/23/2013,2744,81.73,56.67,224267.12,155502.48,68764.64
+Europe,Lithuania,Office Supplies,Online,H,8/23/2011,212106788,9/26/2011,5967,651.21,524.96,3885770.07,3132436.32,753333.75
+Sub-Saharan Africa,Guinea-Bissau,Baby Food,Online,H,5/26/2014,756253182,6/9/2014,977,255.28,159.42,249408.56,155753.34,93655.22
+Australia and Oceania,Fiji,Baby Food,Offline,M,12/16/2012,337077128,12/30/2012,7468,255.28,159.42,1906431.04,1190548.56,715882.48
+Europe,Russia,Personal Care,Online,M,9/14/2014,371814954,10/8/2014,7162,81.73,56.67,585350.26,405870.54,179479.72
+Europe,Ireland,Fruits,Online,L,9/19/2016,548015487,10/9/2016,8815,9.33,6.92,82243.95,60999.80,21244.15
+North America,Canada,Cosmetics,Offline,M,3/1/2017,173540055,4/14/2017,3214,437.20,263.33,1405160.80,846342.62,558818.18
+Middle East and North Africa,Israel,Meat,Offline,C,6/21/2011,426562488,7/14/2011,8174,421.89,364.69,3448528.86,2980976.06,467552.80
+Europe,Spain,Vegetables,Offline,M,4/14/2011,305569112,6/3/2011,3545,154.06,90.93,546142.70,322346.85,223795.85
+Asia,Cambodia,Snacks,Online,C,5/19/2010,679358756,5/22/2010,6208,152.58,97.44,947216.64,604907.52,342309.12
+Middle East and North Africa,Iran,Household,Online,H,3/5/2011,237042748,4/3/2011,5072,668.27,502.54,3389465.44,2548882.88,840582.56
+Sub-Saharan Africa,Malawi,Beverages,Offline,H,5/10/2013,438044917,5/17/2013,6080,47.45,31.79,288496.00,193283.20,95212.80
+Central America and the Caribbean,Haiti,Cosmetics,Online,C,2/12/2010,562101590,3/17/2010,7207,437.20,263.33,3150900.40,1897819.31,1253081.09
+Sub-Saharan Africa,Republic of the Congo,Vegetables,Offline,M,8/19/2014,859261596,9/29/2014,3456,154.06,90.93,532431.36,314254.08,218177.28
+Asia,Sri Lanka,Snacks,Offline,C,11/12/2010,299886262,12/8/2010,1864,152.58,97.44,284409.12,181628.16,102780.96
+Middle East and North Africa,Israel,Vegetables,Offline,M,5/2/2010,624649417,5/26/2010,6498,154.06,90.93,1001081.88,590863.14,410218.74
+Middle East and North Africa,Pakistan,Fruits,Online,C,6/27/2010,494537389,7/31/2010,3458,9.33,6.92,32263.14,23929.36,8333.78
+Sub-Saharan Africa,Swaziland,Baby Food,Online,L,8/15/2013,440849006,9/24/2013,5872,255.28,159.42,1499004.16,936114.24,562889.92
+Sub-Saharan Africa,Ethiopia,Snacks,Offline,M,7/11/2015,615195596,8/24/2015,8903,152.58,97.44,1358419.74,867508.32,490911.42
+Sub-Saharan Africa,Ethiopia,Baby Food,Offline,L,11/2/2016,339500987,12/5/2016,4741,255.28,159.42,1210282.48,755810.22,454472.26
+Sub-Saharan Africa,Equatorial Guinea,Clothes,Online,H,9/9/2011,356001508,9/17/2011,7612,109.28,35.84,831839.36,272814.08,559025.28
+Australia and Oceania,Marshall Islands,Baby Food,Online,H,3/18/2014,577245986,3/27/2014,8770,255.28,159.42,2238805.60,1398113.40,840692.20
+Europe,Slovakia,Snacks,Offline,C,11/16/2016,536095750,12/26/2016,1500,152.58,97.44,228870.00,146160.00,82710.00
+Sub-Saharan Africa,Tanzania,Fruits,Offline,C,1/5/2017,735724627,2/15/2017,6122,9.33,6.92,57118.26,42364.24,14754.02
+Central America and the Caribbean,The Bahamas,Beverages,Online,L,1/4/2013,399618947,1/19/2013,4982,47.45,31.79,236395.90,158377.78,78018.12
+Europe,Armenia,Household,Offline,L,9/9/2015,621577537,9/16/2015,7461,668.27,502.54,4985962.47,3749450.94,1236511.53
+Sub-Saharan Africa,Eritrea,Cosmetics,Online,H,3/17/2014,315711724,4/8/2014,4970,437.20,263.33,2172884.00,1308750.10,864133.90
+Asia,India,Cosmetics,Online,H,2/24/2010,266445338,2/28/2010,5951,437.20,263.33,2601777.20,1567076.83,1034700.37
+Asia,Philippines,Beverages,Offline,C,9/29/2013,878514707,10/11/2013,879,47.45,31.79,41708.55,27943.41,13765.14
+Europe,Bulgaria,Cosmetics,Offline,H,5/6/2017,826968657,6/15/2017,7258,437.20,263.33,3173197.60,1911249.14,1261948.46
+Sub-Saharan Africa,Zimbabwe,Cereal,Offline,L,5/18/2014,207168519,7/6/2014,4623,205.70,117.11,950951.10,541399.53,409551.57
+Central America and the Caribbean,Antigua and Barbuda ,Baby Food,Online,L,9/7/2010,984788119,10/11/2010,9544,255.28,159.42,2436392.32,1521504.48,914887.84
+Sub-Saharan Africa,Gabon,Cosmetics,Offline,M,3/6/2013,245813786,3/12/2013,617,437.20,263.33,269752.40,162474.61,107277.79
+Europe,Montenegro,Household,Offline,L,11/25/2010,546544349,12/12/2010,3473,668.27,502.54,2320901.71,1745321.42,575580.29
+Europe,Luxembourg,Household,Offline,C,9/5/2016,463591134,10/1/2016,5773,668.27,502.54,3857922.71,2901163.42,956759.29
+Sub-Saharan Africa,Sudan,Baby Food,Offline,H,5/2/2010,443877971,6/6/2010,2210,255.28,159.42,564168.80,352318.20,211850.60
+Australia and Oceania,Marshall Islands,Household,Online,M,8/7/2010,554641187,8/13/2010,9507,668.27,502.54,6353242.89,4777647.78,1575595.11
+Asia,Malaysia,Meat,Offline,M,10/14/2010,933429610,11/28/2010,1419,421.89,364.69,598661.91,517495.11,81166.80
+Central America and the Caribbean,Saint Kitts and Nevis ,Cosmetics,Offline,H,10/31/2012,438104569,11/13/2012,3733,437.20,263.33,1632067.60,983010.89,649056.71
+Europe,Macedonia,Office Supplies,Offline,C,12/17/2015,696839892,1/2/2016,9264,651.21,524.96,6032809.44,4863229.44,1169580.00
+Asia,Kyrgyzstan,Clothes,Offline,H,11/16/2012,258121907,12/6/2012,2863,109.28,35.84,312868.64,102609.92,210258.72
+Central America and the Caribbean,Haiti,Clothes,Online,M,4/17/2016,440749442,5/19/2016,6409,109.28,35.84,700375.52,229698.56,470676.96
+Asia,Bhutan,Snacks,Offline,L,4/8/2017,383833825,4/25/2017,3813,152.58,97.44,581787.54,371538.72,210248.82
+Central America and the Caribbean,Belize,Vegetables,Online,L,9/15/2011,196798884,10/21/2011,6018,154.06,90.93,927133.08,547216.74,379916.34
+Europe,United Kingdom,Personal Care,Offline,M,9/22/2011,509380948,9/27/2011,5997,81.73,56.67,490134.81,339849.99,150284.82
+Europe,Russia,Clothes,Offline,M,7/28/2011,221628844,9/1/2011,3755,109.28,35.84,410346.40,134579.20,275767.20
+Sub-Saharan Africa,Zimbabwe,Beverages,Offline,H,2/18/2014,553903901,4/6/2014,1328,47.45,31.79,63013.60,42217.12,20796.48
+Sub-Saharan Africa,Equatorial Guinea,Cosmetics,Offline,C,1/5/2012,996879947,1/5/2012,7784,437.20,263.33,3403164.80,2049760.72,1353404.08
+Sub-Saharan Africa,Cote d'Ivoire,Office Supplies,Offline,H,1/1/2014,661543309,1/20/2014,4221,651.21,524.96,2748757.41,2215856.16,532901.25
+Asia,North Korea,Household,Offline,L,1/18/2011,529192817,2/1/2011,8769,668.27,502.54,5860059.63,4406773.26,1453286.37
+Sub-Saharan Africa,Guinea,Meat,Online,L,4/17/2010,301439797,4/26/2010,1590,421.89,364.69,670805.10,579857.10,90948.00
+Europe,Estonia,Beverages,Online,H,2/29/2016,650208079,3/19/2016,9875,47.45,31.79,468568.75,313926.25,154642.50
+Asia,Myanmar,Office Supplies,Offline,M,6/8/2011,967733991,6/28/2011,2848,651.21,524.96,1854646.08,1495086.08,359560.00
+Sub-Saharan Africa,Ghana,Household,Online,M,1/7/2014,716566359,2/1/2014,6764,668.27,502.54,4520178.28,3399180.56,1120997.72
+Australia and Oceania,Solomon Islands,Baby Food,Online,M,8/9/2012,779566514,8/22/2012,9910,255.28,159.42,2529824.80,1579852.20,949972.60
+Sub-Saharan Africa,Ghana,Baby Food,Offline,C,11/18/2015,309908282,1/7/2016,7602,255.28,159.42,1940638.56,1211910.84,728727.72
+Asia,Bhutan,Beverages,Online,L,11/17/2010,781077992,12/2/2010,7190,47.45,31.79,341165.50,228570.10,112595.40
+Asia,Bhutan,Cereal,Offline,H,3/13/2012,136874473,4/8/2012,3053,205.70,117.11,628002.10,357536.83,270465.27
+Australia and Oceania,New Zealand,Meat,Online,M,10/15/2012,441409051,10/29/2012,1602,421.89,364.69,675867.78,584233.38,91634.40
+Europe,Moldova ,Meat,Offline,L,6/14/2010,229105556,8/3/2010,6280,421.89,364.69,2649469.20,2290253.20,359216.00
+Sub-Saharan Africa,Swaziland,Baby Food,Offline,M,8/17/2011,354700314,8/29/2011,2560,255.28,159.42,653516.80,408115.20,245401.60
+Middle East and North Africa,Kuwait,Baby Food,Offline,M,6/13/2012,843242156,7/9/2012,2948,255.28,159.42,752565.44,469970.16,282595.28
+Asia,Philippines,Fruits,Offline,M,2/19/2010,440092408,3/14/2010,1978,9.33,6.92,18454.74,13687.76,4766.98
+Sub-Saharan Africa,Equatorial Guinea,Clothes,Online,C,4/25/2014,660924899,5/21/2014,1220,109.28,35.84,133321.60,43724.80,89596.80
+Asia,Vietnam,Baby Food,Online,C,12/18/2012,841725957,1/8/2013,4271,255.28,159.42,1090300.88,680882.82,409418.06
+Sub-Saharan Africa,Djibouti,Clothes,Online,H,1/24/2014,388794410,2/24/2014,1761,109.28,35.84,192442.08,63114.24,129327.84
+Sub-Saharan Africa,Mauritius ,Meat,Offline,C,7/4/2011,128741586,8/18/2011,6351,421.89,364.69,2679423.39,2316146.19,363277.20
+Asia,Philippines,Snacks,Offline,L,8/12/2011,958491313,9/18/2011,7734,152.58,97.44,1180053.72,753600.96,426452.76
+Middle East and North Africa,Iran,Baby Food,Online,H,3/10/2014,695279920,4/26/2014,7634,255.28,159.42,1948807.52,1217012.28,731795.24
+Asia,China,Meat,Online,H,5/1/2016,826656234,5/1/2016,4805,421.89,364.69,2027181.45,1752335.45,274846.00
+Europe,Ukraine,Office Supplies,Offline,M,3/11/2016,660481584,4/20/2016,33,651.21,524.96,21489.93,17323.68,4166.25
+Australia and Oceania,Australia,Cereal,Offline,L,10/11/2016,474929797,11/22/2016,1136,205.70,117.11,233675.20,133036.96,100638.24
+Europe,Kosovo,Office Supplies,Offline,H,8/3/2014,168487203,9/21/2014,7962,651.21,524.96,5184934.02,4179731.52,1005202.50
+Europe,Russia,Meat,Online,M,12/20/2010,609952628,1/31/2011,7392,421.89,364.69,3118610.88,2695788.48,422822.40
+Central America and the Caribbean,Grenada,Fruits,Online,M,11/29/2015,488437402,12/12/2015,8336,9.33,6.92,77774.88,57685.12,20089.76
+Central America and the Caribbean,Grenada,Household,Offline,H,12/17/2013,363365352,2/1/2014,6737,668.27,502.54,4502134.99,3385611.98,1116523.01
+Middle East and North Africa,Kuwait,Fruits,Offline,C,6/13/2013,414472806,7/17/2013,569,9.33,6.92,5308.77,3937.48,1371.29
+Europe,Slovakia,Baby Food,Offline,H,5/30/2012,891808593,6/11/2012,4835,255.28,159.42,1234278.80,770795.70,463483.10
+Europe,San Marino,Fruits,Online,L,7/10/2017,765734040,8/4/2017,6574,9.33,6.92,61335.42,45492.08,15843.34
+Central America and the Caribbean,The Bahamas,Clothes,Online,H,1/8/2010,876922976,1/17/2010,9851,109.28,35.84,1076517.28,353059.84,723457.44
+Australia and Oceania,Vanuatu,Beverages,Online,L,1/23/2010,786361730,2/3/2010,765,47.45,31.79,36299.25,24319.35,11979.90
+Europe,San Marino,Cereal,Offline,L,5/18/2012,125349128,6/6/2012,2447,205.70,117.11,503347.90,286568.17,216779.73
+Central America and the Caribbean,The Bahamas,Personal Care,Online,M,10/1/2012,845496499,11/2/2012,58,81.73,56.67,4740.34,3286.86,1453.48
+Middle East and North Africa,Israel,Household,Offline,L,10/27/2011,468727672,12/4/2011,5789,668.27,502.54,3868615.03,2909204.06,959410.97
+Middle East and North Africa,Lebanon,Office Supplies,Offline,H,4/18/2011,637278974,5/26/2011,3865,651.21,524.96,2516926.65,2028970.40,487956.25
+Sub-Saharan Africa,Sao Tome and Principe,Cereal,Online,M,2/26/2010,363699233,3/20/2010,5540,205.70,117.11,1139578.00,648789.40,490788.60
+Middle East and North Africa,Somalia,Office Supplies,Online,M,1/9/2016,980849778,2/21/2016,4101,651.21,524.96,2670612.21,2152860.96,517751.25
+Sub-Saharan Africa,Tanzania,Personal Care,Offline,L,1/29/2011,291904437,3/11/2011,9865,81.73,56.67,806266.45,559049.55,247216.90
+Middle East and North Africa,Oman,Cosmetics,Online,L,6/7/2016,220349538,6/29/2016,5180,437.20,263.33,2264696.00,1364049.40,900646.60
+Asia,Bangladesh,Cosmetics,Offline,C,8/11/2012,959983909,9/7/2012,9426,437.20,263.33,4121047.20,2482148.58,1638898.62
+Australia and Oceania,Kiribati,Cereal,Online,C,6/28/2011,524918878,7/12/2011,4016,205.70,117.11,826091.20,470313.76,355777.44
+Asia,Nepal,Household,Offline,H,8/29/2014,599578273,9/24/2014,7390,668.27,502.54,4938515.30,3713770.60,1224744.70
+Europe,Netherlands,Vegetables,Offline,H,3/12/2017,688698422,4/1/2017,22,154.06,90.93,3389.32,2000.46,1388.86
+Europe,France,Household,Online,L,6/16/2011,367328155,7/30/2011,9419,668.27,502.54,6294435.13,4733424.26,1561010.87
+Asia,North Korea,Snacks,Online,L,8/1/2013,630828797,8/5/2013,5114,152.58,97.44,780294.12,498308.16,281985.96
+Middle East and North Africa,Jordan,Fruits,Online,H,4/11/2014,744874179,4/11/2014,3677,9.33,6.92,34306.41,25444.84,8861.57
+Europe,Belgium,Cereal,Offline,L,11/14/2012,495450627,12/26/2012,3705,205.70,117.11,762118.50,433892.55,328225.95
+Europe,Belarus,Personal Care,Online,M,7/24/2013,638856971,8/21/2013,829,81.73,56.67,67754.17,46979.43,20774.74
+Australia and Oceania,Tonga,Household,Online,H,1/9/2014,651704537,1/30/2014,2710,668.27,502.54,1811011.70,1361883.40,449128.30
+Central America and the Caribbean,Dominica,Meat,Offline,C,10/17/2016,980917155,11/8/2016,4039,421.89,364.69,1704013.71,1472982.91,231030.80
+Middle East and North Africa,Iran,Household,Offline,C,4/29/2010,793731153,6/12/2010,1541,668.27,502.54,1029804.07,774414.14,255389.93
+Middle East and North Africa,Somalia,Vegetables,Online,M,8/20/2010,227695357,9/28/2010,8971,154.06,90.93,1382072.26,815733.03,566339.23
+Middle East and North Africa,Azerbaijan,Baby Food,Offline,C,2/5/2012,840671098,2/27/2012,2114,255.28,159.42,539661.92,337013.88,202648.04
+Sub-Saharan Africa,Cameroon,Personal Care,Online,M,12/6/2013,660832202,1/24/2014,3789,81.73,56.67,309674.97,214722.63,94952.34
+Europe,Slovakia,Vegetables,Offline,M,6/1/2016,936664998,7/5/2016,8843,154.06,90.93,1362352.58,804093.99,558258.59
+Central America and the Caribbean,El Salvador,Cereal,Online,M,2/13/2017,286968314,3/19/2017,9156,205.70,117.11,1883389.20,1072259.16,811130.04
+Australia and Oceania,Palau,Baby Food,Online,M,9/2/2014,550853478,9/18/2014,8640,255.28,159.42,2205619.20,1377388.80,828230.40
+Sub-Saharan Africa,Uganda,Clothes,Offline,M,7/18/2012,937744319,8/26/2012,8238,109.28,35.84,900248.64,295249.92,604998.72
+Central America and the Caribbean,Saint Kitts and Nevis ,Fruits,Offline,C,4/17/2015,277377164,5/7/2015,922,9.33,6.92,8602.26,6380.24,2222.02
+Sub-Saharan Africa,Guinea-Bissau,Baby Food,Online,C,2/27/2017,169800841,3/19/2017,6697,255.28,159.42,1709610.16,1067635.74,641974.42
+Sub-Saharan Africa,Mauritania,Beverages,Online,L,6/17/2013,935376679,6/27/2013,7600,47.45,31.79,360620.00,241604.00,119016.00
+Central America and the Caribbean,Saint Kitts and Nevis ,Cosmetics,Offline,H,12/8/2011,264778506,1/27/2012,2699,437.20,263.33,1180002.80,710727.67,469275.13
+Asia,Indonesia,Household,Offline,L,10/25/2013,868992650,11/5/2013,3091,668.27,502.54,2065622.57,1553351.14,512271.43
+Middle East and North Africa,Egypt,Vegetables,Offline,H,1/15/2010,129317939,1/22/2010,6907,154.06,90.93,1064092.42,628053.51,436038.91
+Asia,Sri Lanka,Beverages,Online,H,4/30/2015,447365701,5/12/2015,4307,47.45,31.79,204367.15,136919.53,67447.62
+Europe,Belgium,Cosmetics,Offline,C,5/21/2011,695059764,6/29/2011,2485,437.20,263.33,1086442.00,654375.05,432066.95
+Asia,Myanmar,Clothes,Offline,H,4/11/2011,264636456,4/24/2011,663,109.28,35.84,72452.64,23761.92,48690.72
+Middle East and North Africa,Lebanon,Vegetables,Online,M,3/14/2010,418644607,3/15/2010,5097,154.06,90.93,785243.82,463470.21,321773.61
+Middle East and North Africa,Yemen,Cosmetics,Offline,L,12/27/2011,239945542,1/25/2012,4073,437.20,263.33,1780715.60,1072543.09,708172.51
+Europe,Belarus,Beverages,Online,H,3/8/2010,681713092,3/22/2010,2908,47.45,31.79,137984.60,92445.32,45539.28
+Middle East and North Africa,Kuwait,Snacks,Offline,H,7/15/2014,517433583,8/20/2014,8951,152.58,97.44,1365743.58,872185.44,493558.14
+Middle East and North Africa,United Arab Emirates,Cosmetics,Offline,H,12/5/2016,390905845,12/15/2016,6581,437.20,263.33,2877213.20,1732974.73,1144238.47
+Sub-Saharan Africa,Burkina Faso,Baby Food,Offline,L,4/23/2010,566241204,5/13/2010,2210,255.28,159.42,564168.80,352318.20,211850.60
+Asia,India,Household,Online,M,3/14/2015,477863490,4/17/2015,9281,668.27,502.54,6202213.87,4664073.74,1538140.13
+Sub-Saharan Africa,Guinea,Baby Food,Offline,M,4/24/2015,980509030,5/29/2015,3266,255.28,159.42,833744.48,520665.72,313078.76
+Sub-Saharan Africa,Ghana,Cereal,Offline,C,5/15/2014,299226653,6/27/2014,6671,205.70,117.11,1372224.70,781240.81,590983.89
+Sub-Saharan Africa,Ghana,Personal Care,Offline,H,2/24/2017,779377686,4/8/2017,4032,81.73,56.67,329535.36,228493.44,101041.92
+Sub-Saharan Africa,Uganda,Personal Care,Offline,H,7/27/2010,336635959,8/2/2010,6916,81.73,56.67,565244.68,391929.72,173314.96
+Middle East and North Africa,Oman,Meat,Online,L,11/23/2012,106987798,12/13/2012,8922,421.89,364.69,3764102.58,3253764.18,510338.40
+Asia,Tajikistan,Fruits,Offline,M,12/17/2016,396732032,12/23/2016,679,9.33,6.92,6335.07,4698.68,1636.39
+Australia and Oceania,Australia,Cosmetics,Offline,L,8/28/2016,232479989,9/1/2016,4850,437.20,263.33,2120420.00,1277150.50,843269.50
+Europe,Denmark,Beverages,Offline,H,9/26/2010,511155498,11/4/2010,1126,47.45,31.79,53428.70,35795.54,17633.16
+Australia and Oceania,Kiribati,Household,Online,H,2/24/2014,849994885,4/13/2014,1230,668.27,502.54,821972.10,618124.20,203847.90
+Sub-Saharan Africa,Cote d'Ivoire,Baby Food,Offline,C,6/1/2016,936546981,6/10/2016,3919,255.28,159.42,1000442.32,624766.98,375675.34
+Central America and the Caribbean,Barbados,Beverages,Online,C,9/11/2015,978673112,9/24/2015,9977,47.45,31.79,473408.65,317168.83,156239.82
+Sub-Saharan Africa,Democratic Republic of the Congo,Snacks,Offline,C,12/26/2014,354547107,2/2/2015,7223,152.58,97.44,1102085.34,703809.12,398276.22
+Europe,France,Personal Care,Online,H,10/16/2010,762655293,11/11/2010,5504,81.73,56.67,449841.92,311911.68,137930.24
+Australia and Oceania,Tuvalu,Office Supplies,Offline,H,1/12/2012,371796500,1/19/2012,1701,651.21,524.96,1107708.21,892956.96,214751.25
+Asia,Myanmar,Cereal,Offline,C,7/20/2013,571082055,8/15/2013,4726,205.70,117.11,972138.20,553461.86,418676.34
+Europe,Romania,Personal Care,Offline,L,1/14/2015,119935786,1/27/2015,519,81.73,56.67,42417.87,29411.73,13006.14
+Sub-Saharan Africa,Rwanda,Personal Care,Offline,H,4/3/2017,998094022,4/16/2017,7056,81.73,56.67,576686.88,399863.52,176823.36
+Europe,Czech Republic,Snacks,Online,M,8/31/2010,755605590,9/11/2010,9340,152.58,97.44,1425097.20,910089.60,515007.60
+Sub-Saharan Africa,Zambia,Beverages,Offline,C,1/31/2017,162831819,2/2/2017,4408,47.45,31.79,209159.60,140130.32,69029.28
+Australia and Oceania,Tonga,Office Supplies,Offline,H,3/7/2010,960446536,3/28/2010,6328,651.21,524.96,4120856.88,3321946.88,798910.00
+Sub-Saharan Africa,Nigeria,Clothes,Offline,L,2/10/2010,909436070,2/27/2010,1198,109.28,35.84,130917.44,42936.32,87981.12
+Asia,Turkmenistan,Office Supplies,Online,L,8/10/2011,541099250,9/6/2011,2147,651.21,524.96,1398147.87,1127089.12,271058.75
+Europe,Moldova ,Meat,Online,M,6/13/2010,907047402,8/1/2010,4338,421.89,364.69,1830158.82,1582025.22,248133.60
+Sub-Saharan Africa,Burundi,Meat,Online,C,11/7/2014,429204356,11/28/2014,9962,421.89,364.69,4202868.18,3633041.78,569826.40
+Sub-Saharan Africa,Djibouti,Office Supplies,Offline,L,5/17/2011,749806439,7/2/2011,3243,651.21,524.96,2111874.03,1702445.28,409428.75
+Sub-Saharan Africa,Mauritius ,Vegetables,Online,C,2/23/2014,881402480,3/7/2014,5435,154.06,90.93,837316.10,494204.55,343111.55
+Asia,South Korea,Fruits,Offline,H,8/24/2015,356853806,9/16/2015,9826,9.33,6.92,91676.58,67995.92,23680.66
+Australia and Oceania,New Zealand,Cereal,Online,L,3/11/2013,579334247,3/30/2013,6733,205.70,117.11,1384978.10,788501.63,596476.47
+Australia and Oceania,Kiribati,Clothes,Offline,C,10/3/2012,772330129,10/9/2012,8503,109.28,35.84,929207.84,304747.52,624460.32
+Sub-Saharan Africa,Lesotho,Beverages,Offline,M,1/2/2010,229640281,1/28/2010,4517,47.45,31.79,214331.65,143595.43,70736.22
+Middle East and North Africa,Jordan,Fruits,Offline,L,10/26/2016,565376031,11/29/2016,6186,9.33,6.92,57715.38,42807.12,14908.26
+Middle East and North Africa,Pakistan,Office Supplies,Offline,M,1/25/2012,763961207,2/19/2012,1953,651.21,524.96,1271813.13,1025246.88,246566.25
+Sub-Saharan Africa,Seychelles ,Beverages,Offline,L,7/19/2013,330132138,7/25/2013,2291,47.45,31.79,108707.95,72830.89,35877.06
+Europe,Norway,Fruits,Offline,L,8/12/2013,638937652,9/6/2013,4705,9.33,6.92,43897.65,32558.60,11339.05
+Middle East and North Africa,Syria,Clothes,Online,H,4/6/2013,885739076,5/14/2013,8730,109.28,35.84,954014.40,312883.20,641131.20
+Sub-Saharan Africa,Sudan,Household,Offline,H,10/8/2010,336210238,11/22/2010,936,668.27,502.54,625500.72,470377.44,155123.28
+Sub-Saharan Africa,Togo,Fruits,Online,C,1/14/2013,576337468,1/18/2013,9919,9.33,6.92,92544.27,68639.48,23904.79
+Middle East and North Africa,Libya,Household,Offline,H,9/10/2016,562419593,9/27/2016,1311,668.27,502.54,876101.97,658829.94,217272.03
+Central America and the Caribbean,Jamaica,Beverages,Offline,L,11/3/2011,671067941,12/18/2011,2771,47.45,31.79,131483.95,88090.09,43393.86
+Europe,France,Cereal,Offline,H,2/26/2016,449206340,4/3/2016,8993,205.70,117.11,1849860.10,1053170.23,796689.87
+Europe,Romania,Beverages,Online,L,7/10/2010,864071118,7/18/2010,6700,47.45,31.79,317915.00,212993.00,104922.00
+Europe,Russia,Office Supplies,Online,C,12/16/2010,253211104,12/27/2010,9648,651.21,524.96,6282874.08,5064814.08,1218060.00
+Sub-Saharan Africa,Equatorial Guinea,Cereal,Offline,H,11/2/2011,174487626,11/12/2011,3621,205.70,117.11,744839.70,424055.31,320784.39
+Asia,Cambodia,Beverages,Online,H,5/16/2012,456074512,5/25/2012,1438,47.45,31.79,68233.10,45714.02,22519.08
+Australia and Oceania,Samoa ,Cosmetics,Online,C,11/9/2012,546458089,12/4/2012,7947,437.20,263.33,3474428.40,2092683.51,1381744.89
+Central America and the Caribbean,Saint Vincent and the Grenadines,Personal Care,Offline,L,11/5/2010,864437186,11/19/2010,5028,81.73,56.67,410938.44,284936.76,126001.68
+Australia and Oceania,Solomon Islands,Office Supplies,Offline,L,7/18/2012,549123132,8/30/2012,6592,651.21,524.96,4292776.32,3460536.32,832240.00
+Europe,Belgium,Fruits,Online,M,11/10/2013,609939754,11/30/2013,3582,9.33,6.92,33420.06,24787.44,8632.62
+Sub-Saharan Africa,Mauritania,Cosmetics,Online,C,10/6/2011,776623380,10/20/2011,8971,437.20,263.33,3922121.20,2362333.43,1559787.77
+Asia,Vietnam,Office Supplies,Offline,L,8/25/2015,849222838,9/28/2015,2764,651.21,524.96,1799944.44,1450989.44,348955.00
+Sub-Saharan Africa,Guinea-Bissau,Cosmetics,Offline,M,4/4/2013,248099458,4/5/2013,6998,437.20,263.33,3059525.60,1842783.34,1216742.26
+Central America and the Caribbean,Grenada,Office Supplies,Offline,C,5/1/2012,263927066,5/27/2012,739,651.21,524.96,481244.19,387945.44,93298.75
+Europe,Lithuania,Cereal,Offline,M,2/6/2014,907691991,3/9/2014,5086,205.70,117.11,1046190.20,595621.46,450568.74
+Europe,Georgia,Fruits,Offline,C,1/28/2017,460693061,2/25/2017,8169,9.33,6.92,76216.77,56529.48,19687.29
+Europe,Switzerland,Office Supplies,Offline,H,4/5/2013,424541604,5/17/2013,150,651.21,524.96,97681.50,78744.00,18937.50
+Europe,Czech Republic,Household,Online,L,8/25/2014,571161448,9/30/2014,8220,668.27,502.54,5493179.40,4130878.80,1362300.60
+Middle East and North Africa,Afghanistan,Vegetables,Online,M,8/4/2011,292788922,9/8/2011,1603,154.06,90.93,246958.18,145760.79,101197.39
+Sub-Saharan Africa,Central African Republic,Cosmetics,Online,L,6/5/2014,851972854,6/10/2014,6555,437.20,263.33,2865846.00,1726128.15,1139717.85
+Central America and the Caribbean,Guatemala,Personal Care,Offline,C,11/5/2011,431574571,11/29/2011,1361,81.73,56.67,111234.53,77127.87,34106.66
+Sub-Saharan Africa,Swaziland,Cereal,Offline,C,7/13/2012,884767901,7/20/2012,1338,205.70,117.11,275226.60,156693.18,118533.42
+Europe,Netherlands,Beverages,Online,H,2/4/2011,985039174,3/10/2011,3836,47.45,31.79,182018.20,121946.44,60071.76
+Central America and the Caribbean,Costa Rica,Office Supplies,Offline,M,7/23/2014,476187217,8/15/2014,3234,651.21,524.96,2106013.14,1697720.64,408292.50
+Europe,Romania,Clothes,Online,H,11/16/2015,522323358,11/20/2015,5944,109.28,35.84,649560.32,213032.96,436527.36
+Sub-Saharan Africa,Cameroon,Baby Food,Online,H,11/4/2012,557871425,12/22/2012,5407,255.28,159.42,1380298.96,861983.94,518315.02
+Sub-Saharan Africa,Republic of the Congo,Cosmetics,Online,M,11/25/2011,537567746,12/30/2011,7097,437.20,263.33,3102808.40,1868853.01,1233955.39
+Europe,Latvia,Vegetables,Offline,M,10/5/2016,486461150,11/13/2016,3519,154.06,90.93,542137.14,319982.67,222154.47
+Europe,Slovenia,Cosmetics,Online,M,1/24/2017,949912965,3/6/2017,9210,437.20,263.33,4026612.00,2425269.30,1601342.70
+Asia,Turkmenistan,Personal Care,Offline,C,11/14/2014,743597018,11/29/2014,5737,81.73,56.67,468885.01,325115.79,143769.22
+Europe,France,Fruits,Online,L,4/20/2013,103499639,6/6/2013,6698,9.33,6.92,62492.34,46350.16,16142.18
+Central America and the Caribbean,Barbados,Beverages,Offline,C,10/3/2012,235919654,10/13/2012,2723,47.45,31.79,129206.35,86564.17,42642.18
+Asia,Nepal,Baby Food,Online,C,9/17/2014,167468392,10/29/2014,6474,255.28,159.42,1652682.72,1032085.08,620597.64
+Central America and the Caribbean,Nicaragua,Cereal,Online,C,5/2/2010,795069682,5/19/2010,7642,205.70,117.11,1571959.40,894954.62,677004.78
+Sub-Saharan Africa,Ghana,Meat,Offline,L,8/1/2014,835959851,8/27/2014,7952,421.89,364.69,3354869.28,2900014.88,454854.40
+Europe,Slovakia,Personal Care,Offline,C,12/23/2016,877687728,2/7/2017,6158,81.73,56.67,503293.34,348973.86,154319.48
+Sub-Saharan Africa,Botswana,Personal Care,Online,L,9/2/2015,228114640,9/16/2015,3046,81.73,56.67,248949.58,172616.82,76332.76
+Central America and the Caribbean,Cuba,Clothes,Offline,M,9/1/2013,965414416,9/13/2013,6434,109.28,35.84,703107.52,230594.56,472512.96
+Europe,Greece,Baby Food,Offline,H,1/15/2015,288073384,2/16/2015,6171,255.28,159.42,1575332.88,983780.82,591552.06
+Central America and the Caribbean,Costa Rica,Meat,Online,H,7/26/2013,864890372,7/28/2013,9136,421.89,364.69,3854387.04,3331807.84,522579.20
+Central America and the Caribbean,Saint Kitts and Nevis ,Cereal,Offline,L,8/30/2011,484976708,9/16/2011,4240,205.70,117.11,872168.00,496546.40,375621.60
+Europe,Latvia,Household,Online,H,8/3/2016,607756221,8/11/2016,7426,668.27,502.54,4962573.02,3731862.04,1230710.98
+Central America and the Caribbean,Antigua and Barbuda ,Baby Food,Online,C,12/17/2013,512965238,1/7/2014,6668,255.28,159.42,1702207.04,1063012.56,639194.48
+Middle East and North Africa,Pakistan,Snacks,Online,C,12/17/2016,450652587,1/25/2017,6970,152.58,97.44,1063482.60,679156.80,384325.80
+Europe,Liechtenstein,Household,Online,H,2/13/2017,291179597,2/20/2017,5368,668.27,502.54,3587273.36,2697634.72,889638.64
+Europe,San Marino,Fruits,Online,L,10/25/2010,875220096,11/6/2010,5930,9.33,6.92,55326.90,41035.60,14291.30
+Sub-Saharan Africa,Equatorial Guinea,Clothes,Offline,H,8/20/2010,863760411,8/21/2010,4755,109.28,35.84,519626.40,170419.20,349207.20
+Sub-Saharan Africa,Rwanda,Snacks,Offline,H,4/23/2011,788099372,5/5/2011,4972,152.58,97.44,758627.76,484471.68,274156.08
+Europe,Greece,Household,Offline,C,3/11/2016,799848306,4/23/2016,1743,668.27,502.54,1164794.61,875927.22,288867.39
+Middle East and North Africa,Somalia,Meat,Online,M,10/12/2010,220931041,11/13/2010,7259,421.89,364.69,3062499.51,2647284.71,415214.80
+Europe,Czech Republic,Meat,Offline,M,12/5/2011,693583905,1/6/2012,5745,421.89,364.69,2423758.05,2095144.05,328614.00
+Sub-Saharan Africa,Rwanda,Clothes,Online,C,1/14/2011,330355727,2/14/2011,8456,109.28,35.84,924071.68,303063.04,621008.64
+Australia and Oceania,East Timor,Cosmetics,Offline,H,9/27/2015,464107835,10/29/2015,8677,437.20,263.33,3793584.40,2284914.41,1508669.99
+Asia,Mongolia,Snacks,Offline,C,10/12/2015,698014056,11/7/2015,6726,152.58,97.44,1026253.08,655381.44,370871.64
+Sub-Saharan Africa,Democratic Republic of the Congo,Office Supplies,Offline,L,2/14/2017,255560719,3/5/2017,4951,651.21,524.96,3224140.71,2599076.96,625063.75
+Central America and the Caribbean,Panama,Clothes,Online,H,6/12/2015,230546653,6/14/2015,2733,109.28,35.84,298662.24,97950.72,200711.52
+Europe,Sweden,Meat,Online,C,1/18/2015,437083184,2/19/2015,1482,421.89,364.69,625240.98,540470.58,84770.40
+Europe,Macedonia,Vegetables,Offline,C,7/10/2017,759594142,7/12/2017,9641,154.06,90.93,1485292.46,876656.13,608636.33
+Europe,Denmark,Household,Online,L,5/16/2010,702815854,6/6/2010,7684,668.27,502.54,5134986.68,3861517.36,1273469.32
+Central America and the Caribbean,Haiti,Cereal,Offline,H,3/30/2016,741797149,5/3/2016,3116,205.70,117.11,640961.20,364914.76,276046.44
+Europe,Sweden,Snacks,Online,C,6/1/2013,971899354,6/1/2013,5471,152.58,97.44,834765.18,533094.24,301670.94
+Central America and the Caribbean,Saint Lucia,Vegetables,Online,M,4/22/2015,658796298,5/9/2015,1319,154.06,90.93,203205.14,119936.67,83268.47
+Central America and the Caribbean,Barbados,Personal Care,Online,L,9/5/2013,488474309,10/21/2013,9258,81.73,56.67,756656.34,524650.86,232005.48
+Middle East and North Africa,Jordan,Baby Food,Offline,L,9/22/2012,317232215,10/27/2012,4917,255.28,159.42,1255211.76,783868.14,471343.62
+Europe,Czech Republic,Office Supplies,Online,M,2/16/2010,521681344,4/3/2010,5957,651.21,524.96,3879257.97,3127186.72,752071.25
+Middle East and North Africa,Iran,Beverages,Online,L,12/28/2015,648745524,1/27/2016,7072,47.45,31.79,335566.40,224818.88,110747.52
+Sub-Saharan Africa,Namibia,Vegetables,Offline,C,3/11/2011,765661084,3/12/2011,4984,154.06,90.93,767835.04,453195.12,314639.92
+Sub-Saharan Africa,Guinea,Household,Online,L,10/3/2011,109976851,10/14/2011,3449,668.27,502.54,2304863.23,1733260.46,571602.77
+Europe,Iceland,Office Supplies,Offline,L,1/18/2012,239554154,2/13/2012,8253,651.21,524.96,5374436.13,4332494.88,1041941.25
+Europe,Lithuania,Office Supplies,Online,M,4/17/2011,982566821,6/5/2011,2212,651.21,524.96,1440476.52,1161211.52,279265.00
+Europe,United Kingdom,Cosmetics,Online,C,5/5/2017,887501180,6/20/2017,176,437.20,263.33,76947.20,46346.08,30601.12
+Sub-Saharan Africa,Ghana,Fruits,Online,M,8/14/2012,373156058,9/5/2012,4025,9.33,6.92,37553.25,27853.00,9700.25
+Asia,Laos,Baby Food,Online,H,11/23/2010,378642785,1/10/2011,7669,255.28,159.42,1957742.32,1222591.98,735150.34
+Sub-Saharan Africa,The Gambia,Baby Food,Online,C,8/25/2015,113385188,9/23/2015,2052,255.28,159.42,523834.56,327129.84,196704.72
+Asia,South Korea,Cosmetics,Offline,H,4/11/2016,207119596,5/16/2016,146,437.20,263.33,63831.20,38446.18,25385.02
+Central America and the Caribbean,Belize,Cereal,Offline,C,8/11/2014,459894835,9/5/2014,1957,205.70,117.11,402554.90,229184.27,173370.63
+Sub-Saharan Africa,Madagascar,Personal Care,Online,M,7/12/2013,292072236,8/1/2013,9520,81.73,56.67,778069.60,539498.40,238571.20
+Central America and the Caribbean,Jamaica,Snacks,Offline,H,3/15/2013,994325625,4/15/2013,1904,152.58,97.44,290512.32,185525.76,104986.56
+Sub-Saharan Africa,Niger,Clothes,Offline,M,11/11/2014,777641332,12/10/2014,206,109.28,35.84,22511.68,7383.04,15128.64
+Central America and the Caribbean,Grenada,Vegetables,Offline,H,1/6/2017,623318183,2/3/2017,2557,154.06,90.93,393931.42,232508.01,161423.41
+Australia and Oceania,Samoa ,Cosmetics,Online,H,9/1/2011,232967507,9/1/2011,9117,437.20,263.33,3985952.40,2400779.61,1585172.79
+Europe,Macedonia,Fruits,Online,H,10/25/2010,278513133,11/5/2010,7080,9.33,6.92,66056.40,48993.60,17062.80
+Europe,Albania,Baby Food,Offline,L,5/18/2012,152191388,6/22/2012,5669,255.28,159.42,1447182.32,903751.98,543430.34
+Middle East and North Africa,United Arab Emirates,Cosmetics,Online,H,7/22/2011,216551101,8/29/2011,1138,437.20,263.33,497533.60,299669.54,197864.06
+Asia,Brunei,Cosmetics,Offline,L,3/5/2012,454453599,4/21/2012,1774,437.20,263.33,775592.80,467147.42,308445.38
+North America,United States of America,Office Supplies,Offline,C,5/10/2015,919072711,6/7/2015,2894,651.21,524.96,1884601.74,1519234.24,365367.50
+Sub-Saharan Africa,Ghana,Cosmetics,Online,M,9/13/2015,383894765,9/23/2015,1847,437.20,263.33,807508.40,486370.51,321137.89
+Australia and Oceania,Nauru,Beverages,Online,C,8/30/2012,392718589,9/12/2012,3012,47.45,31.79,142919.40,95751.48,47167.92
+Europe,Croatia,Personal Care,Offline,C,5/5/2014,309655511,5/21/2014,2802,81.73,56.67,229007.46,158789.34,70218.12
+Europe,Luxembourg,Meat,Offline,M,12/18/2010,469129359,1/26/2011,4657,421.89,364.69,1964741.73,1698361.33,266380.40
+Sub-Saharan Africa,Democratic Republic of the Congo,Meat,Offline,H,7/14/2016,825876462,7/28/2016,4053,421.89,364.69,1709920.17,1478088.57,231831.60
+Asia,Nepal,Clothes,Offline,M,1/22/2012,504945647,2/3/2012,3493,109.28,35.84,381715.04,125189.12,256525.92
+Europe,Armenia,Snacks,Online,L,6/16/2017,951698243,7/3/2017,7514,152.58,97.44,1146486.12,732164.16,414321.96
+Europe,Malta,Snacks,Online,L,1/27/2012,981808078,1/28/2012,7683,152.58,97.44,1172272.14,748631.52,423640.62
+North America,United States of America,Fruits,Online,H,3/6/2014,831261479,3/8/2014,7599,9.33,6.92,70898.67,52585.08,18313.59
+Asia,Maldives,Snacks,Offline,C,8/7/2016,806357276,9/18/2016,7892,152.58,97.44,1204161.36,768996.48,435164.88
+Europe,Cyprus,Cereal,Online,M,3/27/2013,833706796,4/3/2013,1223,205.70,117.11,251571.10,143225.53,108345.57
+Australia and Oceania,Tonga,Meat,Offline,C,5/28/2010,910233867,6/22/2010,7283,421.89,364.69,3072624.87,2656037.27,416587.60
+Central America and the Caribbean,Trinidad and Tobago,Meat,Offline,M,6/29/2015,653174817,8/2/2015,7798,421.89,364.69,3289898.22,2843852.62,446045.60
+Europe,Croatia,Office Supplies,Online,H,6/9/2010,650078475,6/18/2010,1522,651.21,524.96,991141.62,798989.12,192152.50
+Sub-Saharan Africa,Rwanda,Office Supplies,Online,L,2/13/2016,208806169,3/29/2016,9240,651.21,524.96,6017180.40,4850630.40,1166550.00
+Europe,Sweden,Snacks,Offline,H,10/27/2012,507531726,11/11/2012,8771,152.58,97.44,1338279.18,854646.24,483632.94
+Europe,Netherlands,Personal Care,Online,C,3/10/2012,544741475,3/25/2012,9963,81.73,56.67,814275.99,564603.21,249672.78
+Middle East and North Africa,Oman,Clothes,Online,M,7/30/2015,289234244,8/24/2015,9695,109.28,35.84,1059469.60,347468.80,712000.80
+Middle East and North Africa,Turkey,Fruits,Online,C,3/31/2010,230121362,5/6/2010,6880,9.33,6.92,64190.40,47609.60,16580.80
+Europe,Italy,Baby Food,Online,H,1/15/2011,926826655,2/16/2011,7458,255.28,159.42,1903878.24,1188954.36,714923.88
+Europe,Czech Republic,Household,Online,L,2/21/2011,759086453,2/27/2011,9405,668.27,502.54,6285079.35,4726388.70,1558690.65
+Middle East and North Africa,Iraq,Cereal,Online,L,2/29/2016,876949584,4/13/2016,7725,205.70,117.11,1589032.50,904674.75,684357.75
+Australia and Oceania,New Zealand,Clothes,Offline,C,1/20/2010,250777375,3/2/2010,9453,109.28,35.84,1033023.84,338795.52,694228.32
+Asia,Indonesia,Fruits,Offline,M,12/3/2011,621243655,1/3/2012,8658,9.33,6.92,80779.14,59913.36,20865.78
+Sub-Saharan Africa,Central African Republic,Baby Food,Offline,C,8/19/2011,649334752,9/2/2011,1438,255.28,159.42,367092.64,229245.96,137846.68
+Central America and the Caribbean,Jamaica,Meat,Online,C,6/26/2011,866349494,7/22/2011,922,421.89,364.69,388982.58,336244.18,52738.40
+Europe,Germany,Baby Food,Offline,C,11/1/2014,523899209,11/16/2014,2273,255.28,159.42,580251.44,362361.66,217889.78
+Sub-Saharan Africa,Seychelles ,Clothes,Online,M,10/4/2014,743907725,10/26/2014,7682,109.28,35.84,839488.96,275322.88,564166.08
+Australia and Oceania,Solomon Islands,Snacks,Offline,M,12/13/2012,468611371,1/28/2013,1373,152.58,97.44,209492.34,133785.12,75707.22
+Australia and Oceania,Kiribati,Office Supplies,Online,H,12/23/2015,510558974,1/19/2016,4601,651.21,524.96,2996217.21,2415340.96,580876.25
+Sub-Saharan Africa,Sierra Leone,Vegetables,Online,L,4/21/2016,402611863,5/9/2016,652,154.06,90.93,100447.12,59286.36,41160.76
+Europe,Albania,Clothes,Online,M,4/7/2011,647943866,4/18/2011,9843,109.28,35.84,1075643.04,352773.12,722869.92
+Central America and the Caribbean,Belize,Fruits,Online,M,5/23/2014,470041310,6/1/2014,4524,9.33,6.92,42208.92,31306.08,10902.84
+North America,Mexico,Snacks,Offline,M,10/14/2013,962703025,10/20/2013,4073,152.58,97.44,621458.34,396873.12,224585.22
+Sub-Saharan Africa,Swaziland,Baby Food,Offline,M,10/2/2013,140040338,10/9/2013,9903,255.28,159.42,2528037.84,1578736.26,949301.58
+Sub-Saharan Africa,Botswana,Meat,Online,L,11/17/2015,586477077,11/24/2015,455,421.89,364.69,191959.95,165933.95,26026.00
+Sub-Saharan Africa,South Africa,Household,Offline,C,3/30/2015,906749570,4/12/2015,6203,668.27,502.54,4145278.81,3117255.62,1028023.19
+Sub-Saharan Africa,Nigeria,Cosmetics,Offline,L,10/10/2011,675906646,11/1/2011,4651,437.20,263.33,2033417.20,1224747.83,808669.37
+Sub-Saharan Africa,Mozambique,Cosmetics,Online,C,1/16/2014,889309632,2/26/2014,5337,437.20,263.33,2333336.40,1405392.21,927944.19
+Europe,Romania,Cereal,Offline,C,9/29/2012,812632358,10/17/2012,4828,205.70,117.11,993119.60,565407.08,427712.52
+Europe,Belarus,Cosmetics,Online,L,10/17/2014,231861150,11/1/2014,1722,437.20,263.33,752858.40,453454.26,299404.14
+Middle East and North Africa,Qatar,Office Supplies,Online,H,10/21/2016,803294837,11/20/2016,1648,651.21,524.96,1073194.08,865134.08,208060.00
+Asia,Myanmar,Baby Food,Online,L,6/18/2016,203544747,7/13/2016,2269,255.28,159.42,579230.32,361723.98,217506.34
+Asia,Kyrgyzstan,Beverages,Online,M,4/19/2016,679534709,4/20/2016,8276,47.45,31.79,392696.20,263094.04,129602.16
+Middle East and North Africa,Syria,Beverages,Online,H,5/2/2012,498501050,5/24/2012,6393,47.45,31.79,303347.85,203233.47,100114.38
+Asia,Thailand,Cereal,Online,L,1/9/2013,697992599,2/18/2013,376,205.70,117.11,77343.20,44033.36,33309.84
+Asia,Maldives,Snacks,Online,H,9/25/2012,135870683,10/15/2012,6009,152.58,97.44,916853.22,585516.96,331336.26
+Sub-Saharan Africa,Seychelles ,Cereal,Online,C,9/7/2010,440309131,9/22/2010,6111,205.70,117.11,1257032.70,715659.21,541373.49
+Asia,Turkmenistan,Vegetables,Offline,H,9/24/2014,159794270,11/6/2014,5530,154.06,90.93,851951.80,502842.90,349108.90
+Australia and Oceania,Kiribati,Cereal,Offline,M,11/12/2014,613124930,11/21/2014,6147,205.70,117.11,1264437.90,719875.17,544562.73
+Middle East and North Africa,Libya,Snacks,Offline,C,4/15/2017,939412438,5/16/2017,1871,152.58,97.44,285477.18,182310.24,103166.94
+Europe,Andorra,Snacks,Online,M,5/3/2010,348080623,5/19/2010,3646,152.58,97.44,556306.68,355266.24,201040.44
+Europe,Germany,Office Supplies,Online,L,9/11/2013,368865811,10/16/2013,4445,651.21,524.96,2894628.45,2333447.20,561181.25
+Asia,Kyrgyzstan,Beverages,Online,M,1/17/2014,801816833,3/3/2014,4274,47.45,31.79,202801.30,135870.46,66930.84
+Sub-Saharan Africa,Sudan,Cosmetics,Offline,C,4/10/2014,167295014,4/28/2014,5167,437.20,263.33,2259012.40,1360626.11,898386.29
+Sub-Saharan Africa,Comoros,Office Supplies,Offline,M,7/18/2014,655974185,7/31/2014,6193,651.21,524.96,4032943.53,3251077.28,781866.25
+Europe,Denmark,Personal Care,Online,L,2/4/2016,478840672,2/9/2016,8451,81.73,56.67,690700.23,478918.17,211782.06
+Sub-Saharan Africa,Zambia,Personal Care,Offline,M,6/5/2017,617193305,6/10/2017,69,81.73,56.67,5639.37,3910.23,1729.14
+Europe,Sweden,Cereal,Online,L,7/19/2010,772643411,8/25/2010,1210,205.70,117.11,248897.00,141703.10,107193.90
+Central America and the Caribbean,Costa Rica,Cereal,Offline,L,1/11/2015,717114818,1/25/2015,9065,205.70,117.11,1864670.50,1061602.15,803068.35
+Europe,Poland,Beverages,Online,M,8/22/2013,742843854,9/4/2013,2859,47.45,31.79,135659.55,90887.61,44771.94
+Sub-Saharan Africa,Sudan,Office Supplies,Offline,C,9/23/2016,312379348,11/11/2016,8846,651.21,524.96,5760603.66,4643796.16,1116807.50
+Europe,Serbia,Beverages,Offline,C,12/23/2012,308582627,2/9/2013,5312,47.45,31.79,252054.40,168868.48,83185.92
+Middle East and North Africa,Yemen,Beverages,Online,H,1/29/2011,784627521,2/25/2011,7574,47.45,31.79,359386.30,240777.46,118608.84
+Asia,Uzbekistan,Household,Offline,C,3/15/2013,514000356,3/30/2013,2982,668.27,502.54,1992781.14,1498574.28,494206.86
+Europe,Latvia,Personal Care,Online,L,3/29/2011,140499961,4/30/2011,5915,81.73,56.67,483432.95,335203.05,148229.90
+Middle East and North Africa,Pakistan,Household,Offline,H,4/13/2013,828237664,4/19/2013,2785,668.27,502.54,1861131.95,1399573.90,461558.05
+Middle East and North Africa,Kuwait,Fruits,Offline,C,2/15/2017,211637294,2/23/2017,7033,9.33,6.92,65617.89,48668.36,16949.53
+Sub-Saharan Africa,Lesotho,Cereal,Online,C,1/26/2014,945435178,2/15/2014,4134,205.70,117.11,850363.80,484132.74,366231.06
+Sub-Saharan Africa,Sao Tome and Principe,Vegetables,Offline,L,5/26/2015,354680144,6/8/2015,6591,154.06,90.93,1015409.46,599319.63,416089.83
+Asia,Turkmenistan,Clothes,Online,M,9/30/2010,784733521,10/21/2010,8942,109.28,35.84,977181.76,320481.28,656700.48
+Sub-Saharan Africa,Guinea-Bissau,Fruits,Offline,C,4/27/2017,151269137,5/14/2017,2754,9.33,6.92,25694.82,19057.68,6637.14
+Sub-Saharan Africa,Mali,Vegetables,Offline,L,7/13/2015,490273320,8/18/2015,1625,154.06,90.93,250347.50,147761.25,102586.25
+Central America and the Caribbean,Saint Vincent and the Grenadines,Beverages,Offline,H,5/6/2013,308044898,5/7/2013,6186,47.45,31.79,293525.70,196652.94,96872.76
+Central America and the Caribbean,Haiti,Fruits,Online,H,3/27/2012,431195199,3/27/2012,9096,9.33,6.92,84865.68,62944.32,21921.36
+Europe,Liechtenstein,Cereal,Online,M,12/13/2010,856648051,12/23/2010,50,205.70,117.11,10285.00,5855.50,4429.50
+Central America and the Caribbean,Guatemala,Household,Offline,M,11/14/2016,301639783,12/2/2016,770,668.27,502.54,514567.90,386955.80,127612.10
+Middle East and North Africa,Libya,Office Supplies,Online,C,12/11/2011,253719222,12/13/2011,11,651.21,524.96,7163.31,5774.56,1388.75
+Asia,Maldives,Meat,Online,H,1/15/2017,920747697,1/17/2017,8559,421.89,364.69,3610956.51,3121381.71,489574.80
+Europe,Slovakia,Cosmetics,Offline,H,6/13/2012,780899035,7/30/2012,4233,437.20,263.33,1850667.60,1114675.89,735991.71
+Central America and the Caribbean,Dominica,Vegetables,Offline,L,5/21/2017,632659566,6/18/2017,6880,154.06,90.93,1059932.80,625598.40,434334.40
+Australia and Oceania,Australia,Fruits,Offline,H,6/26/2010,444828116,7/21/2010,3380,9.33,6.92,31535.40,23389.60,8145.80
+Australia and Oceania,Fiji,Household,Online,M,11/16/2016,706516015,12/19/2016,2644,668.27,502.54,1766905.88,1328715.76,438190.12
+Europe,Monaco,Meat,Offline,L,7/15/2013,177147090,8/17/2013,615,421.89,364.69,259462.35,224284.35,35178.00
+Middle East and North Africa,Azerbaijan,Meat,Offline,C,5/14/2016,836457669,6/3/2016,5267,421.89,364.69,2222094.63,1920822.23,301272.40
+Middle East and North Africa,Libya,Meat,Online,C,11/1/2015,234496581,11/29/2015,1604,421.89,364.69,676711.56,584962.76,91748.80
+Central America and the Caribbean,Costa Rica,Beverages,Online,C,1/14/2011,941625154,1/15/2011,6663,47.45,31.79,316159.35,211816.77,104342.58
+Central America and the Caribbean,Trinidad and Tobago,Office Supplies,Online,M,7/2/2013,198517215,7/30/2013,4510,651.21,524.96,2936957.10,2367569.60,569387.50
+Sub-Saharan Africa,Cote d'Ivoire,Office Supplies,Offline,C,2/6/2013,266159093,2/10/2013,1245,651.21,524.96,810756.45,653575.20,157181.25
+Europe,Portugal,Office Supplies,Offline,C,2/17/2012,775849616,3/5/2012,9997,651.21,524.96,6510146.37,5248025.12,1262121.25
+Europe,Macedonia,Meat,Online,C,12/14/2013,979200112,12/30/2013,5928,421.89,364.69,2500963.92,2161882.32,339081.60
+North America,United States of America,Cosmetics,Online,L,8/20/2011,198134410,9/29/2011,1230,437.20,263.33,537756.00,323895.90,213860.10
+Sub-Saharan Africa,Central African Republic,Vegetables,Online,C,6/14/2014,974888837,7/22/2014,126,154.06,90.93,19411.56,11457.18,7954.38
+Asia,Nepal,Cosmetics,Offline,L,10/24/2013,522012221,10/25/2013,3871,437.20,263.33,1692401.20,1019350.43,673050.77
+Sub-Saharan Africa,Sierra Leone,Household,Online,M,5/6/2017,172365891,6/9/2017,5752,668.27,502.54,3843889.04,2890610.08,953278.96
+Europe,Vatican City,Snacks,Offline,M,10/18/2014,429123675,11/11/2014,6086,152.58,97.44,928601.88,593019.84,335582.04
+Europe,San Marino,Vegetables,Offline,L,2/19/2012,515771901,3/19/2012,7222,154.06,90.93,1112621.32,656696.46,455924.86
+Europe,Ukraine,Cereal,Online,C,8/7/2012,626109397,9/15/2012,8539,205.70,117.11,1756472.30,1000002.29,756470.01
+Europe,Czech Republic,Household,Offline,H,12/5/2012,574247491,12/17/2012,1448,668.27,502.54,967654.96,727677.92,239977.04
+Australia and Oceania,Tuvalu,Clothes,Online,C,9/16/2014,244610011,10/27/2014,4393,109.28,35.84,480067.04,157445.12,322621.92
+Europe,Russia,Snacks,Online,M,1/5/2013,941933286,2/8/2013,7846,152.58,97.44,1197142.68,764514.24,432628.44
+Asia,Thailand,Vegetables,Online,L,5/9/2015,441266143,6/16/2015,9312,154.06,90.93,1434606.72,846740.16,587866.56
+Middle East and North Africa,Libya,Household,Offline,M,2/21/2015,637969911,3/2/2015,8329,668.27,502.54,5566020.83,4185655.66,1380365.17
+Europe,France,Cereal,Offline,L,8/28/2010,797718417,10/15/2010,1462,205.70,117.11,300733.40,171214.82,129518.58
+Asia,Myanmar,Snacks,Online,H,5/19/2016,706497991,5/31/2016,7310,152.58,97.44,1115359.80,712286.40,403073.40
+Europe,Estonia,Cereal,Online,C,10/14/2013,220607459,10/17/2013,1504,205.70,117.11,309372.80,176133.44,133239.36
+Sub-Saharan Africa,Zambia,Snacks,Offline,H,9/13/2015,616658151,10/16/2015,1705,152.58,97.44,260148.90,166135.20,94013.70
+Asia,Brunei,Cereal,Offline,M,1/29/2017,541573894,1/30/2017,2605,205.70,117.11,535848.50,305071.55,230776.95
+Sub-Saharan Africa,Djibouti,Clothes,Offline,C,12/14/2013,962591016,1/5/2014,927,109.28,35.84,101302.56,33223.68,68078.88
+North America,United States of America,Household,Online,H,10/7/2014,217258346,11/23/2014,427,668.27,502.54,285351.29,214584.58,70766.71
+Sub-Saharan Africa,Rwanda,Meat,Online,M,11/22/2013,763437211,1/3/2014,6891,421.89,364.69,2907243.99,2513078.79,394165.20
+Europe,Ireland,Baby Food,Offline,L,7/19/2010,629301440,7/29/2010,3135,255.28,159.42,800302.80,499781.70,300521.10
+Sub-Saharan Africa,Mali,Household,Offline,L,8/3/2012,163337361,8/22/2012,4010,668.27,502.54,2679762.70,2015185.40,664577.30
+Middle East and North Africa,Iran,Cosmetics,Offline,L,1/4/2010,684343802,1/28/2010,1394,437.20,263.33,609456.80,367082.02,242374.78
+Europe,Macedonia,Clothes,Offline,H,8/1/2016,431432092,9/13/2016,9198,109.28,35.84,1005157.44,329656.32,675501.12
+Sub-Saharan Africa,Seychelles ,Baby Food,Online,M,1/25/2013,414026057,2/26/2013,8366,255.28,159.42,2135672.48,1333707.72,801964.76
+Sub-Saharan Africa,Cote d'Ivoire,Beverages,Offline,M,8/2/2011,361862027,8/14/2011,1870,47.45,31.79,88731.50,59447.30,29284.20
+Central America and the Caribbean,Haiti,Beverages,Online,H,12/14/2013,974988830,1/26/2014,9716,47.45,31.79,461024.20,308871.64,152152.56
+Asia,India,Beverages,Online,M,6/29/2015,773767793,8/12/2015,3940,47.45,31.79,186953.00,125252.60,61700.40
+Sub-Saharan Africa,Seychelles ,Fruits,Online,H,5/12/2016,148872745,6/6/2016,3608,9.33,6.92,33662.64,24967.36,8695.28
+Sub-Saharan Africa,Swaziland,Personal Care,Online,M,3/24/2010,911290013,4/3/2010,9821,81.73,56.67,802670.33,556556.07,246114.26
+Europe,Andorra,Baby Food,Online,H,9/27/2010,442318427,10/8/2010,707,255.28,159.42,180482.96,112709.94,67773.02
+Asia,Nepal,Fruits,Online,M,6/23/2017,243569314,6/25/2017,6428,9.33,6.92,59973.24,44481.76,15491.48
+Sub-Saharan Africa,Liberia,Baby Food,Offline,M,2/22/2012,986966502,4/9/2012,4175,255.28,159.42,1065794.00,665578.50,400215.50
+Sub-Saharan Africa,Chad,Baby Food,Offline,M,5/18/2015,264746320,6/6/2015,3174,255.28,159.42,810258.72,505999.08,304259.64
+Central America and the Caribbean,Belize,Snacks,Online,H,10/21/2014,239457595,11/27/2014,9678,152.58,97.44,1476669.24,943024.32,533644.92
+Asia,Brunei,Snacks,Offline,H,4/4/2014,893961656,5/1/2014,1975,152.58,97.44,301345.50,192444.00,108901.50
+Asia,North Korea,Personal Care,Online,L,11/6/2014,481432330,11/9/2014,5380,81.73,56.67,439707.40,304884.60,134822.80
+Central America and the Caribbean,Cuba,Vegetables,Offline,L,3/8/2011,475355947,4/26/2011,7243,154.06,90.93,1115856.58,658605.99,457250.59
+Sub-Saharan Africa,Togo,Office Supplies,Offline,C,4/17/2010,619531333,5/16/2010,1944,651.21,524.96,1265952.24,1020522.24,245430.00
+Middle East and North Africa,Kuwait,Beverages,Offline,M,9/10/2012,278069818,10/5/2012,5893,47.45,31.79,279622.85,187338.47,92284.38
+Asia,Kazakhstan,Cereal,Offline,L,3/11/2016,685395228,3/17/2016,2534,205.70,117.11,521243.80,296756.74,224487.06
+Australia and Oceania,Australia,Snacks,Online,H,1/29/2012,896243894,2/3/2012,7340,152.58,97.44,1119937.20,715209.60,404727.60
+Sub-Saharan Africa,Benin,Cosmetics,Online,M,8/21/2011,935664641,10/4/2011,2815,437.20,263.33,1230718.00,741273.95,489444.05
+Asia,Kazakhstan,Snacks,Online,M,1/31/2012,449018800,2/4/2012,3496,152.58,97.44,533419.68,340650.24,192769.44
+Middle East and North Africa,Jordan,Snacks,Offline,M,6/21/2015,951980197,7/1/2015,950,152.58,97.44,144951.00,92568.00,52383.00
+Asia,Turkmenistan,Household,Offline,C,5/9/2017,880535161,6/25/2017,8776,668.27,502.54,5864737.52,4410291.04,1454446.48
+Europe,Austria,Cosmetics,Offline,L,7/24/2010,540982520,9/1/2010,7604,437.20,263.33,3324468.80,2002361.32,1322107.48
+Australia and Oceania,Papua New Guinea,Household,Online,M,9/16/2011,759933602,10/9/2011,95,668.27,502.54,63485.65,47741.30,15744.35
+Sub-Saharan Africa,Sudan,Beverages,Offline,H,12/20/2011,634312236,1/13/2012,5941,47.45,31.79,281900.45,188864.39,93036.06
+Central America and the Caribbean,Honduras,Cereal,Offline,L,2/25/2011,681354749,3/29/2011,6866,205.70,117.11,1412336.20,804077.26,608258.94
+Middle East and North Africa,Azerbaijan,Household,Offline,C,12/3/2013,588609969,12/26/2013,1625,668.27,502.54,1085938.75,816627.50,269311.25
+Europe,Iceland,Clothes,Offline,C,11/11/2010,563939225,12/19/2010,1004,109.28,35.84,109717.12,35983.36,73733.76
+North America,Greenland,Household,Online,L,7/20/2012,885516345,7/25/2012,2819,668.27,502.54,1883853.13,1416660.26,467192.87
+Sub-Saharan Africa,Liberia,Vegetables,Offline,C,6/26/2015,551827657,7/13/2015,6921,154.06,90.93,1066249.26,629326.53,436922.73
+Sub-Saharan Africa,Cameroon,Beverages,Offline,H,6/10/2013,431671988,6/14/2013,189,47.45,31.79,8968.05,6008.31,2959.74
+Sub-Saharan Africa,Benin,Cosmetics,Online,H,5/29/2016,114160668,6/6/2016,1534,437.20,263.33,670664.80,403948.22,266716.58
+North America,United States of America,Cosmetics,Offline,H,7/4/2016,158717525,7/17/2016,6897,437.20,263.33,3015368.40,1816187.01,1199181.39
+Asia,South Korea,Personal Care,Offline,M,6/29/2014,745078885,7/11/2014,4254,81.73,56.67,347679.42,241074.18,106605.24
+Europe,Austria,Cereal,Online,H,12/24/2015,323293578,2/2/2016,8609,205.70,117.11,1770871.30,1008199.99,762671.31
+Middle East and North Africa,Turkey,Fruits,Online,M,6/28/2012,563722932,8/9/2012,6998,9.33,6.92,65291.34,48426.16,16865.18
+Europe,Estonia,Snacks,Online,L,7/22/2015,507040774,7/25/2015,3488,152.58,97.44,532199.04,339870.72,192328.32
+Sub-Saharan Africa,Mauritania,Cereal,Offline,H,1/16/2015,614233434,2/8/2015,4178,205.70,117.11,859414.60,489285.58,370129.02
+Europe,Greece,Office Supplies,Offline,M,4/2/2013,516599738,5/9/2013,2197,651.21,524.96,1430708.37,1153337.12,277371.25
+North America,Greenland,Fruits,Online,M,7/17/2013,365751016,8/31/2013,2708,9.33,6.92,25265.64,18739.36,6526.28
+Europe,Belarus,Clothes,Online,H,7/22/2016,383611094,8/26/2016,7902,109.28,35.84,863530.56,283207.68,580322.88
+Europe,San Marino,Baby Food,Offline,M,6/3/2016,412416303,6/11/2016,2004,255.28,159.42,511581.12,319477.68,192103.44
+Europe,Croatia,Cosmetics,Offline,M,2/15/2012,364715468,2/19/2012,6267,437.20,263.33,2739932.40,1650289.11,1089643.29
+Australia and Oceania,East Timor,Fruits,Offline,M,4/15/2011,673369920,5/12/2011,3978,9.33,6.92,37114.74,27527.76,9586.98
+Sub-Saharan Africa,Nigeria,Cosmetics,Offline,L,3/25/2011,941553485,4/9/2011,5454,437.20,263.33,2384488.80,1436201.82,948286.98
+Europe,Netherlands,Personal Care,Offline,H,5/8/2010,392752492,6/3/2010,3045,81.73,56.67,248867.85,172560.15,76307.70
+North America,United States of America,Personal Care,Offline,L,11/21/2011,120765769,1/10/2012,6130,81.73,56.67,501004.90,347387.10,153617.80
+Sub-Saharan Africa,Namibia,Meat,Offline,H,7/30/2012,839704644,9/13/2012,6119,421.89,364.69,2581544.91,2231538.11,350006.80
+Europe,Hungary,Fruits,Offline,H,1/4/2014,633992946,1/6/2014,1456,9.33,6.92,13584.48,10075.52,3508.96
+Asia,Turkmenistan,Cosmetics,Online,H,4/5/2011,808367002,5/8/2011,2614,437.20,263.33,1142840.80,688344.62,454496.18
+Europe,San Marino,Clothes,Online,C,10/30/2011,937875640,11/30/2011,7098,109.28,35.84,775669.44,254392.32,521277.12
+Central America and the Caribbean,Saint Vincent and the Grenadines,Vegetables,Offline,C,9/18/2016,217880189,9/23/2016,4445,154.06,90.93,684796.70,404183.85,280612.85
+Europe,Belarus,Vegetables,Online,C,8/12/2016,614054477,8/16/2016,1220,154.06,90.93,187953.20,110934.60,77018.60
+Australia and Oceania,Marshall Islands,Clothes,Offline,L,11/14/2010,112384831,12/23/2010,6024,109.28,35.84,658302.72,215900.16,442402.56
+Europe,Sweden,Baby Food,Offline,H,3/29/2011,369170081,4/3/2011,4486,255.28,159.42,1145186.08,715158.12,430027.96
+Sub-Saharan Africa,Madagascar,Snacks,Offline,C,5/30/2015,861021554,6/18/2015,4266,152.58,97.44,650906.28,415679.04,235227.24
+Asia,China,Meat,Online,L,10/5/2010,234863078,11/3/2010,59,421.89,364.69,24891.51,21516.71,3374.80
+Europe,Albania,Clothes,Offline,C,1/16/2016,357930982,3/5/2016,8586,109.28,35.84,938278.08,307722.24,630555.84
+Asia,Indonesia,Office Supplies,Offline,L,12/25/2016,467774093,1/26/2017,3604,651.21,524.96,2346960.84,1891955.84,455005.00
+Sub-Saharan Africa,Botswana,Vegetables,Offline,L,7/11/2015,322253739,8/22/2015,898,154.06,90.93,138345.88,81655.14,56690.74
+Australia and Oceania,New Zealand,Cereal,Online,L,11/19/2010,649543750,12/22/2010,3285,205.70,117.11,675724.50,384706.35,291018.15
+North America,Mexico,Fruits,Online,M,12/4/2010,898130452,12/27/2010,5614,9.33,6.92,52378.62,38848.88,13529.74
+Europe,Russia,Office Supplies,Offline,M,3/15/2013,586812674,3/31/2013,9766,651.21,524.96,6359716.86,5126759.36,1232957.50
+Sub-Saharan Africa,Cameroon,Beverages,Online,L,5/8/2016,654701745,6/9/2016,9650,47.45,31.79,457892.50,306773.50,151119.00
+Europe,Sweden,Fruits,Online,L,4/11/2016,311221492,5/7/2016,6210,9.33,6.92,57939.30,42973.20,14966.10
+Middle East and North Africa,Algeria,Meat,Offline,L,7/9/2017,186108243,7/27/2017,2420,421.89,364.69,1020973.80,882549.80,138424.00
+Middle East and North Africa,Qatar,Cereal,Offline,H,5/3/2014,979410827,5/21/2014,8283,205.70,117.11,1703813.10,970022.13,733790.97
+Middle East and North Africa,Somalia,Beverages,Online,L,3/7/2017,311490571,4/23/2017,5837,47.45,31.79,276965.65,185558.23,91407.42
+Asia,Malaysia,Fruits,Online,H,1/29/2011,373021304,2/12/2011,4148,9.33,6.92,38700.84,28704.16,9996.68
+Europe,Sweden,Snacks,Online,M,5/28/2012,274989354,7/10/2012,4316,152.58,97.44,658535.28,420551.04,237984.24
+Sub-Saharan Africa,Comoros,Household,Offline,M,2/5/2012,998693549,3/21/2012,4469,668.27,502.54,2986498.63,2245851.26,740647.37
+Sub-Saharan Africa,Ethiopia,Meat,Online,L,4/20/2017,445745217,6/4/2017,4770,421.89,364.69,2012415.30,1739571.30,272844.00
+Asia,Laos,Fruits,Online,L,4/20/2017,188068187,4/25/2017,2411,9.33,6.92,22494.63,16684.12,5810.51
+Asia,Brunei,Fruits,Online,C,1/5/2010,517898786,1/9/2010,6614,9.33,6.92,61708.62,45768.88,15939.74
+Europe,Cyprus,Office Supplies,Offline,L,5/8/2013,897785842,5/12/2013,3636,651.21,524.96,2367799.56,1908754.56,459045.00
+Central America and the Caribbean,Guatemala,Beverages,Online,C,1/3/2016,410590684,2/6/2016,1762,47.45,31.79,83606.90,56013.98,27592.92
+Sub-Saharan Africa,Tanzania,Meat,Online,L,7/8/2011,909487140,7/17/2011,6310,421.89,364.69,2662125.90,2301193.90,360932.00
+Asia,Mongolia,Cosmetics,Online,C,3/17/2017,267961537,3/26/2017,4628,437.20,263.33,2023361.60,1218691.24,804670.36
+Europe,Romania,Meat,Online,H,5/22/2017,929812705,5/25/2017,1097,421.89,364.69,462813.33,400064.93,62748.40
+Middle East and North Africa,Saudi Arabia,Office Supplies,Online,H,7/31/2012,459151971,8/21/2012,2126,651.21,524.96,1384472.46,1116064.96,268407.50
+Australia and Oceania,New Zealand,Cosmetics,Offline,L,9/25/2015,990403163,10/27/2015,1160,437.20,263.33,507152.00,305462.80,201689.20
+Asia,Sri Lanka,Clothes,Online,L,7/23/2010,678302609,8/10/2010,3670,109.28,35.84,401057.60,131532.80,269524.80
+Central America and the Caribbean,Antigua and Barbuda ,Cosmetics,Online,H,12/4/2015,447899138,12/5/2015,2163,437.20,263.33,945663.60,569582.79,376080.81
+Asia,China,Cereal,Online,C,11/22/2013,844554078,12/6/2013,1174,205.70,117.11,241491.80,137487.14,104004.66
+Sub-Saharan Africa,Benin,Personal Care,Offline,H,2/3/2014,683941256,3/6/2014,2271,81.73,56.67,185608.83,128697.57,56911.26
+Europe,Ukraine,Cosmetics,Online,H,1/29/2012,202047002,3/6/2012,9053,437.20,263.33,3957971.60,2383926.49,1574045.11
+Australia and Oceania,Tonga,Personal Care,Offline,L,10/28/2015,605170142,11/1/2015,2148,81.73,56.67,175556.04,121727.16,53828.88
+Europe,Kosovo,Fruits,Online,L,8/27/2011,919922006,9/18/2011,4219,9.33,6.92,39363.27,29195.48,10167.79
+Europe,Moldova ,Beverages,Offline,H,6/17/2013,243226420,7/3/2013,4958,47.45,31.79,235257.10,157614.82,77642.28
+Sub-Saharan Africa,Cape Verde,Household,Offline,M,6/24/2013,892319715,7/17/2013,6088,668.27,502.54,4068427.76,3059463.52,1008964.24
+Middle East and North Africa,Iran,Baby Food,Online,H,5/17/2016,754750716,6/8/2016,6364,255.28,159.42,1624601.92,1014548.88,610053.04
+Sub-Saharan Africa,Equatorial Guinea,Cosmetics,Online,C,9/24/2012,938380753,9/26/2012,6573,437.20,263.33,2873715.60,1730868.09,1142847.51
+Central America and the Caribbean,Saint Lucia,Vegetables,Online,M,2/14/2013,821383655,3/29/2013,4531,154.06,90.93,698045.86,412003.83,286042.03
+Asia,Kyrgyzstan,Office Supplies,Online,M,1/20/2014,302245748,2/25/2014,88,651.21,524.96,57306.48,46196.48,11110.00
+Europe,United Kingdom,Clothes,Online,M,11/13/2016,249765861,11/24/2016,123,109.28,35.84,13441.44,4408.32,9033.12
+Europe,Romania,Beverages,Online,H,5/31/2016,253055322,6/12/2016,3548,47.45,31.79,168352.60,112790.92,55561.68
+Sub-Saharan Africa,Cote d'Ivoire,Cereal,Online,H,5/18/2012,871537959,6/8/2012,6304,205.70,117.11,1296732.80,738261.44,558471.36
+Asia,Brunei,Clothes,Online,H,2/3/2013,484950101,3/7/2013,6366,109.28,35.84,695676.48,228157.44,467519.04
+Europe,Montenegro,Beverages,Offline,C,8/6/2016,243340575,9/4/2016,8739,47.45,31.79,414665.55,277812.81,136852.74
+Australia and Oceania,Vanuatu,Snacks,Online,H,6/2/2014,917070710,6/11/2014,457,152.58,97.44,69729.06,44530.08,25198.98
+Asia,Maldives,Office Supplies,Online,M,7/5/2010,646814334,7/11/2010,5590,651.21,524.96,3640263.90,2934526.40,705737.50
+Australia and Oceania,Palau,Snacks,Online,C,6/16/2017,793557775,7/6/2017,235,152.58,97.44,35856.30,22898.40,12957.90
+Europe,Czech Republic,Household,Offline,H,11/6/2014,988599860,12/11/2014,7522,668.27,502.54,5026726.94,3780105.88,1246621.06
+Sub-Saharan Africa,Democratic Republic of the Congo,Cereal,Online,H,8/10/2013,483551919,8/11/2013,2613,205.70,117.11,537494.10,306008.43,231485.67
+Asia,Singapore,Meat,Online,H,5/19/2014,400337779,5/27/2014,7700,421.89,364.69,3248553.00,2808113.00,440440.00
+Europe,Cyprus,Snacks,Online,M,4/18/2011,581193768,4/24/2011,7006,152.58,97.44,1068975.48,682664.64,386310.84
+Central America and the Caribbean,Dominican Republic,Office Supplies,Online,L,11/28/2010,938668715,1/3/2011,1787,651.21,524.96,1163712.27,938103.52,225608.75
+Asia,South Korea,Beverages,Online,L,4/9/2013,105623948,5/27/2013,5328,47.45,31.79,252813.60,169377.12,83436.48
+Middle East and North Africa,Morocco,Personal Care,Online,H,9/16/2015,385233294,10/21/2015,7947,81.73,56.67,649508.31,450356.49,199151.82
+Europe,Serbia,Cereal,Offline,C,8/11/2016,100983083,8/11/2016,1993,205.70,117.11,409960.10,233400.23,176559.87
+Central America and the Caribbean,Saint Lucia,Cosmetics,Offline,L,8/25/2011,346672141,10/3/2011,6845,437.20,263.33,2992634.00,1802493.85,1190140.15
+Europe,Latvia,Personal Care,Offline,L,9/13/2012,936411798,9/17/2012,3915,81.73,56.67,319972.95,221863.05,98109.90
+Sub-Saharan Africa,Mauritania,Beverages,Offline,H,10/14/2013,854625880,11/26/2013,1644,47.45,31.79,78007.80,52262.76,25745.04
+Sub-Saharan Africa,Senegal,Household,Online,M,7/20/2017,506050717,7/30/2017,508,668.27,502.54,339481.16,255290.32,84190.84
+Sub-Saharan Africa,Swaziland,Vegetables,Online,M,5/8/2016,365735137,5/11/2016,8009,154.06,90.93,1233866.54,728258.37,505608.17
+Middle East and North Africa,Azerbaijan,Cosmetics,Offline,H,3/10/2011,529040467,4/10/2011,3686,437.20,263.33,1611519.20,970634.38,640884.82
+Europe,Bosnia and Herzegovina,Household,Offline,M,6/22/2015,261640536,8/1/2015,4104,668.27,502.54,2742580.08,2062424.16,680155.92
+Sub-Saharan Africa,Senegal,Snacks,Online,L,5/27/2013,249521672,7/8/2013,7863,152.58,97.44,1199736.54,766170.72,433565.82
+Sub-Saharan Africa,Djibouti,Baby Food,Offline,L,9/27/2016,348982703,11/2/2016,592,255.28,159.42,151125.76,94376.64,56749.12
+Sub-Saharan Africa,Ethiopia,Baby Food,Online,C,8/4/2015,936634957,9/6/2015,9953,255.28,159.42,2540801.84,1586707.26,954094.58
+Asia,Philippines,Cereal,Offline,M,6/27/2012,659402263,8/1/2012,638,205.70,117.11,131236.60,74716.18,56520.42
+Sub-Saharan Africa,Sudan,Beverages,Online,H,1/13/2011,484520947,1/17/2011,9370,47.45,31.79,444606.50,297872.30,146734.20
+Central America and the Caribbean,Cuba,Office Supplies,Offline,L,2/6/2012,549539840,3/22/2012,9905,651.21,524.96,6450235.05,5199728.80,1250506.25
+Central America and the Caribbean,Barbados,Vegetables,Offline,M,1/21/2010,612320268,2/10/2010,8029,154.06,90.93,1236947.74,730076.97,506870.77
+Central America and the Caribbean,Grenada,Vegetables,Online,H,9/12/2011,501036059,10/17/2011,6559,154.06,90.93,1010479.54,596409.87,414069.67
+Europe,Finland,Baby Food,Offline,L,4/21/2017,564173543,4/26/2017,343,255.28,159.42,87561.04,54681.06,32879.98
+Sub-Saharan Africa,Niger,Snacks,Offline,M,11/13/2016,320531547,12/21/2016,1262,152.58,97.44,192555.96,122969.28,69586.68
+Asia,Cambodia,Fruits,Online,M,8/4/2016,709221398,9/23/2016,3227,9.33,6.92,30107.91,22330.84,7777.07
+Middle East and North Africa,Morocco,Clothes,Offline,M,5/20/2012,939666926,7/7/2012,7180,109.28,35.84,784630.40,257331.20,527299.20
+Central America and the Caribbean,Saint Kitts and Nevis ,Vegetables,Online,H,5/10/2016,741604459,5/12/2016,6094,154.06,90.93,938841.64,554127.42,384714.22
+Sub-Saharan Africa,Zambia,Meat,Offline,L,3/11/2015,815082824,4/2/2015,9975,421.89,364.69,4208352.75,3637782.75,570570.00
+Europe,Ukraine,Cereal,Offline,C,10/10/2011,580463349,11/8/2011,859,205.70,117.11,176696.30,100597.49,76098.81
+Europe,France,Office Supplies,Offline,M,11/4/2013,428419864,12/5/2013,7813,651.21,524.96,5087903.73,4101512.48,986391.25
+Middle East and North Africa,Jordan,Cosmetics,Online,L,1/21/2015,369938695,1/24/2015,1936,437.20,263.33,846419.20,509806.88,336612.32
+Middle East and North Africa,Libya,Meat,Offline,L,12/5/2013,486318671,12/11/2013,1357,421.89,364.69,572504.73,494884.33,77620.40
+Europe,Portugal,Baby Food,Offline,C,1/11/2010,479171121,1/27/2010,6238,255.28,159.42,1592436.64,994461.96,597974.68
+Europe,Lithuania,Personal Care,Online,H,5/13/2015,120419871,6/26/2015,3771,81.73,56.67,308203.83,213702.57,94501.26
+Europe,Italy,Clothes,Offline,M,9/11/2012,602301251,9/27/2012,3180,109.28,35.84,347510.40,113971.20,233539.20
+Asia,Turkmenistan,Cosmetics,Online,M,5/16/2012,487364089,7/4/2012,719,437.20,263.33,314346.80,189334.27,125012.53
+Middle East and North Africa,Yemen,Fruits,Online,C,8/28/2010,658469712,9/16/2010,4675,9.33,6.92,43617.75,32351.00,11266.75
+Sub-Saharan Africa,Malawi,Meat,Online,C,3/26/2016,268791949,5/8/2016,366,421.89,364.69,154411.74,133476.54,20935.20
+Central America and the Caribbean,Saint Lucia,Fruits,Online,M,2/18/2016,791817128,4/8/2016,5139,9.33,6.92,47946.87,35561.88,12384.99
+Asia,Nepal,Household,Offline,H,5/21/2017,171344077,5/27/2017,3375,668.27,502.54,2255411.25,1696072.50,559338.75
+Europe,Denmark,Baby Food,Online,M,12/9/2012,471484124,1/24/2013,1485,255.28,159.42,379090.80,236738.70,142352.10
+Australia and Oceania,Fiji,Office Supplies,Offline,H,9/29/2015,226661098,11/4/2015,2911,651.21,524.96,1895672.31,1528158.56,367513.75
+Europe,Hungary,Snacks,Offline,M,2/1/2017,291611325,2/10/2017,3126,152.58,97.44,476965.08,304597.44,172367.64
+Europe,Slovenia,Vegetables,Offline,M,2/10/2013,691383635,3/19/2013,4637,154.06,90.93,714376.22,421642.41,292733.81
+Asia,Kyrgyzstan,Personal Care,Offline,M,3/4/2016,171339356,3/7/2016,1978,81.73,56.67,161661.94,112093.26,49568.68
+Middle East and North Africa,Libya,Personal Care,Offline,M,3/9/2013,247152316,4/9/2013,6717,81.73,56.67,548980.41,380652.39,168328.02
+Australia and Oceania,Palau,Snacks,Online,L,11/6/2014,254808843,11/10/2014,2454,152.58,97.44,374431.32,239117.76,135313.56
+Sub-Saharan Africa,Ethiopia,Cosmetics,Offline,L,12/27/2013,500607764,2/14/2014,9817,437.20,263.33,4291992.40,2585110.61,1706881.79
+Sub-Saharan Africa,South Africa,Cereal,Online,M,1/27/2012,911160409,1/27/2012,1468,205.70,117.11,301967.60,171917.48,130050.12
+Asia,Indonesia,Cereal,Online,M,6/4/2015,583390605,7/10/2015,7099,205.70,117.11,1460264.30,831363.89,628900.41
+Sub-Saharan Africa,Niger,Office Supplies,Offline,M,4/12/2016,934534680,5/25/2016,8434,651.21,524.96,5492305.14,4427512.64,1064792.50
+Middle East and North Africa,Tunisia ,Personal Care,Offline,C,9/24/2011,752141463,11/12/2011,4228,81.73,56.67,345554.44,239600.76,105953.68
+Middle East and North Africa,Azerbaijan,Clothes,Online,H,1/27/2015,244072282,3/13/2015,5267,109.28,35.84,575577.76,188769.28,386808.48
+Sub-Saharan Africa,Mauritius ,Cosmetics,Online,M,3/4/2014,588500964,3/12/2014,9368,437.20,263.33,4095689.60,2466875.44,1628814.16
+Europe,Kosovo,Snacks,Online,H,2/5/2013,783913838,3/9/2013,6380,152.58,97.44,973460.40,621667.20,351793.20
+Europe,Macedonia,Clothes,Online,C,3/14/2013,799109733,4/29/2013,3183,109.28,35.84,347838.24,114078.72,233759.52
+Europe,Denmark,Beverages,Online,L,11/21/2016,223199975,1/4/2017,8687,47.45,31.79,412198.15,276159.73,136038.42
+Australia and Oceania,Papua New Guinea,Cosmetics,Offline,M,4/17/2016,515608394,4/23/2016,8836,437.20,263.33,3863099.20,2326783.88,1536315.32
+Asia,Indonesia,Cosmetics,Offline,M,3/1/2012,956071317,3/31/2012,1603,437.20,263.33,700831.60,422117.99,278713.61
+Central America and the Caribbean,Saint Lucia,Snacks,Offline,C,2/12/2010,894637572,4/1/2010,1993,152.58,97.44,304091.94,194197.92,109894.02
+Sub-Saharan Africa,Malawi,Personal Care,Online,C,10/26/2016,201668488,10/31/2016,7042,81.73,56.67,575542.66,399070.14,176472.52
+Sub-Saharan Africa,Sudan,Cosmetics,Online,M,7/5/2013,617837893,8/12/2013,817,437.20,263.33,357192.40,215140.61,142051.79
+Middle East and North Africa,Iraq,Snacks,Online,C,10/10/2012,804132115,11/24/2012,9417,152.58,97.44,1436845.86,917592.48,519253.38
+Europe,Georgia,Cereal,Offline,H,11/30/2016,391849982,12/11/2016,5972,205.70,117.11,1228440.40,699380.92,529059.48
+Australia and Oceania,Papua New Guinea,Cosmetics,Online,H,2/22/2014,432602822,3/31/2014,5643,437.20,263.33,2467119.60,1485971.19,981148.41
+Australia and Oceania,Solomon Islands,Meat,Online,H,9/4/2012,248314464,9/14/2012,623,421.89,364.69,262837.47,227201.87,35635.60
+Middle East and North Africa,Pakistan,Beverages,Online,L,3/19/2014,581221234,4/21/2014,5134,47.45,31.79,243608.30,163209.86,80398.44
+Australia and Oceania,Kiribati,Clothes,Online,H,3/2/2010,443871963,4/16/2010,432,109.28,35.84,47208.96,15482.88,31726.08
+Middle East and North Africa,Somalia,Snacks,Offline,M,9/25/2015,269127976,11/11/2015,9804,152.58,97.44,1495894.32,955301.76,540592.56
+Central America and the Caribbean,Trinidad and Tobago,Fruits,Online,H,2/1/2013,560163104,3/5/2013,3565,9.33,6.92,33261.45,24669.80,8591.65
+Central America and the Caribbean,Costa Rica,Household,Offline,H,10/10/2015,540463674,10/14/2015,4066,668.27,502.54,2717185.82,2043327.64,673858.18
+Sub-Saharan Africa,Mali,Baby Food,Online,H,11/19/2011,403828513,11/25/2011,686,255.28,159.42,175122.08,109362.12,65759.96
+Asia,India,Snacks,Online,M,4/19/2013,864368951,6/2/2013,4836,152.58,97.44,737876.88,471219.84,266657.04
+Europe,Croatia,Clothes,Online,H,1/13/2014,906508815,1/23/2014,4958,109.28,35.84,541810.24,177694.72,364115.52
+Central America and the Caribbean,Saint Lucia,Vegetables,Online,C,9/28/2016,934984433,10/13/2016,1526,154.06,90.93,235095.56,138759.18,96336.38
+Europe,Greece,Cereal,Offline,M,10/10/2013,524844634,10/13/2013,2045,205.70,117.11,420656.50,239489.95,181166.55
+Sub-Saharan Africa,Djibouti,Fruits,Offline,M,9/15/2013,671450746,10/18/2013,6052,9.33,6.92,56465.16,41879.84,14585.32
+Europe,Iceland,Fruits,Online,H,10/21/2014,640476596,10/24/2014,112,9.33,6.92,1044.96,775.04,269.92
+Sub-Saharan Africa,Niger,Cosmetics,Online,H,5/30/2016,217908513,6/23/2016,2826,437.20,263.33,1235527.20,744170.58,491356.62
+Asia,China,Fruits,Online,L,2/20/2015,160045325,4/5/2015,9823,9.33,6.92,91648.59,67975.16,23673.43
+Sub-Saharan Africa,The Gambia,Office Supplies,Offline,M,3/31/2016,843498361,4/25/2016,8764,651.21,524.96,5707204.44,4600749.44,1106455.00
+Middle East and North Africa,Saudi Arabia,Snacks,Online,M,9/9/2014,915191447,9/27/2014,4342,152.58,97.44,662502.36,423084.48,239417.88
+Central America and the Caribbean,Antigua and Barbuda ,Fruits,Online,C,1/26/2014,442360913,3/5/2014,3279,9.33,6.92,30593.07,22690.68,7902.39
+Middle East and North Africa,Israel,Personal Care,Online,C,4/6/2015,462555587,5/12/2015,9332,81.73,56.67,762704.36,528844.44,233859.92
+Europe,Ukraine,Meat,Online,M,8/20/2012,733636796,9/15/2012,8286,421.89,364.69,3495780.54,3021821.34,473959.20
+Europe,Bosnia and Herzegovina,Snacks,Online,L,12/24/2012,183778369,1/7/2013,2958,152.58,97.44,451331.64,288227.52,163104.12
+Middle East and North Africa,Lebanon,Beverages,Online,H,8/1/2016,961466634,8/17/2016,8198,47.45,31.79,388995.10,260614.42,128380.68
+Middle East and North Africa,United Arab Emirates,Meat,Offline,M,6/8/2013,785500419,7/15/2013,5884,421.89,364.69,2482400.76,2145835.96,336564.80
+Europe,Luxembourg,Snacks,Offline,M,4/22/2017,594991052,6/6/2017,9929,152.58,97.44,1514966.82,967481.76,547485.06
+Australia and Oceania,Tonga,Vegetables,Offline,M,7/15/2016,499362361,9/1/2016,1274,154.06,90.93,196272.44,115844.82,80427.62
+Middle East and North Africa,Kuwait,Vegetables,Online,C,9/1/2015,228350675,9/15/2015,2894,154.06,90.93,445849.64,263151.42,182698.22
+Central America and the Caribbean,Saint Vincent and the Grenadines,Baby Food,Offline,M,7/8/2016,482004821,7/12/2016,4793,255.28,159.42,1223557.04,764100.06,459456.98
+Sub-Saharan Africa,Sao Tome and Principe,Office Supplies,Offline,M,5/30/2014,680686128,7/8/2014,9006,651.21,524.96,5864797.26,4727789.76,1137007.50
+Sub-Saharan Africa,Burundi,Clothes,Offline,H,1/29/2017,315068423,2/25/2017,4603,109.28,35.84,503015.84,164971.52,338044.32
+Australia and Oceania,Fiji,Clothes,Online,M,8/11/2010,296138036,9/23/2010,2680,109.28,35.84,292870.40,96051.20,196819.20
+Sub-Saharan Africa,Ghana,Meat,Offline,M,3/26/2016,705193793,5/12/2016,1369,421.89,364.69,577567.41,499260.61,78306.80
+Middle East and North Africa,Somalia,Household,Offline,L,10/21/2010,343847024,11/5/2010,830,668.27,502.54,554664.10,417108.20,137555.90
+Sub-Saharan Africa,Mauritania,Cosmetics,Offline,H,11/23/2013,784021556,12/2/2013,8256,437.20,263.33,3609523.20,2174052.48,1435470.72
+Sub-Saharan Africa,Mozambique,Office Supplies,Offline,M,11/7/2015,517953717,11/14/2015,2870,651.21,524.96,1868972.70,1506635.20,362337.50
+Asia,Bhutan,Cosmetics,Online,L,11/13/2011,808192336,12/5/2011,927,437.20,263.33,405284.40,244106.91,161177.49
+Australia and Oceania,Tonga,Clothes,Offline,H,5/9/2013,737598741,6/10/2013,713,109.28,35.84,77916.64,25553.92,52362.72
+Sub-Saharan Africa,Guinea,Clothes,Online,M,11/6/2013,359346759,11/9/2013,7546,109.28,35.84,824626.88,270448.64,554178.24
+Europe,Albania,Office Supplies,Online,H,7/13/2015,246922719,7/29/2015,8775,651.21,524.96,5714367.75,4606524.00,1107843.75
+Sub-Saharan Africa,Lesotho,Cereal,Online,H,4/14/2010,144125449,5/22/2010,8778,205.70,117.11,1805634.60,1027991.58,777643.02
+Europe,Slovakia,Snacks,Offline,L,10/10/2013,315066277,11/28/2013,3968,152.58,97.44,605437.44,386641.92,218795.52
+Australia and Oceania,Papua New Guinea,Beverages,Online,C,3/25/2016,194169032,4/11/2016,7786,47.45,31.79,369445.70,247516.94,121928.76
+Sub-Saharan Africa,Cameroon,Cosmetics,Offline,L,7/7/2016,636170041,8/4/2016,5707,437.20,263.33,2495100.40,1502824.31,992276.09
+Europe,Sweden,Household,Offline,C,10/9/2010,766118133,10/10/2010,235,668.27,502.54,157043.45,118096.90,38946.55
+Middle East and North Africa,Bahrain,Fruits,Offline,M,5/11/2011,229374635,5/31/2011,5906,9.33,6.92,55102.98,40869.52,14233.46
+Sub-Saharan Africa,Mauritania,Household,Online,C,10/3/2012,541613376,10/11/2012,4289,668.27,502.54,2866210.03,2155394.06,710815.97
+Europe,Russia,Clothes,Offline,L,7/9/2010,138820683,7/9/2010,8980,109.28,35.84,981334.40,321843.20,659491.20
+Central America and the Caribbean,Belize,Baby Food,Online,H,8/16/2012,227295386,9/6/2012,611,255.28,159.42,155976.08,97405.62,58570.46
+Europe,Luxembourg,Cereal,Online,M,12/18/2012,733648812,12/24/2012,1842,205.70,117.11,378899.40,215716.62,163182.78
+Sub-Saharan Africa,Chad,Office Supplies,Online,H,4/16/2010,754804790,5/20/2010,2366,651.21,524.96,1540762.86,1242055.36,298707.50
+Asia,Indonesia,Vegetables,Offline,L,12/24/2011,807999646,2/3/2012,3906,154.06,90.93,601758.36,355172.58,246585.78
+Europe,Kosovo,Office Supplies,Online,C,2/16/2015,580782210,2/20/2015,5217,651.21,524.96,3397362.57,2738716.32,658646.25
+Central America and the Caribbean,Saint Kitts and Nevis ,Personal Care,Offline,C,4/25/2010,281013810,5/10/2010,7086,81.73,56.67,579138.78,401563.62,177575.16
+Asia,South Korea,Fruits,Online,C,9/11/2015,186868274,9/12/2015,7330,9.33,6.92,68388.90,50723.60,17665.30
+Sub-Saharan Africa,Kenya,Vegetables,Offline,M,8/12/2012,196831929,8/18/2012,5797,154.06,90.93,893085.82,527121.21,365964.61
+Europe,Hungary,Baby Food,Offline,C,1/1/2010,279703605,1/10/2010,9367,255.28,159.42,2391207.76,1493287.14,897920.62
+Middle East and North Africa,Turkey,Baby Food,Offline,M,4/9/2010,924594628,4/12/2010,6952,255.28,159.42,1774706.56,1108287.84,666418.72
+Middle East and North Africa,Yemen,Office Supplies,Online,C,2/10/2013,890928828,3/2/2013,4494,651.21,524.96,2926537.74,2359170.24,567367.50
+Asia,Tajikistan,Clothes,Online,C,9/18/2011,358442533,9/24/2011,9966,109.28,35.84,1089084.48,357181.44,731903.04
+Australia and Oceania,Australia,Baby Food,Online,M,9/6/2011,477184569,10/20/2011,8373,255.28,159.42,2137459.44,1334823.66,802635.78
+Sub-Saharan Africa,Benin,Personal Care,Online,M,2/14/2012,217516267,3/14/2012,6752,81.73,56.67,551840.96,382635.84,169205.12
+Sub-Saharan Africa,Gabon,Cereal,Online,L,12/24/2016,420111453,2/10/2017,9170,205.70,117.11,1886269.00,1073898.70,812370.30
+Europe,Poland,Baby Food,Offline,H,2/20/2016,645956456,4/8/2016,1725,255.28,159.42,440358.00,274999.50,165358.50
+Europe,Montenegro,Clothes,Offline,M,11/19/2011,526350104,12/4/2011,7547,109.28,35.84,824736.16,270484.48,554251.68
+Europe,Andorra,Meat,Online,L,2/26/2015,212903726,2/26/2015,1798,421.89,364.69,758558.22,655712.62,102845.60
+Sub-Saharan Africa,Zambia,Personal Care,Offline,L,6/12/2011,827541148,7/23/2011,6670,81.73,56.67,545139.10,377988.90,167150.20
+Middle East and North Africa,Jordan,Cosmetics,Online,M,1/12/2010,412498700,2/19/2010,6387,437.20,263.33,2792396.40,1681888.71,1110507.69
+Europe,Finland,Vegetables,Online,C,6/21/2017,680325210,7/23/2017,2203,154.06,90.93,339394.18,200318.79,139075.39
+Europe,Slovenia,Beverages,Online,M,2/3/2011,263882005,2/27/2011,7404,47.45,31.79,351319.80,235373.16,115946.64
+Middle East and North Africa,Algeria,Cereal,Offline,M,12/10/2010,566342914,12/17/2010,2308,205.70,117.11,474755.60,270289.88,204465.72
+Sub-Saharan Africa,Equatorial Guinea,Meat,Online,M,5/29/2015,811194264,7/4/2015,9264,421.89,364.69,3908388.96,3378488.16,529900.80
+Asia,India,Baby Food,Online,C,8/3/2012,292234885,8/4/2012,7651,255.28,159.42,1953147.28,1219722.42,733424.86
+Sub-Saharan Africa,Democratic Republic of the Congo,Fruits,Offline,M,5/15/2014,623576104,5/25/2014,8881,9.33,6.92,82859.73,61456.52,21403.21
+Sub-Saharan Africa,Sudan,Snacks,Online,M,10/4/2014,789641749,10/10/2014,1396,152.58,97.44,213001.68,136026.24,76975.44
+Europe,Slovenia,Fruits,Offline,L,5/28/2016,295168149,7/16/2016,5669,9.33,6.92,52891.77,39229.48,13662.29
+Sub-Saharan Africa,Uganda,Cereal,Offline,M,9/3/2011,515204131,10/4/2011,9206,205.70,117.11,1893674.20,1078114.66,815559.54
+Europe,Greece,Meat,Offline,C,9/12/2016,645111024,9/26/2016,1543,421.89,364.69,650976.27,562716.67,88259.60
+Europe,Switzerland,Baby Food,Offline,M,8/11/2014,850562655,9/25/2014,9246,255.28,159.42,2360318.88,1473997.32,886321.56
+Sub-Saharan Africa,South Sudan,Personal Care,Offline,L,4/26/2012,917545354,5/30/2012,915,81.73,56.67,74782.95,51853.05,22929.90
+Europe,Ireland,Personal Care,Offline,L,1/5/2014,702357947,2/4/2014,2179,81.73,56.67,178089.67,123483.93,54605.74
+Sub-Saharan Africa,Niger,Baby Food,Online,H,5/17/2017,581611764,7/2/2017,701,255.28,159.42,178951.28,111753.42,67197.86
+Europe,Montenegro,Clothes,Online,L,5/13/2017,102230632,6/13/2017,1171,109.28,35.84,127966.88,41968.64,85998.24
+Europe,Armenia,Clothes,Online,L,1/3/2010,231450879,2/22/2010,313,109.28,35.84,34204.64,11217.92,22986.72
+Sub-Saharan Africa,Seychelles ,Beverages,Online,L,4/29/2011,206821334,5/3/2011,1884,47.45,31.79,89395.80,59892.36,29503.44
+North America,Canada,Beverages,Offline,L,9/8/2015,686203324,9/18/2015,1667,47.45,31.79,79099.15,52993.93,26105.22
+Asia,Malaysia,Office Supplies,Online,L,9/27/2014,597770678,10/19/2014,2482,651.21,524.96,1616303.22,1302950.72,313352.50
+Asia,Thailand,Baby Food,Offline,C,5/3/2016,290009725,5/7/2016,9177,255.28,159.42,2342704.56,1462997.34,879707.22
+Sub-Saharan Africa,Ethiopia,Fruits,Online,H,6/22/2010,181719291,7/5/2010,3631,9.33,6.92,33877.23,25126.52,8750.71
+Sub-Saharan Africa,South Africa,Meat,Online,L,12/3/2010,312010705,12/21/2010,9756,421.89,364.69,4115958.84,3557915.64,558043.20
+Sub-Saharan Africa,Mauritius ,Fruits,Online,M,8/4/2013,790307796,8/30/2013,8494,9.33,6.92,79249.02,58778.48,20470.54
+Sub-Saharan Africa,Mauritania,Meat,Offline,C,6/14/2015,446346890,6/18/2015,2819,421.89,364.69,1189307.91,1028061.11,161246.80
+Europe,Poland,Clothes,Online,M,10/1/2010,880176818,10/15/2010,2735,109.28,35.84,298880.80,98022.40,200858.40
+Middle East and North Africa,Tunisia ,Baby Food,Offline,M,7/9/2017,612158906,8/4/2017,279,255.28,159.42,71223.12,44478.18,26744.94
+Asia,Mongolia,Fruits,Online,C,3/20/2013,932966983,3/20/2013,4518,9.33,6.92,42152.94,31264.56,10888.38
+Sub-Saharan Africa,Equatorial Guinea,Meat,Online,H,3/18/2014,953587377,3/27/2014,6550,421.89,364.69,2763379.50,2388719.50,374660.00
+Europe,Italy,Clothes,Online,H,6/10/2011,755318915,6/25/2011,4507,109.28,35.84,492524.96,161530.88,330994.08
+Asia,Maldives,Personal Care,Online,C,1/20/2012,939772927,3/3/2012,8548,81.73,56.67,698628.04,484415.16,214212.88
+Europe,Andorra,Beverages,Online,H,11/25/2012,378873240,11/28/2012,5866,47.45,31.79,278341.70,186480.14,91861.56
+Europe,Cyprus,Fruits,Online,L,11/27/2011,264856183,12/23/2011,5685,9.33,6.92,53041.05,39340.20,13700.85
+Australia and Oceania,Marshall Islands,Vegetables,Offline,C,11/1/2011,960270583,11/24/2011,4260,154.06,90.93,656295.60,387361.80,268933.80
+Sub-Saharan Africa,Ghana,Office Supplies,Offline,L,7/10/2016,647977769,8/3/2016,9876,651.21,524.96,6431349.96,5184504.96,1246845.00
+Sub-Saharan Africa,Malawi,Fruits,Offline,H,12/9/2011,281151568,1/22/2012,7852,9.33,6.92,73259.16,54335.84,18923.32
+Australia and Oceania,Palau,Snacks,Online,H,5/27/2015,433278310,6/8/2015,5535,152.58,97.44,844530.30,539330.40,305199.90
+North America,Greenland,Clothes,Offline,M,3/25/2011,848156821,5/11/2011,7306,109.28,35.84,798399.68,261847.04,536552.64
+Sub-Saharan Africa,Republic of the Congo,Snacks,Offline,M,1/30/2015,889898431,2/28/2015,9576,152.58,97.44,1461106.08,933085.44,528020.64
+Asia,Laos,Personal Care,Online,C,3/10/2017,892926967,4/7/2017,5787,81.73,56.67,472971.51,327949.29,145022.22
+Asia,Laos,Household,Online,C,6/1/2016,811978757,6/26/2016,1413,668.27,502.54,944265.51,710089.02,234176.49
+Central America and the Caribbean,Belize,Fruits,Offline,C,6/24/2016,672102630,8/7/2016,8959,9.33,6.92,83587.47,61996.28,21591.19
+Europe,Czech Republic,Cereal,Online,C,8/2/2014,118659913,8/17/2014,2960,205.70,117.11,608872.00,346645.60,262226.40
+Europe,San Marino,Baby Food,Online,L,10/18/2012,667324435,10/31/2012,4985,255.28,159.42,1272570.80,794708.70,477862.10
+Asia,Kazakhstan,Clothes,Online,C,3/28/2014,754082524,4/21/2014,8631,109.28,35.84,943195.68,309335.04,633860.64
+Europe,Poland,Baby Food,Online,C,9/26/2011,685233008,10/17/2011,4529,255.28,159.42,1156163.12,722013.18,434149.94
+Asia,Cambodia,Cosmetics,Offline,C,5/1/2014,387387216,6/11/2014,5341,437.20,263.33,2335085.20,1406445.53,928639.67
+Europe,Monaco,Beverages,Online,H,3/14/2013,757468974,3/23/2013,757,47.45,31.79,35919.65,24065.03,11854.62
+Europe,Belgium,Meat,Online,H,9/23/2015,512714612,10/9/2015,2502,421.89,364.69,1055568.78,912454.38,143114.40
+Central America and the Caribbean,Dominican Republic,Vegetables,Online,H,6/6/2011,240672957,7/14/2011,9331,154.06,90.93,1437533.86,848467.83,589066.03
+Middle East and North Africa,Jordan,Personal Care,Online,L,8/8/2013,149205338,8/21/2013,2030,81.73,56.67,165911.90,115040.10,50871.80
+Europe,Georgia,Meat,Offline,M,2/11/2010,516485583,3/6/2010,8416,421.89,364.69,3550626.24,3069231.04,481395.20
+Middle East and North Africa,Somalia,Baby Food,Offline,L,8/9/2012,341000020,8/18/2012,8339,255.28,159.42,2128779.92,1329403.38,799376.54
+Europe,Kosovo,Vegetables,Online,H,11/7/2014,491547477,11/7/2014,8676,154.06,90.93,1336624.56,788908.68,547715.88
+Middle East and North Africa,Syria,Vegetables,Offline,M,9/11/2011,557239282,10/22/2011,8341,154.06,90.93,1285014.46,758447.13,526567.33
+Central America and the Caribbean,Panama,Snacks,Offline,C,5/27/2010,197499263,6/8/2010,3276,152.58,97.44,499852.08,319213.44,180638.64
+Middle East and North Africa,Yemen,Personal Care,Offline,L,9/25/2011,492063748,10/5/2011,1453,81.73,56.67,118753.69,82341.51,36412.18
+Middle East and North Africa,Turkey,Vegetables,Online,H,9/20/2013,790981566,10/8/2013,7878,154.06,90.93,1213684.68,716346.54,497338.14
+Central America and the Caribbean,El Salvador,Household,Offline,C,6/20/2015,964614045,7/21/2015,9587,668.27,502.54,6406704.49,4817850.98,1588853.51
+Sub-Saharan Africa,Burundi,Fruits,Offline,H,5/10/2013,953635013,6/14/2013,647,9.33,6.92,6036.51,4477.24,1559.27
+Sub-Saharan Africa,Liberia,Vegetables,Offline,L,5/26/2012,319030797,6/23/2012,7157,154.06,90.93,1102607.42,650786.01,451821.41
+Central America and the Caribbean,Dominican Republic,Meat,Online,C,11/24/2014,492100226,1/11/2015,2247,421.89,364.69,947986.83,819458.43,128528.40
+Central America and the Caribbean,Saint Vincent and the Grenadines,Beverages,Offline,M,8/21/2016,724454629,10/2/2016,1079,47.45,31.79,51198.55,34301.41,16897.14
+Sub-Saharan Africa,Zambia,Beverages,Offline,M,9/9/2010,338017833,10/28/2010,5843,47.45,31.79,277250.35,185748.97,91501.38
+Middle East and North Africa,Oman,Personal Care,Online,M,11/24/2013,975026166,12/15/2013,765,81.73,56.67,62523.45,43352.55,19170.90
+Sub-Saharan Africa,Mali,Cereal,Online,C,2/7/2010,748028457,3/26/2010,7098,205.70,117.11,1460058.60,831246.78,628811.82
+Sub-Saharan Africa,Malawi,Fruits,Online,L,7/2/2014,989886033,8/1/2014,8129,9.33,6.92,75843.57,56252.68,19590.89
+Sub-Saharan Africa,Democratic Republic of the Congo,Cosmetics,Offline,C,11/2/2016,403772723,11/13/2016,4176,437.20,263.33,1825747.20,1099666.08,726081.12
+Australia and Oceania,Nauru,Meat,Online,H,7/8/2015,913174855,8/23/2015,7587,421.89,364.69,3200879.43,2766903.03,433976.40
+Europe,Bulgaria,Fruits,Offline,C,10/8/2013,911891257,11/1/2013,7742,9.33,6.92,72232.86,53574.64,18658.22
+Europe,Russia,Snacks,Offline,L,11/29/2015,214033257,12/3/2015,6052,152.58,97.44,923414.16,589706.88,333707.28
+Europe,Ukraine,Cereal,Online,H,12/14/2015,504024684,1/14/2016,959,205.70,117.11,197266.30,112308.49,84957.81
+Europe,Lithuania,Vegetables,Online,L,7/17/2016,386601865,7/26/2016,2938,154.06,90.93,452628.28,267152.34,185475.94
+Europe,Sweden,Cosmetics,Offline,C,1/16/2010,336813628,2/23/2010,9492,437.20,263.33,4149902.40,2499528.36,1650374.04
+Asia,Kyrgyzstan,Beverages,Offline,C,8/4/2012,450021302,8/27/2012,159,47.45,31.79,7544.55,5054.61,2489.94
+Sub-Saharan Africa,Chad,Beverages,Online,L,11/21/2014,891898715,12/5/2014,1505,47.45,31.79,71412.25,47843.95,23568.30
+Australia and Oceania,Solomon Islands,Fruits,Offline,L,4/9/2016,548432195,5/1/2016,2129,9.33,6.92,19863.57,14732.68,5130.89
+Sub-Saharan Africa,Madagascar,Fruits,Offline,H,5/11/2013,175920569,6/24/2013,7661,9.33,6.92,71477.13,53014.12,18463.01
+Australia and Oceania,Papua New Guinea,Clothes,Offline,H,5/28/2011,150975167,7/11/2011,5762,109.28,35.84,629671.36,206510.08,423161.28
+Sub-Saharan Africa,Central African Republic,Beverages,Offline,M,12/9/2012,920519816,12/30/2012,1125,47.45,31.79,53381.25,35763.75,17617.50
+Asia,Maldives,Meat,Online,C,12/28/2013,751790845,2/6/2014,472,421.89,364.69,199132.08,172133.68,26998.40
+Central America and the Caribbean,Dominican Republic,Meat,Online,M,6/8/2015,682337081,6/10/2015,7560,421.89,364.69,3189488.40,2757056.40,432432.00
+Central America and the Caribbean,Haiti,Meat,Online,H,8/22/2011,470019853,9/14/2011,8174,421.89,364.69,3448528.86,2980976.06,467552.80
+Sub-Saharan Africa,Togo,Fruits,Offline,H,12/19/2016,843012988,12/26/2016,5132,9.33,6.92,47881.56,35513.44,12368.12
+Asia,Taiwan,Vegetables,Offline,C,7/25/2016,349802815,8/15/2016,3281,154.06,90.93,505470.86,298341.33,207129.53
+Europe,Belgium,Fruits,Online,C,7/24/2015,309188163,8/12/2015,4503,9.33,6.92,42012.99,31160.76,10852.23
+Europe,Kosovo,Office Supplies,Offline,M,8/1/2012,760280358,8/21/2012,2708,651.21,524.96,1763476.68,1421591.68,341885.00
+Sub-Saharan Africa,Republic of the Congo,Fruits,Online,H,2/13/2011,912503230,3/17/2011,8838,9.33,6.92,82458.54,61158.96,21299.58
+Europe,Slovakia,Beverages,Offline,M,9/15/2015,495593106,10/8/2015,5868,47.45,31.79,278436.60,186543.72,91892.88
+Europe,Cyprus,Clothes,Offline,L,1/9/2013,209598815,1/11/2013,3802,109.28,35.84,415482.56,136263.68,279218.88
+Sub-Saharan Africa,Comoros,Clothes,Offline,L,7/13/2013,374881684,8/25/2013,4676,109.28,35.84,510993.28,167587.84,343405.44
+North America,United States of America,Baby Food,Offline,H,5/26/2017,482115542,5/28/2017,7558,255.28,159.42,1929406.24,1204896.36,724509.88
+Central America and the Caribbean,Guatemala,Meat,Online,M,9/16/2010,542286717,9/20/2010,3545,421.89,364.69,1495600.05,1292826.05,202774.00
+Asia,Laos,Cereal,Online,L,9/9/2014,636694037,9/20/2014,769,205.70,117.11,158183.30,90057.59,68125.71
+Australia and Oceania,Solomon Islands,Personal Care,Offline,H,10/9/2013,466948831,11/26/2013,9390,81.73,56.67,767444.70,532131.30,235313.40
+Sub-Saharan Africa,Mali,Snacks,Offline,L,5/19/2012,704974925,6/14/2012,6601,152.58,97.44,1007180.58,643201.44,363979.14
+Sub-Saharan Africa,Sudan,Fruits,Online,H,1/4/2016,743008649,1/27/2016,1625,9.33,6.92,15161.25,11245.00,3916.25
+Australia and Oceania,Marshall Islands,Household,Offline,L,4/11/2012,943598830,4/13/2012,718,668.27,502.54,479817.86,360823.72,118994.14
+Central America and the Caribbean,Guatemala,Vegetables,Online,L,8/5/2012,389606797,9/18/2012,2164,154.06,90.93,333385.84,196772.52,136613.32
+Sub-Saharan Africa,Togo,Snacks,Online,M,7/2/2010,934206378,7/13/2010,1282,152.58,97.44,195607.56,124918.08,70689.48
+Sub-Saharan Africa,Republic of the Congo,Meat,Online,L,9/30/2015,450883901,11/5/2015,5421,421.89,364.69,2287065.69,1976984.49,310081.20
+Europe,Georgia,Meat,Online,H,8/23/2012,483438193,9/26/2012,8959,421.89,364.69,3779712.51,3267257.71,512454.80
+Australia and Oceania,Vanuatu,Cereal,Online,M,11/10/2016,395980584,12/18/2016,8309,205.70,117.11,1709161.30,973066.99,736094.31
+Middle East and North Africa,Qatar,Vegetables,Offline,M,1/18/2011,522934901,2/3/2011,6913,154.06,90.93,1065016.78,628599.09,436417.69
+Europe,Switzerland,Vegetables,Online,L,10/15/2016,819037473,10/15/2016,244,154.06,90.93,37590.64,22186.92,15403.72
+Sub-Saharan Africa,Chad,Baby Food,Offline,C,2/1/2015,409337127,2/14/2015,807,255.28,159.42,206010.96,128651.94,77359.02
+Central America and the Caribbean,Antigua and Barbuda ,Cereal,Online,M,9/19/2010,739195191,10/28/2010,3139,205.70,117.11,645692.30,367608.29,278084.01
+Middle East and North Africa,Lebanon,Personal Care,Offline,L,4/24/2013,624285495,6/11/2013,8806,81.73,56.67,719714.38,499036.02,220678.36
+Sub-Saharan Africa,Burkina Faso,Baby Food,Offline,L,11/8/2010,300594365,12/4/2010,1407,255.28,159.42,359178.96,224303.94,134875.02
+Europe,Liechtenstein,Fruits,Offline,H,4/26/2011,974420630,6/15/2011,1573,9.33,6.92,14676.09,10885.16,3790.93
+Sub-Saharan Africa,Cameroon,Personal Care,Online,L,3/3/2016,772375619,3/6/2016,1964,81.73,56.67,160517.72,111299.88,49217.84
+Middle East and North Africa,Qatar,Household,Online,M,8/1/2016,591383159,8/15/2016,2273,668.27,502.54,1518977.71,1142273.42,376704.29
+Central America and the Caribbean,Jamaica,Snacks,Online,H,5/16/2012,948679578,6/5/2012,4224,152.58,97.44,644497.92,411586.56,232911.36
+Sub-Saharan Africa,Senegal,Meat,Online,L,10/10/2015,631813704,11/28/2015,6570,421.89,364.69,2771817.30,2396013.30,375804.00
+Sub-Saharan Africa,Madagascar,Clothes,Online,C,5/13/2017,748646867,6/22/2017,99,109.28,35.84,10818.72,3548.16,7270.56
+Sub-Saharan Africa,Republic of the Congo,Beverages,Online,M,7/31/2012,677352893,8/23/2012,2628,47.45,31.79,124698.60,83544.12,41154.48
+Sub-Saharan Africa,Gabon,Beverages,Offline,M,1/25/2013,316418111,3/6/2013,4005,47.45,31.79,190037.25,127318.95,62718.30
+Europe,Russia,Beverages,Offline,L,8/7/2012,534641349,8/27/2012,1111,47.45,31.79,52716.95,35318.69,17398.26
+Europe,Belgium,Snacks,Online,L,8/5/2013,921133935,8/11/2013,2856,152.58,97.44,435768.48,278288.64,157479.84
+Asia,Kyrgyzstan,Office Supplies,Offline,H,9/28/2015,235319697,10/31/2015,5183,651.21,524.96,3375221.43,2720867.68,654353.75
+Europe,San Marino,Meat,Offline,L,3/23/2012,456934964,5/5/2012,6065,421.89,364.69,2558762.85,2211844.85,346918.00
+Central America and the Caribbean,Saint Vincent and the Grenadines,Beverages,Offline,H,3/25/2016,936028563,4/14/2016,507,47.45,31.79,24057.15,16117.53,7939.62
+Central America and the Caribbean,Dominican Republic,Baby Food,Offline,C,9/19/2011,642961823,9/30/2011,5546,255.28,159.42,1415782.88,884143.32,531639.56
+Sub-Saharan Africa,Burkina Faso,Personal Care,Offline,H,3/15/2010,418408572,3/15/2010,5249,81.73,56.67,429000.77,297460.83,131539.94
+Middle East and North Africa,Jordan,Beverages,Offline,L,9/16/2016,723355138,10/24/2016,5715,47.45,31.79,271176.75,181679.85,89496.90
+Sub-Saharan Africa,Mali,Meat,Online,C,10/24/2010,289100348,10/31/2010,72,421.89,364.69,30376.08,26257.68,4118.40
+Asia,Mongolia,Personal Care,Offline,M,1/9/2011,167255532,1/20/2011,3484,81.73,56.67,284747.32,197438.28,87309.04
+Australia and Oceania,Papua New Guinea,Meat,Online,L,5/28/2010,579744517,7/2/2010,8141,421.89,364.69,3434606.49,2968941.29,465665.20
+Europe,Bulgaria,Fruits,Online,L,8/31/2010,468803632,10/2/2010,8267,9.33,6.92,77131.11,57207.64,19923.47
+Europe,Finland,Baby Food,Online,M,10/13/2010,646981704,11/23/2010,5118,255.28,159.42,1306523.04,815911.56,490611.48
+Middle East and North Africa,Iraq,Household,Online,H,10/22/2010,647140061,11/5/2010,1980,668.27,502.54,1323174.60,995029.20,328145.40
+Europe,Finland,Vegetables,Online,L,8/22/2015,972452533,10/4/2015,9169,154.06,90.93,1412576.14,833737.17,578838.97
+Middle East and North Africa,Somalia,Household,Offline,M,2/5/2016,846405446,3/9/2016,9035,668.27,502.54,6037819.45,4540448.90,1497370.55
+Central America and the Caribbean,Trinidad and Tobago,Personal Care,Online,H,6/4/2015,462797629,6/30/2015,958,81.73,56.67,78297.34,54289.86,24007.48
+Europe,Austria,Personal Care,Offline,M,5/10/2010,535740411,6/7/2010,6348,81.73,56.67,518822.04,359741.16,159080.88
+Middle East and North Africa,Libya,Meat,Online,H,1/18/2010,949657618,2/20/2010,3648,421.89,364.69,1539054.72,1330389.12,208665.60
+Europe,Ireland,Personal Care,Offline,H,2/26/2017,309285581,4/17/2017,3331,81.73,56.67,272242.63,188767.77,83474.86
+Middle East and North Africa,Egypt,Meat,Online,C,6/17/2016,889673125,7/9/2016,2903,421.89,364.69,1224746.67,1058695.07,166051.60
+Sub-Saharan Africa,Mauritius ,Meat,Offline,H,7/13/2016,986181581,7/23/2016,1900,421.89,364.69,801591.00,692911.00,108680.00
+Australia and Oceania,Palau,Baby Food,Offline,M,8/22/2015,764484775,9/3/2015,6888,255.28,159.42,1758368.64,1098084.96,660283.68
+Middle East and North Africa,Afghanistan,Cereal,Online,C,2/15/2013,910569036,3/25/2013,6467,205.70,117.11,1330261.90,757350.37,572911.53
+Europe,Andorra,Baby Food,Offline,C,3/7/2013,380733191,4/13/2013,6267,255.28,159.42,1599839.76,999085.14,600754.62
+Middle East and North Africa,Egypt,Household,Online,M,6/24/2013,451588571,7/14/2013,3948,668.27,502.54,2638329.96,1984027.92,654302.04
+Asia,China,Fruits,Online,H,7/24/2016,670059001,9/1/2016,4203,9.33,6.92,39213.99,29084.76,10129.23
+Australia and Oceania,Kiribati,Office Supplies,Online,L,11/16/2010,203380811,11/23/2010,3756,651.21,524.96,2445944.76,1971749.76,474195.00
+Europe,Kosovo,Fruits,Online,L,6/11/2012,989102828,7/8/2012,6362,9.33,6.92,59357.46,44025.04,15332.42
+Sub-Saharan Africa,Gabon,Fruits,Offline,H,8/21/2015,985086381,9/4/2015,7806,9.33,6.92,72829.98,54017.52,18812.46
+Sub-Saharan Africa,Liberia,Vegetables,Online,L,2/6/2012,919505298,2/27/2012,906,154.06,90.93,139578.36,82382.58,57195.78
+Middle East and North Africa,Bahrain,Snacks,Online,M,4/6/2017,240845906,4/21/2017,511,152.58,97.44,77968.38,49791.84,28176.54
+Sub-Saharan Africa,Zambia,Office Supplies,Offline,H,7/18/2013,267907035,7/20/2013,8500,651.21,524.96,5535285.00,4462160.00,1073125.00
+Australia and Oceania,Papua New Guinea,Meat,Online,M,9/20/2014,139800012,9/20/2014,8785,421.89,364.69,3706303.65,3203801.65,502502.00
+Sub-Saharan Africa,Botswana,Meat,Online,C,9/10/2016,865948665,9/26/2016,2308,421.89,364.69,973722.12,841704.52,132017.60
+Middle East and North Africa,Qatar,Meat,Offline,H,6/8/2016,376089322,6/27/2016,2043,421.89,364.69,861921.27,745061.67,116859.60
+Middle East and North Africa,Tunisia ,Snacks,Online,H,10/9/2015,270270812,10/28/2015,7994,152.58,97.44,1219724.52,778935.36,440789.16
+Middle East and North Africa,Saudi Arabia,Personal Care,Offline,M,1/6/2010,868854463,2/12/2010,2198,81.73,56.67,179642.54,124560.66,55081.88
+Asia,Malaysia,Beverages,Online,L,6/26/2014,762514102,7/28/2014,3722,47.45,31.79,176608.90,118322.38,58286.52
+North America,Mexico,Personal Care,Offline,H,4/3/2015,862236058,5/1/2015,3665,81.73,56.67,299540.45,207695.55,91844.90
+Sub-Saharan Africa,Mauritania,Household,Online,H,11/4/2010,349319159,12/10/2010,157,668.27,502.54,104918.39,78898.78,26019.61
+Australia and Oceania,Federated States of Micronesia,Snacks,Online,C,12/19/2015,725374734,1/19/2016,3358,152.58,97.44,512363.64,327203.52,185160.12
+Europe,Latvia,Beverages,Online,M,5/2/2012,862326610,5/28/2012,461,47.45,31.79,21874.45,14655.19,7219.26
+Europe,Sweden,Meat,Online,H,1/4/2013,152411115,2/21/2013,691,421.89,364.69,291525.99,252000.79,39525.20
+Asia,Bangladesh,Cosmetics,Online,L,3/11/2013,758177077,3/21/2013,300,437.20,263.33,131160.00,78999.00,52161.00
+Europe,Ukraine,Office Supplies,Offline,C,9/16/2016,862485826,10/27/2016,7577,651.21,524.96,4934218.17,3977621.92,956596.25
+Asia,South Korea,Household,Offline,C,2/9/2017,518511188,2/16/2017,7838,668.27,502.54,5237900.26,3938908.52,1298991.74
+Europe,Vatican City,Fruits,Offline,M,7/25/2016,299739491,9/1/2016,8431,9.33,6.92,78661.23,58342.52,20318.71
+Middle East and North Africa,Qatar,Meat,Online,H,7/15/2014,849969565,9/3/2014,3737,421.89,364.69,1576602.93,1362846.53,213756.40
+Europe,France,Meat,Offline,L,7/17/2011,633312737,8/11/2011,167,421.89,364.69,70455.63,60903.23,9552.40
+Europe,Norway,Office Supplies,Offline,C,12/14/2012,884192836,1/15/2013,1164,651.21,524.96,758008.44,611053.44,146955.00
+Asia,Cambodia,Cosmetics,Offline,C,1/24/2010,657346189,1/28/2010,2200,437.20,263.33,961840.00,579326.00,382514.00
+Sub-Saharan Africa,Togo,Beverages,Offline,M,3/2/2014,877821624,3/14/2014,5780,47.45,31.79,274261.00,183746.20,90514.80
+Sub-Saharan Africa,Rwanda,Fruits,Online,M,11/22/2014,290980470,1/1/2015,6442,9.33,6.92,60103.86,44578.64,15525.22
+Australia and Oceania,Vanuatu,Fruits,Online,H,4/20/2014,412496554,4/29/2014,5752,9.33,6.92,53666.16,39803.84,13862.32
+Europe,Iceland,Meat,Online,M,7/9/2015,578356206,7/15/2015,7309,421.89,364.69,3083594.01,2665519.21,418074.80
+Europe,Luxembourg,Personal Care,Online,L,5/17/2011,194858253,5/22/2011,1742,81.73,56.67,142373.66,98719.14,43654.52
+Europe,Macedonia,Cereal,Offline,L,11/28/2010,988614022,1/11/2011,1713,205.70,117.11,352364.10,200609.43,151754.67
+Asia,Myanmar,Personal Care,Online,C,11/13/2012,256547343,12/30/2012,6915,81.73,56.67,565162.95,391873.05,173289.90
+Asia,Brunei,Vegetables,Offline,M,1/25/2017,315894544,1/27/2017,9070,154.06,90.93,1397324.20,824735.10,572589.10
+Middle East and North Africa,Israel,Snacks,Online,L,1/7/2013,854204452,2/14/2013,6934,152.58,97.44,1057989.72,675648.96,382340.76
+Europe,Russia,Cereal,Online,L,1/10/2014,279338395,2/24/2014,1293,205.70,117.11,265970.10,151423.23,114546.87
+Asia,Uzbekistan,Meat,Online,C,7/10/2015,669470202,7/11/2015,9965,421.89,364.69,4204133.85,3634135.85,569998.00
+Europe,Estonia,Baby Food,Offline,M,1/2/2014,123086202,2/20/2014,2797,255.28,159.42,714018.16,445897.74,268120.42
+Central America and the Caribbean,Honduras,Clothes,Online,M,10/28/2010,408985221,11/14/2010,6670,109.28,35.84,728897.60,239052.80,489844.80
+Europe,Luxembourg,Meat,Online,M,12/19/2015,216278588,12/19/2015,495,421.89,364.69,208835.55,180521.55,28314.00
+North America,United States of America,Fruits,Online,L,12/23/2013,104390132,1/23/2014,215,9.33,6.92,2005.95,1487.80,518.15
+Sub-Saharan Africa,Ethiopia,Household,Online,C,3/11/2013,253056180,3/14/2013,3802,668.27,502.54,2540762.54,1910657.08,630105.46
+Asia,Taiwan,Personal Care,Online,M,8/24/2011,912325561,8/24/2011,6262,81.73,56.67,511793.26,354867.54,156925.72
+Central America and the Caribbean,Saint Lucia,Meat,Online,H,1/4/2016,152559602,1/23/2016,4631,421.89,364.69,1953772.59,1688879.39,264893.20
+Sub-Saharan Africa,Djibouti,Cereal,Online,M,2/4/2015,614432132,3/21/2015,2977,205.70,117.11,612368.90,348636.47,263732.43
+Central America and the Caribbean,Trinidad and Tobago,Household,Offline,C,12/1/2013,958929479,12/26/2013,7397,668.27,502.54,4943193.19,3717288.38,1225904.81
+Asia,Mongolia,Household,Offline,H,10/10/2014,817350471,11/26/2014,1022,668.27,502.54,682971.94,513595.88,169376.06
+Central America and the Caribbean,Cuba,Office Supplies,Online,L,6/15/2013,341306436,6/23/2013,9014,651.21,524.96,5870006.94,4731989.44,1138017.50
+Asia,Nepal,Cosmetics,Offline,C,8/6/2010,652721202,9/25/2010,3563,437.20,263.33,1557743.60,938244.79,619498.81
+Europe,Romania,Baby Food,Offline,H,6/23/2015,693831098,7/14/2015,8895,255.28,159.42,2270715.60,1418040.90,852674.70
+Australia and Oceania,Fiji,Cereal,Offline,H,12/7/2011,377184951,12/19/2011,6264,205.70,117.11,1288504.80,733577.04,554927.76
+Central America and the Caribbean,Honduras,Vegetables,Online,H,2/28/2015,135644090,3/26/2015,8955,154.06,90.93,1379607.30,814278.15,565329.15
+Asia,Indonesia,Clothes,Offline,L,11/29/2014,472382342,12/2/2014,7287,109.28,35.84,796323.36,261166.08,535157.28
+Central America and the Caribbean,Dominica,Cereal,Online,L,2/25/2017,610886037,4/15/2017,3608,205.70,117.11,742165.60,422532.88,319632.72
+Asia,Laos,Cosmetics,Offline,C,7/20/2017,744954001,7/25/2017,7298,437.20,263.33,3190685.60,1921782.34,1268903.26
+Middle East and North Africa,Egypt,Personal Care,Offline,M,11/4/2012,688697564,12/3/2012,9768,81.73,56.67,798338.64,553552.56,244786.08
+Australia and Oceania,Palau,Cereal,Online,L,3/10/2012,326540553,3/23/2012,9461,205.70,117.11,1946127.70,1107977.71,838149.99
+Europe,Macedonia,Cereal,Online,C,9/1/2010,963219296,9/18/2010,6850,205.70,117.11,1409045.00,802203.50,606841.50
+Sub-Saharan Africa,Tanzania,Cereal,Offline,C,10/11/2015,373782622,11/15/2015,9439,205.70,117.11,1941602.30,1105401.29,836201.01
+Central America and the Caribbean,Saint Kitts and Nevis ,Vegetables,Online,L,5/15/2013,453591859,6/10/2013,6766,154.06,90.93,1042369.96,615232.38,427137.58
+Europe,Austria,Vegetables,Offline,M,11/12/2016,468320834,12/21/2016,5397,154.06,90.93,831461.82,490749.21,340712.61
+Europe,Iceland,Cereal,Online,M,6/15/2010,203955876,7/18/2010,3931,205.70,117.11,808606.70,460359.41,348247.29
+Sub-Saharan Africa,Mauritius ,Baby Food,Offline,C,6/22/2013,416795814,6/29/2013,7998,255.28,159.42,2041729.44,1275041.16,766688.28
+Europe,Moldova ,Snacks,Offline,H,1/11/2016,583451974,2/5/2016,5260,152.58,97.44,802570.80,512534.40,290036.40
+Europe,Luxembourg,Clothes,Online,M,1/30/2013,250848186,3/7/2013,407,109.28,35.84,44476.96,14586.88,29890.08
+Sub-Saharan Africa,Senegal,Meat,Online,M,10/22/2015,386220777,10/25/2015,165,421.89,364.69,69611.85,60173.85,9438.00
+Middle East and North Africa,Syria,Cosmetics,Online,H,7/2/2017,227118575,8/2/2017,8288,437.20,263.33,3623513.60,2182479.04,1441034.56
+Australia and Oceania,Nauru,Fruits,Offline,M,7/14/2012,431402909,8/16/2012,562,9.33,6.92,5243.46,3889.04,1354.42
+Sub-Saharan Africa,Ethiopia,Meat,Offline,L,4/12/2015,827247607,4/25/2015,9805,421.89,364.69,4136631.45,3575785.45,560846.00
+Europe,Albania,Meat,Online,C,11/12/2010,863138997,12/21/2010,865,421.89,364.69,364934.85,315456.85,49478.00
+Central America and the Caribbean,Dominica,Snacks,Offline,L,1/2/2012,957875907,1/16/2012,5622,152.58,97.44,857804.76,547807.68,309997.08
+Central America and the Caribbean,Honduras,Clothes,Offline,L,4/30/2017,250569665,5/8/2017,7987,109.28,35.84,872819.36,286254.08,586565.28
+Sub-Saharan Africa,Cape Verde,Snacks,Online,H,3/2/2015,650644099,3/31/2015,8903,152.58,97.44,1358419.74,867508.32,490911.42
+Asia,Indonesia,Fruits,Offline,H,1/24/2010,987835538,3/10/2010,1342,9.33,6.92,12520.86,9286.64,3234.22
+Middle East and North Africa,Somalia,Cosmetics,Online,H,6/3/2011,162192809,6/17/2011,5311,437.20,263.33,2321969.20,1398545.63,923423.57
+Sub-Saharan Africa,Mozambique,Clothes,Offline,H,7/19/2014,294077241,7/28/2014,2845,109.28,35.84,310901.60,101964.80,208936.80
+Sub-Saharan Africa,Angola,Baby Food,Offline,L,1/15/2012,874162662,2/24/2012,3012,255.28,159.42,768903.36,480173.04,288730.32
+North America,Greenland,Beverages,Offline,C,9/13/2012,113435399,10/12/2012,6910,47.45,31.79,327879.50,219668.90,108210.60
+Central America and the Caribbean,Honduras,Meat,Offline,H,1/15/2015,793194282,2/23/2015,2669,421.89,364.69,1126024.41,973357.61,152666.80
+Australia and Oceania,Samoa ,Fruits,Offline,C,1/23/2011,815050637,3/7/2011,451,9.33,6.92,4207.83,3120.92,1086.91
+Asia,North Korea,Fruits,Online,M,10/5/2012,850928294,10/9/2012,7447,9.33,6.92,69480.51,51533.24,17947.27
+Middle East and North Africa,Jordan,Snacks,Online,M,6/27/2010,293063580,6/27/2010,2881,152.58,97.44,439582.98,280724.64,158858.34
+Asia,Thailand,Beverages,Online,H,7/31/2014,404005324,9/15/2014,3008,47.45,31.79,142729.60,95624.32,47105.28
+Europe,Serbia,Household,Online,M,9/23/2013,266614854,10/10/2013,6115,668.27,502.54,4086471.05,3073032.10,1013438.95
+Europe,Andorra,Household,Offline,L,8/14/2016,834065997,9/14/2016,7518,668.27,502.54,5024053.86,3778095.72,1245958.14
+Europe,Lithuania,Fruits,Offline,M,4/14/2010,879845082,5/1/2010,4567,9.33,6.92,42610.11,31603.64,11006.47
+Middle East and North Africa,Egypt,Household,Offline,M,11/24/2016,147750937,1/6/2017,1641,668.27,502.54,1096631.07,824668.14,271962.93
+Sub-Saharan Africa,The Gambia,Baby Food,Online,M,4/8/2014,701894891,5/18/2014,5151,255.28,159.42,1314947.28,821172.42,493774.86
+Sub-Saharan Africa,Equatorial Guinea,Personal Care,Online,C,5/2/2015,176700770,5/29/2015,8539,81.73,56.67,697892.47,483905.13,213987.34
+Central America and the Caribbean,Dominica,Fruits,Offline,H,5/22/2011,326904904,6/27/2011,7281,9.33,6.92,67931.73,50384.52,17547.21
+Middle East and North Africa,Algeria,Baby Food,Online,H,9/20/2013,277556121,10/29/2013,3879,255.28,159.42,990231.12,618390.18,371840.94
+Middle East and North Africa,Kuwait,Household,Online,M,12/20/2011,574015748,1/8/2012,2871,668.27,502.54,1918603.17,1442792.34,475810.83
+Sub-Saharan Africa,Rwanda,Cosmetics,Offline,L,10/6/2015,931957614,11/25/2015,5823,437.20,263.33,2545815.60,1533370.59,1012445.01
+Asia,Uzbekistan,Cereal,Online,L,1/30/2013,687368047,2/14/2013,6335,205.70,117.11,1303109.50,741891.85,561217.65
+Europe,Slovakia,Cosmetics,Offline,M,11/27/2011,146545875,1/7/2012,5036,437.20,263.33,2201739.20,1326129.88,875609.32
+Middle East and North Africa,Morocco,Snacks,Offline,C,9/11/2013,136102426,9/23/2013,4587,152.58,97.44,699884.46,446957.28,252927.18
+Asia,Bhutan,Household,Online,C,3/14/2017,652961528,3/20/2017,4681,668.27,502.54,3128171.87,2352389.74,775782.13
+Europe,Romania,Baby Food,Offline,C,8/30/2014,414359509,9/11/2014,7042,255.28,159.42,1797681.76,1122635.64,675046.12
+Central America and the Caribbean,Costa Rica,Vegetables,Online,L,9/27/2010,907845199,10/2/2010,423,154.06,90.93,65167.38,38463.39,26703.99
+Middle East and North Africa,Libya,Household,Offline,M,3/1/2011,541279923,3/29/2011,5613,668.27,502.54,3750999.51,2820757.02,930242.49
+Central America and the Caribbean,Jamaica,Vegetables,Offline,M,5/13/2011,492837512,5/20/2011,427,154.06,90.93,65783.62,38827.11,26956.51
+Australia and Oceania,Solomon Islands,Fruits,Offline,C,6/1/2015,661004292,7/7/2015,4714,9.33,6.92,43981.62,32620.88,11360.74
+Sub-Saharan Africa,Mozambique,Household,Online,L,2/2/2017,114579093,3/17/2017,5355,668.27,502.54,3578585.85,2691101.70,887484.15
+Central America and the Caribbean,Dominica,Vegetables,Offline,M,3/28/2011,242673242,4/20/2011,1260,154.06,90.93,194115.60,114571.80,79543.80
+Asia,Philippines,Fruits,Online,M,9/8/2012,704710566,9/15/2012,8372,9.33,6.92,78110.76,57934.24,20176.52
+Asia,Mongolia,Cereal,Online,L,8/19/2014,780427396,9/30/2014,4664,205.70,117.11,959384.80,546201.04,413183.76
+Central America and the Caribbean,Panama,Meat,Offline,C,2/7/2015,719872558,2/16/2015,5142,421.89,364.69,2169358.38,1875235.98,294122.40
+Sub-Saharan Africa,Ghana,Fruits,Online,L,3/16/2013,393407380,3/21/2013,6841,9.33,6.92,63826.53,47339.72,16486.81
+Sub-Saharan Africa,Sao Tome and Principe,Clothes,Online,C,11/20/2012,641705691,12/7/2012,3829,109.28,35.84,418433.12,137231.36,281201.76
+Middle East and North Africa,Iraq,Personal Care,Offline,M,8/8/2011,125753819,9/18/2011,2205,81.73,56.67,180214.65,124957.35,55257.30
+Europe,Malta,Baby Food,Offline,L,8/21/2011,276850593,9/3/2011,5097,255.28,159.42,1301162.16,812563.74,488598.42
+Asia,Uzbekistan,Office Supplies,Online,H,5/10/2016,346607339,6/13/2016,7669,651.21,524.96,4994129.49,4025918.24,968211.25
+Europe,Andorra,Cereal,Online,L,4/5/2011,556947886,5/17/2011,2111,205.70,117.11,434232.70,247219.21,187013.49
+Sub-Saharan Africa,Burundi,Baby Food,Offline,C,3/9/2013,750108563,4/16/2013,2648,255.28,159.42,675981.44,422144.16,253837.28
+Central America and the Caribbean,Dominica,Office Supplies,Offline,H,7/22/2013,838638198,8/2/2013,534,651.21,524.96,347746.14,280328.64,67417.50
+Asia,Taiwan,Cosmetics,Online,H,5/31/2012,355398118,6/15/2012,9056,437.20,263.33,3959283.20,2384716.48,1574566.72
+Sub-Saharan Africa,Lesotho,Vegetables,Offline,H,8/29/2014,703562152,10/9/2014,8530,154.06,90.93,1314131.80,775632.90,538498.90
+Australia and Oceania,Tuvalu,Household,Offline,M,2/9/2011,206616628,3/24/2011,1306,668.27,502.54,872760.62,656317.24,216443.38
+North America,Greenland,Beverages,Online,C,7/30/2012,858360373,8/12/2012,6764,47.45,31.79,320951.80,215027.56,105924.24
+Asia,Sri Lanka,Clothes,Online,L,10/22/2015,672904717,10/30/2015,6314,109.28,35.84,689993.92,226293.76,463700.16
+Sub-Saharan Africa,Kenya,Beverages,Offline,H,10/21/2014,434673488,11/12/2014,8399,47.45,31.79,398532.55,267004.21,131528.34
+Europe,United Kingdom,Household,Online,C,3/23/2012,548403012,4/4/2012,3493,668.27,502.54,2334267.11,1755372.22,578894.89
+Sub-Saharan Africa,Burundi,Clothes,Offline,M,7/27/2015,589142119,8/21/2015,9100,109.28,35.84,994448.00,326144.00,668304.00
+Europe,United Kingdom,Vegetables,Online,L,9/7/2010,652252137,9/26/2010,4757,154.06,90.93,732863.42,432554.01,300309.41
+Sub-Saharan Africa,Botswana,Snacks,Online,C,12/28/2010,903406894,2/9/2011,7030,152.58,97.44,1072637.40,685003.20,387634.20
+Sub-Saharan Africa,Benin,Vegetables,Offline,H,10/30/2015,228592717,11/3/2015,4520,154.06,90.93,696351.20,411003.60,285347.60
+Europe,Malta,Cosmetics,Online,M,3/29/2014,284108436,4/3/2014,2854,437.20,263.33,1247768.80,751543.82,496224.98
+Sub-Saharan Africa,Gabon,Cereal,Offline,C,6/24/2011,546565377,7/1/2011,9696,205.70,117.11,1994467.20,1135498.56,858968.64
+Sub-Saharan Africa,Seychelles ,Office Supplies,Online,H,1/29/2010,562887370,2/8/2010,9736,651.21,524.96,6340180.56,5111010.56,1229170.00
+Sub-Saharan Africa,Nigeria,Snacks,Online,L,8/20/2013,400310742,9/17/2013,9699,152.58,97.44,1479873.42,945070.56,534802.86
+Middle East and North Africa,Egypt,Fruits,Online,H,6/16/2015,196384322,6/28/2015,3340,9.33,6.92,31162.20,23112.80,8049.40
+Middle East and North Africa,Pakistan,Vegetables,Offline,C,6/25/2017,608969438,7/25/2017,6444,154.06,90.93,992762.64,585952.92,406809.72
+Sub-Saharan Africa,Ghana,Beverages,Offline,C,5/10/2011,566239917,6/12/2011,1829,47.45,31.79,86786.05,58143.91,28642.14
+Europe,Norway,Vegetables,Offline,H,7/5/2012,416682088,8/14/2012,4344,154.06,90.93,669236.64,394999.92,274236.72
+Europe,Cyprus,Vegetables,Offline,M,12/8/2010,579094779,12/11/2010,5869,154.06,90.93,904178.14,533668.17,370509.97
+Europe,Czech Republic,Fruits,Online,M,11/1/2012,192589318,12/16/2012,314,9.33,6.92,2929.62,2172.88,756.74
+Sub-Saharan Africa,Guinea-Bissau,Office Supplies,Online,M,2/11/2014,266589534,3/2/2014,8622,651.21,524.96,5614732.62,4526205.12,1088527.50
+Sub-Saharan Africa,Togo,Cosmetics,Offline,L,9/28/2011,530831754,11/14/2011,3767,437.20,263.33,1646932.40,991964.11,654968.29
+Europe,Belarus,Household,Offline,M,2/12/2015,785364806,3/21/2015,5754,668.27,502.54,3845225.58,2891615.16,953610.42
+Europe,Russia,Baby Food,Offline,M,12/24/2011,450550019,1/2/2012,6618,255.28,159.42,1689443.04,1055041.56,634401.48
+Europe,Bulgaria,Vegetables,Offline,C,1/26/2010,817061221,2/21/2010,5427,154.06,90.93,836083.62,493477.11,342606.51
+Central America and the Caribbean,Dominican Republic,Office Supplies,Online,H,8/15/2010,995884740,8/23/2010,3280,651.21,524.96,2135968.80,1721868.80,414100.00
+Europe,Slovakia,Office Supplies,Online,H,2/20/2012,168319404,3/10/2012,8307,651.21,524.96,5409601.47,4360842.72,1048758.75
+Asia,Laos,Beverages,Offline,H,3/15/2014,735976541,4/17/2014,668,47.45,31.79,31696.60,21235.72,10460.88
+Sub-Saharan Africa,Guinea,Clothes,Offline,C,8/29/2013,670779979,9/9/2013,7557,109.28,35.84,825828.96,270842.88,554986.08
+Australia and Oceania,Kiribati,Office Supplies,Online,C,1/4/2016,264966046,2/5/2016,8196,651.21,524.96,5337317.16,4302572.16,1034745.00
+Europe,Croatia,Clothes,Online,C,6/9/2016,781083571,6/18/2016,8841,109.28,35.84,966144.48,316861.44,649283.04
+Europe,Ukraine,Cereal,Offline,M,3/21/2011,401993882,4/11/2011,7778,205.70,117.11,1599934.60,910881.58,689053.02
+Central America and the Caribbean,The Bahamas,Snacks,Offline,L,8/7/2016,980870807,9/9/2016,324,152.58,97.44,49435.92,31570.56,17865.36
+Europe,France,Office Supplies,Online,L,1/19/2012,391200673,2/13/2012,3827,651.21,524.96,2492180.67,2009021.92,483158.75
+Middle East and North Africa,Iran,Baby Food,Offline,H,3/1/2012,176782310,3/16/2012,2669,255.28,159.42,681342.32,425491.98,255850.34
+Middle East and North Africa,Qatar,Snacks,Offline,M,6/19/2017,601727044,7/22/2017,3259,152.58,97.44,497258.22,317556.96,179701.26
+Asia,Myanmar,Baby Food,Online,M,8/11/2010,200458705,9/30/2010,9040,255.28,159.42,2307731.20,1441156.80,866574.40
+Middle East and North Africa,Oman,Office Supplies,Offline,C,3/7/2013,727713620,4/22/2013,5486,651.21,524.96,3572538.06,2879930.56,692607.50
+Europe,San Marino,Vegetables,Offline,M,9/30/2013,408540618,11/13/2013,5102,154.06,90.93,786014.12,463924.86,322089.26
+Central America and the Caribbean,Haiti,Fruits,Online,H,2/2/2017,688301026,3/1/2017,2424,9.33,6.92,22615.92,16774.08,5841.84
+Sub-Saharan Africa,Ghana,Fruits,Online,L,2/15/2010,382668673,3/4/2010,9019,9.33,6.92,84147.27,62411.48,21735.79
+Australia and Oceania,New Zealand,Beverages,Offline,H,2/13/2011,627629888,2/14/2011,8486,47.45,31.79,402660.70,269769.94,132890.76
+Central America and the Caribbean,Jamaica,Beverages,Online,M,11/27/2012,829483497,11/30/2012,1454,47.45,31.79,68992.30,46222.66,22769.64
+Asia,Laos,Clothes,Offline,M,12/14/2016,914840829,12/23/2016,586,109.28,35.84,64038.08,21002.24,43035.84
+Australia and Oceania,Tonga,Baby Food,Online,H,6/7/2014,880625712,7/23/2014,5573,255.28,159.42,1422675.44,888447.66,534227.78
+Australia and Oceania,Solomon Islands,Beverages,Offline,L,9/23/2012,344074475,9/23/2012,8138,47.45,31.79,386148.10,258707.02,127441.08
+Asia,India,Baby Food,Online,H,7/3/2016,792735946,7/4/2016,7038,255.28,159.42,1796660.64,1121997.96,674662.68
+Asia,Bangladesh,Vegetables,Online,L,5/5/2016,634471452,6/13/2016,3057,154.06,90.93,470961.42,277973.01,192988.41
+Middle East and North Africa,Egypt,Fruits,Offline,M,4/2/2015,147454822,5/14/2015,4013,9.33,6.92,37441.29,27769.96,9671.33
+Sub-Saharan Africa,Burundi,Clothes,Online,L,4/19/2017,130172383,4/19/2017,9756,109.28,35.84,1066135.68,349655.04,716480.64
+Asia,Myanmar,Snacks,Offline,H,4/5/2016,551422965,5/22/2016,7164,152.58,97.44,1093083.12,698060.16,395022.96
+Sub-Saharan Africa,Mozambique,Office Supplies,Offline,L,7/22/2014,100317895,8/14/2014,5149,651.21,524.96,3353080.29,2703019.04,650061.25
+Sub-Saharan Africa,Republic of the Congo,Office Supplies,Offline,M,11/15/2011,236281001,11/27/2011,9654,651.21,524.96,6286781.34,5067963.84,1218817.50
+Europe,San Marino,Personal Care,Online,L,7/17/2016,239048612,7/26/2016,8651,81.73,56.67,707046.23,490252.17,216794.06
+Middle East and North Africa,Pakistan,Household,Online,C,6/18/2011,358669555,8/3/2011,7147,668.27,502.54,4776125.69,3591653.38,1184472.31
+Australia and Oceania,Marshall Islands,Cereal,Online,M,11/15/2010,465505158,12/5/2010,2176,205.70,117.11,447603.20,254831.36,192771.84
+Asia,Indonesia,Household,Online,L,2/26/2011,500229251,3/15/2011,7806,668.27,502.54,5216515.62,3922827.24,1293688.38
+Sub-Saharan Africa,Guinea,Household,Offline,H,4/30/2017,923828160,6/3/2017,137,668.27,502.54,91552.99,68847.98,22705.01
+Sub-Saharan Africa,Mozambique,Personal Care,Online,L,7/18/2016,467600715,7/25/2016,2297,81.73,56.67,187733.81,130170.99,57562.82
+Sub-Saharan Africa,The Gambia,Household,Offline,H,2/29/2012,183158242,4/7/2012,9449,668.27,502.54,6314483.23,4748500.46,1565982.77
+Europe,Vatican City,Cosmetics,Offline,C,5/24/2012,292424571,6/5/2012,3784,437.20,263.33,1654364.80,996440.72,657924.08
+Australia and Oceania,Palau,Cosmetics,Online,H,5/17/2011,637636029,6/19/2011,9526,437.20,263.33,4164767.20,2508481.58,1656285.62
+Europe,Bosnia and Herzegovina,Beverages,Online,M,8/28/2015,231341445,10/7/2015,7929,47.45,31.79,376231.05,252062.91,124168.14
+Sub-Saharan Africa,Burkina Faso,Fruits,Online,C,2/21/2010,406402146,3/27/2010,2281,9.33,6.92,21281.73,15784.52,5497.21
+Central America and the Caribbean,El Salvador,Cosmetics,Offline,C,11/17/2014,765991961,11/24/2014,2898,437.20,263.33,1267005.60,763130.34,503875.26
+Europe,Portugal,Office Supplies,Online,M,2/9/2013,533597218,2/24/2013,2130,651.21,524.96,1387077.30,1118164.80,268912.50
+Asia,Malaysia,Beverages,Offline,H,8/27/2015,803016746,10/15/2015,9355,47.45,31.79,443894.75,297395.45,146499.30
+Asia,Taiwan,Cereal,Offline,M,9/3/2011,488361871,9/18/2011,5985,205.70,117.11,1231114.50,700903.35,530211.15
+Sub-Saharan Africa,Angola,Snacks,Offline,H,4/28/2010,374056422,5/6/2010,463,152.58,97.44,70644.54,45114.72,25529.82
+Sub-Saharan Africa,Burundi,Meat,Offline,H,4/4/2014,864836728,5/10/2014,3261,421.89,364.69,1375783.29,1189254.09,186529.20
+North America,Canada,Household,Offline,H,10/31/2015,635751616,12/14/2015,1886,668.27,502.54,1260357.22,947790.44,312566.78
+Europe,Romania,Meat,Offline,C,1/16/2016,682162415,2/26/2016,5873,421.89,364.69,2477759.97,2141824.37,335935.60
+Asia,Taiwan,Meat,Online,M,3/1/2013,269742953,3/26/2013,1789,421.89,364.69,754761.21,652430.41,102330.80
+Asia,Cambodia,Clothes,Online,M,2/7/2014,984479558,2/12/2014,8233,109.28,35.84,899702.24,295070.72,604631.52
+Asia,Myanmar,Meat,Online,H,6/25/2015,882671058,7/28/2015,836,421.89,364.69,352700.04,304880.84,47819.20
+Asia,Vietnam,Household,Online,H,12/22/2014,340928781,1/9/2015,7257,668.27,502.54,4849635.39,3646932.78,1202702.61
+Europe,Iceland,Vegetables,Offline,C,2/13/2015,706176555,2/26/2015,2190,154.06,90.93,337391.40,199136.70,138254.70
+Sub-Saharan Africa,Sudan,Vegetables,Offline,H,12/10/2011,245650708,1/9/2012,2358,154.06,90.93,363273.48,214412.94,148860.54
+Middle East and North Africa,Algeria,Personal Care,Online,H,11/20/2013,896900069,12/12/2013,1516,81.73,56.67,123902.68,85911.72,37990.96
+North America,United States of America,Household,Online,L,4/30/2015,617785966,5/5/2015,5451,668.27,502.54,3642739.77,2739345.54,903394.23
+Sub-Saharan Africa,Nigeria,Meat,Offline,L,6/25/2015,136482226,7/26/2015,6979,421.89,364.69,2944370.31,2545171.51,399198.80
+Sub-Saharan Africa,Burundi,Office Supplies,Online,M,8/18/2014,701475179,9/5/2014,949,651.21,524.96,617998.29,498187.04,119811.25
+Asia,Tajikistan,Cereal,Offline,L,5/5/2010,931563651,5/26/2010,9241,205.70,117.11,1900873.70,1082213.51,818660.19
+Asia,Nepal,Beverages,Online,M,5/22/2016,865858972,5/31/2016,5766,47.45,31.79,273596.70,183301.14,90295.56
+Australia and Oceania,Australia,Fruits,Offline,M,7/14/2013,613784968,8/21/2013,1467,9.33,6.92,13687.11,10151.64,3535.47
+Sub-Saharan Africa,Mozambique,Fruits,Online,H,11/21/2013,805077970,12/19/2013,9317,9.33,6.92,86927.61,64473.64,22453.97
+Europe,Luxembourg,Office Supplies,Offline,H,9/17/2011,339786803,10/25/2011,9321,651.21,524.96,6069928.41,4893152.16,1176776.25
+Middle East and North Africa,Iraq,Meat,Online,C,6/16/2017,438272798,7/24/2017,3515,421.89,364.69,1482943.35,1281885.35,201058.00
+Asia,Cambodia,Snacks,Online,M,2/23/2016,591209781,4/3/2016,967,152.58,97.44,147544.86,94224.48,53320.38
+Sub-Saharan Africa,Comoros,Cosmetics,Online,L,8/2/2016,809584081,8/18/2016,2775,437.20,263.33,1213230.00,730740.75,482489.25
+Europe,Malta,Personal Care,Offline,C,4/13/2017,274694526,5/11/2017,7069,81.73,56.67,577749.37,400600.23,177149.14
+Middle East and North Africa,Oman,Household,Online,L,3/30/2010,488152444,3/30/2010,4011,668.27,502.54,2680430.97,2015687.94,664743.03
+North America,United States of America,Office Supplies,Offline,L,1/13/2015,321881663,2/28/2015,792,651.21,524.96,515758.32,415768.32,99990.00
+Sub-Saharan Africa,Ethiopia,Fruits,Offline,L,6/6/2014,968118512,7/18/2014,6636,9.33,6.92,61913.88,45921.12,15992.76
+Central America and the Caribbean,Barbados,Snacks,Offline,C,3/15/2011,989411818,3/16/2011,7799,152.58,97.44,1189971.42,759934.56,430036.86
+Central America and the Caribbean,Guatemala,Household,Offline,L,10/2/2016,368622910,10/5/2016,2566,668.27,502.54,1714780.82,1289517.64,425263.18
+Sub-Saharan Africa,Uganda,Fruits,Offline,H,1/21/2017,958925616,2/3/2017,6254,9.33,6.92,58349.82,43277.68,15072.14
+Europe,France,Clothes,Online,M,4/15/2014,633806264,4/26/2014,6213,109.28,35.84,678956.64,222673.92,456282.72
+Middle East and North Africa,Somalia,Personal Care,Offline,H,6/23/2015,937063682,7/8/2015,6822,81.73,56.67,557562.06,386602.74,170959.32
+Sub-Saharan Africa,Ghana,Clothes,Online,L,7/26/2013,332809197,7/30/2013,4492,109.28,35.84,490885.76,160993.28,329892.48
+Europe,Spain,Personal Care,Online,C,12/8/2013,955466639,1/27/2014,2666,81.73,56.67,217892.18,151082.22,66809.96
+Sub-Saharan Africa,Zambia,Beverages,Offline,C,6/14/2015,959772336,7/18/2015,6817,47.45,31.79,323466.65,216712.43,106754.22
+Sub-Saharan Africa,Senegal,Snacks,Online,L,4/1/2014,370775115,4/27/2014,9451,152.58,97.44,1442033.58,920905.44,521128.14
+Asia,Myanmar,Cereal,Online,C,2/11/2015,633836305,2/23/2015,5103,205.70,117.11,1049687.10,597612.33,452074.77
+Sub-Saharan Africa,Equatorial Guinea,Personal Care,Online,H,7/13/2012,564629733,7/26/2012,5340,81.73,56.67,436438.20,302617.80,133820.40
+Sub-Saharan Africa,Rwanda,Beverages,Offline,C,3/15/2017,399141728,3/31/2017,3762,47.45,31.79,178506.90,119593.98,58912.92
+Sub-Saharan Africa,Mozambique,Snacks,Online,L,5/20/2014,443671119,7/3/2014,998,152.58,97.44,152274.84,97245.12,55029.72
+Australia and Oceania,Tonga,Snacks,Offline,M,2/10/2013,624829232,3/16/2013,9710,152.58,97.44,1481551.80,946142.40,535409.40
+Asia,India,Office Supplies,Offline,L,2/20/2012,939539897,3/3/2012,9589,651.21,524.96,6244452.69,5033841.44,1210611.25
+Central America and the Caribbean,The Bahamas,Baby Food,Offline,C,4/9/2011,105039441,4/26/2011,2360,255.28,159.42,602460.80,376231.20,226229.60
+North America,Mexico,Beverages,Offline,H,3/4/2015,508876693,3/29/2015,6777,47.45,31.79,321568.65,215440.83,106127.82
+Sub-Saharan Africa,Seychelles ,Fruits,Offline,H,6/5/2014,558912980,7/3/2014,3626,9.33,6.92,33830.58,25091.92,8738.66
+Sub-Saharan Africa,Kenya,Meat,Online,L,1/15/2012,533322131,1/18/2012,725,421.89,364.69,305870.25,264400.25,41470.00
+Europe,Norway,Office Supplies,Online,L,1/30/2012,330590474,3/14/2012,7923,651.21,524.96,5159536.83,4159258.08,1000278.75
+Europe,Malta,Cosmetics,Offline,C,11/26/2015,819516837,12/25/2015,2098,437.20,263.33,917245.60,552466.34,364779.26
+Asia,Thailand,Household,Offline,H,10/9/2010,689212548,10/10/2010,2164,668.27,502.54,1446136.28,1087496.56,358639.72
+Europe,Kosovo,Snacks,Offline,C,7/13/2011,499101436,8/28/2011,4061,152.58,97.44,619627.38,395703.84,223923.54
+Australia and Oceania,Kiribati,Vegetables,Online,H,5/11/2011,428919827,5/14/2011,5763,154.06,90.93,887847.78,524029.59,363818.19
+Sub-Saharan Africa,Sierra Leone,Beverages,Online,H,11/13/2015,728716552,11/24/2015,2276,47.45,31.79,107996.20,72354.04,35642.16
+Middle East and North Africa,Israel,Cosmetics,Online,L,8/2/2016,368852937,8/15/2016,636,437.20,263.33,278059.20,167477.88,110581.32
+Europe,Andorra,Clothes,Online,C,6/20/2017,190002810,8/5/2017,4909,109.28,35.84,536455.52,175938.56,360516.96
+Europe,Macedonia,Beverages,Offline,M,12/17/2015,653152501,12/22/2015,1194,47.45,31.79,56655.30,37957.26,18698.04
+Europe,Austria,Vegetables,Offline,C,5/9/2014,489600837,6/9/2014,2622,154.06,90.93,403945.32,238418.46,165526.86
+Europe,Montenegro,Baby Food,Online,M,1/5/2016,750959146,1/25/2016,4354,255.28,159.42,1111489.12,694114.68,417374.44
+Sub-Saharan Africa,Niger,Office Supplies,Offline,H,1/2/2014,759151256,1/13/2014,8581,651.21,524.96,5588033.01,4504681.76,1083351.25
+Europe,Bosnia and Herzegovina,Personal Care,Offline,L,1/12/2010,356413495,1/18/2010,9528,81.73,56.67,778723.44,539951.76,238771.68
+Asia,Myanmar,Personal Care,Online,H,8/27/2010,355294692,10/12/2010,8450,81.73,56.67,690618.50,478861.50,211757.00
+Europe,Bosnia and Herzegovina,Office Supplies,Offline,L,11/30/2015,288656175,12/30/2015,8632,651.21,524.96,5621244.72,4531454.72,1089790.00
+Europe,Russia,Cosmetics,Offline,C,7/28/2015,659671771,7/29/2015,391,437.20,263.33,170945.20,102962.03,67983.17
+Australia and Oceania,Vanuatu,Vegetables,Online,L,8/2/2015,691827809,8/17/2015,6078,154.06,90.93,936376.68,552672.54,383704.14
+Sub-Saharan Africa,Botswana,Baby Food,Online,C,8/18/2011,578923118,8/30/2011,5070,255.28,159.42,1294269.60,808259.40,486010.20
+Middle East and North Africa,Iraq,Household,Online,H,8/1/2015,135069024,8/1/2015,8781,668.27,502.54,5868078.87,4412803.74,1455275.13
+Central America and the Caribbean,Grenada,Baby Food,Online,M,11/19/2013,144689357,12/12/2013,5651,255.28,159.42,1442587.28,900882.42,541704.86
+Sub-Saharan Africa,Uganda,Meat,Offline,C,10/5/2016,112520444,11/12/2016,6155,421.89,364.69,2596732.95,2244666.95,352066.00
+Europe,Netherlands,Clothes,Offline,H,7/26/2016,513611114,9/5/2016,7797,109.28,35.84,852056.16,279444.48,572611.68
+Europe,Russia,Beverages,Offline,M,4/21/2014,543322694,6/1/2014,114,47.45,31.79,5409.30,3624.06,1785.24
+Central America and the Caribbean,Nicaragua,Office Supplies,Online,M,10/23/2015,367329013,11/27/2015,9673,651.21,524.96,6299154.33,5077938.08,1221216.25
+Europe,Monaco,Vegetables,Offline,C,11/6/2012,671616399,12/10/2012,5072,154.06,90.93,781392.32,461196.96,320195.36
+Sub-Saharan Africa,Mauritius ,Baby Food,Online,H,3/11/2017,412483680,4/18/2017,1942,255.28,159.42,495753.76,309593.64,186160.12
+Central America and the Caribbean,Dominican Republic,Vegetables,Online,C,5/15/2011,866542184,5/22/2011,7944,154.06,90.93,1223852.64,722347.92,501504.72
+Australia and Oceania,Nauru,Office Supplies,Online,H,1/22/2013,680715739,3/7/2013,7769,651.21,524.96,5059250.49,4078414.24,980836.25
+Australia and Oceania,Tuvalu,Baby Food,Offline,C,9/19/2010,822240674,9/29/2010,8142,255.28,159.42,2078489.76,1297997.64,780492.12
+Middle East and North Africa,Kuwait,Baby Food,Offline,L,10/15/2012,528665816,10/25/2012,2818,255.28,159.42,719379.04,449245.56,270133.48
+Australia and Oceania,Marshall Islands,Cosmetics,Offline,C,8/24/2013,457852494,9/1/2013,7582,437.20,263.33,3314850.40,1996568.06,1318282.34
+Australia and Oceania,Tonga,Fruits,Online,M,7/3/2012,437974536,7/10/2012,5253,9.33,6.92,49010.49,36350.76,12659.73
+Australia and Oceania,Tonga,Household,Offline,C,3/23/2017,817518270,4/18/2017,678,668.27,502.54,453087.06,340722.12,112364.94
+Australia and Oceania,Tonga,Cereal,Offline,C,3/22/2010,215282523,4/8/2010,5738,205.70,117.11,1180306.60,671977.18,508329.42
+Australia and Oceania,East Timor,Clothes,Offline,L,11/5/2012,470378625,11/6/2012,4343,109.28,35.84,474603.04,155653.12,318949.92
+Asia,Turkmenistan,Cosmetics,Online,M,6/5/2013,792230403,7/10/2013,7436,437.20,263.33,3251019.20,1958121.88,1292897.32
+Sub-Saharan Africa,Mauritania,Personal Care,Online,H,7/6/2016,910574185,8/12/2016,7991,81.73,56.67,653104.43,452849.97,200254.46
+Central America and the Caribbean,Dominican Republic,Fruits,Offline,C,5/9/2016,625458800,5/25/2016,6013,9.33,6.92,56101.29,41609.96,14491.33
+Australia and Oceania,Nauru,Cosmetics,Online,L,11/1/2015,257245576,12/16/2015,3537,437.20,263.33,1546376.40,931398.21,614978.19
+Sub-Saharan Africa,Madagascar,Meat,Online,H,2/15/2015,196608340,3/20/2015,9632,421.89,364.69,4063644.48,3512694.08,550950.40
+Sub-Saharan Africa,Tanzania,Cereal,Online,M,6/14/2015,454533421,6/15/2015,5395,205.70,117.11,1109751.50,631808.45,477943.05
+Europe,Macedonia,Beverages,Offline,L,4/30/2015,212319648,5/15/2015,8957,47.45,31.79,425009.65,284743.03,140266.62
+Europe,Monaco,Household,Online,L,4/30/2014,971578347,6/16/2014,478,668.27,502.54,319433.06,240214.12,79218.94
+Europe,Italy,Fruits,Offline,L,11/17/2016,704233348,11/26/2016,7152,9.33,6.92,66728.16,49491.84,17236.32
+Central America and the Caribbean,Jamaica,Cosmetics,Online,C,4/29/2013,602520978,5/28/2013,8202,437.20,263.33,3585914.40,2159832.66,1426081.74
+Sub-Saharan Africa,South Sudan,Cosmetics,Online,H,1/3/2014,128990066,1/24/2014,9882,437.20,263.33,4320410.40,2602227.06,1718183.34
+Sub-Saharan Africa,Ghana,Meat,Online,H,3/12/2015,166501939,3/25/2015,479,421.89,364.69,202085.31,174686.51,27398.80
+Europe,Bulgaria,Snacks,Online,C,5/31/2010,768230426,6/22/2010,5310,152.58,97.44,810199.80,517406.40,292793.40
+Europe,Luxembourg,Fruits,Offline,M,12/31/2016,707661855,1/26/2017,1723,9.33,6.92,16075.59,11923.16,4152.43
+Europe,Hungary,Fruits,Offline,M,9/8/2011,628595054,10/21/2011,4100,9.33,6.92,38253.00,28372.00,9881.00
+Europe,Greece,Beverages,Offline,H,2/20/2010,795141351,2/24/2010,8850,47.45,31.79,419932.50,281341.50,138591.00
+Australia and Oceania,Samoa ,Vegetables,Offline,C,3/1/2010,641724574,3/30/2010,9417,154.06,90.93,1450783.02,856287.81,594495.21
+Sub-Saharan Africa,Benin,Meat,Offline,H,8/14/2010,123081052,10/3/2010,1273,421.89,364.69,537065.97,464250.37,72815.60
+Europe,Belgium,Meat,Offline,M,3/22/2015,164259612,4/29/2015,6924,421.89,364.69,2921166.36,2525113.56,396052.80
+Central America and the Caribbean,Jamaica,Baby Food,Online,H,8/11/2013,410621583,9/6/2013,906,255.28,159.42,231283.68,144434.52,86849.16
+Sub-Saharan Africa,Kenya,Baby Food,Online,L,6/1/2015,577840793,7/9/2015,4786,255.28,159.42,1221770.08,762984.12,458785.96
+Sub-Saharan Africa,Liberia,Cereal,Online,H,3/10/2016,901903569,3/19/2016,2163,205.70,117.11,444929.10,253308.93,191620.17
+Asia,Mongolia,Baby Food,Online,M,5/1/2016,789108741,5/14/2016,3667,255.28,159.42,936111.76,584593.14,351518.62
+Australia and Oceania,Palau,Cereal,Offline,L,4/26/2017,166067636,6/2/2017,1959,205.70,117.11,402966.30,229418.49,173547.81
+Asia,Uzbekistan,Cereal,Offline,M,4/25/2010,829704082,5/2/2010,6730,205.70,117.11,1384361.00,788150.30,596210.70
+Middle East and North Africa,Kuwait,Fruits,Offline,M,4/14/2010,597254407,4/25/2010,9706,9.33,6.92,90556.98,67165.52,23391.46
+Asia,Tajikistan,Baby Food,Online,H,4/24/2014,956267440,5/21/2014,9641,255.28,159.42,2461154.48,1536968.22,924186.26
+Sub-Saharan Africa,Lesotho,Office Supplies,Online,C,12/24/2012,314604508,2/8/2013,7320,651.21,524.96,4766857.20,3842707.20,924150.00
+Europe,Norway,Snacks,Online,H,11/15/2016,750439441,12/29/2016,562,152.58,97.44,85749.96,54761.28,30988.68
+Europe,Armenia,Fruits,Offline,C,11/29/2014,362258565,12/14/2014,9214,9.33,6.92,85966.62,63760.88,22205.74
+Sub-Saharan Africa,Mauritius ,Household,Online,C,1/8/2016,918860709,2/16/2016,158,668.27,502.54,105586.66,79401.32,26185.34
+Europe,Slovakia,Cereal,Online,H,1/14/2015,209357202,1/22/2015,2303,205.70,117.11,473727.10,269704.33,204022.77
+Asia,Turkmenistan,Office Supplies,Online,L,8/29/2011,593171870,9/4/2011,1593,651.21,524.96,1037377.53,836261.28,201116.25
+Europe,Portugal,Cosmetics,Offline,L,3/20/2014,450041043,4/16/2014,6000,437.20,263.33,2623200.00,1579980.00,1043220.00
+Central America and the Caribbean,Cuba,Office Supplies,Offline,L,3/4/2013,930013549,3/7/2013,531,651.21,524.96,345792.51,278753.76,67038.75
+Europe,Slovakia,Office Supplies,Online,H,3/15/2015,103450715,4/18/2015,2220,651.21,524.96,1445686.20,1165411.20,280275.00
+Central America and the Caribbean,Cuba,Baby Food,Online,H,9/6/2016,611026370,9/7/2016,5136,255.28,159.42,1311118.08,818781.12,492336.96
+Asia,Turkmenistan,Office Supplies,Online,C,1/23/2015,213726842,1/28/2015,5377,651.21,524.96,3501556.17,2822709.92,678846.25
+Sub-Saharan Africa,Mauritania,Fruits,Offline,M,8/20/2012,342850959,9/21/2012,6072,9.33,6.92,56651.76,42018.24,14633.52
+Middle East and North Africa,Israel,Personal Care,Offline,H,10/6/2012,250010049,11/5/2012,2384,81.73,56.67,194844.32,135101.28,59743.04
+Middle East and North Africa,Libya,Beverages,Offline,C,2/1/2016,157127940,3/11/2016,6504,47.45,31.79,308614.80,206762.16,101852.64
+Sub-Saharan Africa,Comoros,Cereal,Online,M,9/26/2016,806440961,10/4/2016,2656,205.70,117.11,546339.20,311044.16,235295.04
+Australia and Oceania,Fiji,Meat,Offline,C,9/12/2013,310497939,10/11/2013,2095,421.89,364.69,883859.55,764025.55,119834.00
+Australia and Oceania,Tuvalu,Snacks,Online,C,8/3/2014,902160203,8/7/2014,8107,152.58,97.44,1236966.06,789946.08,447019.98
+Europe,Luxembourg,Fruits,Online,M,9/25/2016,384601581,10/19/2016,1009,9.33,6.92,9413.97,6982.28,2431.69
+Central America and the Caribbean,Dominican Republic,Meat,Online,M,12/17/2010,681308400,1/30/2011,3151,421.89,364.69,1329375.39,1149138.19,180237.20
+Europe,Denmark,Vegetables,Online,L,8/25/2015,186079490,8/29/2015,3911,154.06,90.93,602528.66,355627.23,246901.43
+Europe,Bulgaria,Office Supplies,Online,M,5/22/2012,513026177,6/5/2012,4701,651.21,524.96,3061338.21,2467836.96,593501.25
+Central America and the Caribbean,Guatemala,Office Supplies,Online,H,5/7/2010,646572291,5/23/2010,3964,651.21,524.96,2581396.44,2080941.44,500455.00
+Middle East and North Africa,Jordan,Clothes,Offline,L,3/1/2012,991454160,3/19/2012,2173,109.28,35.84,237465.44,77880.32,159585.12
+Europe,Malta,Baby Food,Offline,L,3/16/2010,222720611,4/1/2010,6833,255.28,159.42,1744328.24,1089316.86,655011.38
+North America,Mexico,Office Supplies,Offline,H,1/13/2013,235732972,1/31/2013,7480,651.21,524.96,4871050.80,3926700.80,944350.00
+Middle East and North Africa,Kuwait,Office Supplies,Online,L,5/10/2011,296165072,6/2/2011,681,651.21,524.96,443474.01,357497.76,85976.25
+Sub-Saharan Africa,Zimbabwe,Cereal,Online,L,1/27/2012,190003240,3/8/2012,5036,205.70,117.11,1035905.20,589765.96,446139.24
+Central America and the Caribbean,Haiti,Clothes,Online,M,10/22/2011,673546302,11/11/2011,6173,109.28,35.84,674585.44,221240.32,453345.12
+Asia,Singapore,Cosmetics,Online,L,10/24/2015,323405587,11/17/2015,1755,437.20,263.33,767286.00,462144.15,305141.85
+Central America and the Caribbean,Dominican Republic,Household,Offline,L,6/23/2011,486504924,6/25/2011,6473,668.27,502.54,4325711.71,3252941.42,1072770.29
+Middle East and North Africa,Bahrain,Snacks,Online,H,7/16/2017,330080640,8/4/2017,7051,152.58,97.44,1075841.58,687049.44,388792.14
+Europe,Bosnia and Herzegovina,Household,Offline,M,3/1/2012,891681563,3/27/2012,7245,668.27,502.54,4841616.15,3640902.30,1200713.85
+Europe,Kosovo,Beverages,Offline,M,6/8/2012,129169023,7/18/2012,2839,47.45,31.79,134710.55,90251.81,44458.74
+Middle East and North Africa,Israel,Cosmetics,Offline,L,1/1/2010,570716845,1/13/2010,6652,437.20,263.33,2908254.40,1751671.16,1156583.24
+Europe,France,Cereal,Online,C,9/19/2012,764811360,9/30/2012,3532,205.70,117.11,726532.40,413632.52,312899.88
+Sub-Saharan Africa,Zambia,Cosmetics,Online,L,7/29/2010,230251395,9/9/2010,5359,437.20,263.33,2342954.80,1411185.47,931769.33
+Sub-Saharan Africa,Mauritius ,Clothes,Online,H,5/7/2017,806148278,5/29/2017,6045,109.28,35.84,660597.60,216652.80,443944.80
+Europe,Liechtenstein,Vegetables,Offline,C,10/17/2013,801925837,10/26/2013,6531,154.06,90.93,1006165.86,593863.83,412302.03
+Sub-Saharan Africa,Sierra Leone,Cereal,Offline,M,1/14/2012,847320401,2/7/2012,9791,205.70,117.11,2014008.70,1146624.01,867384.69
+Sub-Saharan Africa,Niger,Vegetables,Offline,H,11/23/2013,742380797,12/16/2013,5830,154.06,90.93,898169.80,530121.90,368047.90
+Sub-Saharan Africa,Liberia,Baby Food,Offline,C,9/8/2014,807468354,10/8/2014,6685,255.28,159.42,1706546.80,1065722.70,640824.10
+Central America and the Caribbean,Panama,Vegetables,Offline,H,7/29/2014,533256900,7/31/2014,1422,154.06,90.93,219073.32,129302.46,89770.86
+Asia,Uzbekistan,Cereal,Online,L,10/16/2014,830732762,11/1/2014,1140,205.70,117.11,234498.00,133505.40,100992.60
+Europe,San Marino,Office Supplies,Offline,C,11/5/2013,881194770,12/5/2013,3969,651.21,524.96,2584652.49,2083566.24,501086.25
+Sub-Saharan Africa,Comoros,Snacks,Offline,C,4/26/2011,386254251,5/16/2011,71,152.58,97.44,10833.18,6918.24,3914.94
+Europe,Austria,Vegetables,Offline,C,8/17/2011,917835032,10/6/2011,6637,154.06,90.93,1022496.22,603502.41,418993.81
+Central America and the Caribbean,The Bahamas,Vegetables,Offline,M,9/10/2012,968173444,10/25/2012,2892,154.06,90.93,445541.52,262969.56,182571.96
+Middle East and North Africa,Tunisia ,Personal Care,Offline,L,4/16/2017,899818313,5/5/2017,5090,81.73,56.67,416005.70,288450.30,127555.40
+Australia and Oceania,Tonga,Meat,Online,C,2/7/2014,695630967,2/8/2014,1516,421.89,364.69,639585.24,552870.04,86715.20
+Sub-Saharan Africa,Kenya,Personal Care,Offline,C,10/26/2011,408785235,11/3/2011,7490,81.73,56.67,612157.70,424458.30,187699.40
+North America,Greenland,Baby Food,Online,L,8/11/2012,612767446,8/29/2012,359,255.28,159.42,91645.52,57231.78,34413.74
+Central America and the Caribbean,The Bahamas,Cosmetics,Offline,C,12/11/2015,151376426,1/29/2016,4503,437.20,263.33,1968711.60,1185774.99,782936.61
+Asia,China,Cosmetics,Offline,H,10/5/2014,188723504,11/6/2014,6334,437.20,263.33,2769224.80,1667932.22,1101292.58
+Europe,Switzerland,Fruits,Online,H,6/8/2014,159232509,7/14/2014,9293,9.33,6.92,86703.69,64307.56,22396.13
+Europe,Serbia,Vegetables,Online,L,10/31/2013,917639768,12/14/2013,8854,154.06,90.93,1364047.24,805094.22,558953.02
+Sub-Saharan Africa,Mali,Vegetables,Online,M,9/1/2016,688994109,9/27/2016,7523,154.06,90.93,1158993.38,684066.39,474926.99
+Middle East and North Africa,Qatar,Cosmetics,Offline,M,7/30/2012,918656861,8/17/2012,9835,437.20,263.33,4299862.00,2589850.55,1710011.45
+Sub-Saharan Africa,Sudan,Household,Online,L,3/13/2011,422301852,4/23/2011,7357,668.27,502.54,4916462.39,3697186.78,1219275.61
+Sub-Saharan Africa,Malawi,Office Supplies,Online,L,8/24/2015,335915410,9/23/2015,3689,651.21,524.96,2402313.69,1936577.44,465736.25
+Europe,Lithuania,Fruits,Online,M,3/9/2011,965796363,3/19/2011,9461,9.33,6.92,88271.13,65470.12,22801.01
+Asia,Bhutan,Personal Care,Online,H,6/4/2014,438556039,6/22/2014,7332,81.73,56.67,599244.36,415504.44,183739.92
+Europe,Bosnia and Herzegovina,Baby Food,Online,L,7/16/2016,551118266,8/15/2016,6997,255.28,159.42,1786194.16,1115461.74,670732.42
+Sub-Saharan Africa,Tanzania,Household,Offline,H,5/5/2017,920719373,6/8/2017,178,668.27,502.54,118952.06,89452.12,29499.94
+Sub-Saharan Africa,The Gambia,Fruits,Offline,L,12/4/2013,334908187,12/11/2013,5630,9.33,6.92,52527.90,38959.60,13568.30
+Sub-Saharan Africa,Guinea,Household,Online,H,1/5/2012,801546037,2/15/2012,4139,668.27,502.54,2765969.53,2080013.06,685956.47
+Middle East and North Africa,Jordan,Office Supplies,Offline,C,8/10/2014,798806750,8/22/2014,3524,651.21,524.96,2294864.04,1849959.04,444905.00
+Middle East and North Africa,Iran,Fruits,Offline,M,8/23/2010,225176656,9/6/2010,3631,9.33,6.92,33877.23,25126.52,8750.71
+Europe,Albania,Office Supplies,Online,M,8/10/2016,849454581,9/6/2016,1342,651.21,524.96,873923.82,704496.32,169427.50
+Sub-Saharan Africa,Zimbabwe,Clothes,Offline,M,3/15/2012,460751855,4/27/2012,5568,109.28,35.84,608471.04,199557.12,408913.92
+Australia and Oceania,Fiji,Cosmetics,Offline,L,4/6/2012,518492305,5/21/2012,2250,437.20,263.33,983700.00,592492.50,391207.50
+Asia,Kazakhstan,Vegetables,Online,L,7/20/2017,302412259,8/17/2017,9363,154.06,90.93,1442463.78,851377.59,591086.19
+Europe,Georgia,Cereal,Offline,M,12/14/2010,962560546,1/8/2011,1911,205.70,117.11,393092.70,223797.21,169295.49
+Sub-Saharan Africa,Senegal,Beverages,Online,C,4/16/2014,569298493,5/19/2014,6930,47.45,31.79,328828.50,220304.70,108523.80
+Australia and Oceania,Federated States of Micronesia,Office Supplies,Offline,H,5/15/2016,863299930,6/20/2016,8488,651.21,524.96,5527470.48,4455860.48,1071610.00
+Sub-Saharan Africa,Zambia,Cereal,Online,L,8/21/2014,505551183,9/23/2014,2684,205.70,117.11,552098.80,314323.24,237775.56
+Europe,Liechtenstein,Vegetables,Offline,H,5/23/2011,927351081,6/2/2011,2647,154.06,90.93,407796.82,240691.71,167105.11
+Australia and Oceania,Vanuatu,Office Supplies,Online,C,7/24/2017,480310952,8/11/2017,3539,651.21,524.96,2304632.19,1857833.44,446798.75
+Central America and the Caribbean,Saint Kitts and Nevis ,Personal Care,Offline,C,1/26/2011,286354625,3/11/2011,7552,81.73,56.67,617224.96,427971.84,189253.12
+Middle East and North Africa,Iran,Snacks,Offline,M,5/5/2016,187718427,6/12/2016,8909,152.58,97.44,1359335.22,868092.96,491242.26
+Sub-Saharan Africa,Niger,Personal Care,Online,H,3/19/2017,996951186,4/30/2017,8865,81.73,56.67,724536.45,502379.55,222156.90
+Sub-Saharan Africa,Eritrea,Office Supplies,Offline,H,9/25/2013,446914231,10/1/2013,707,651.21,524.96,460405.47,371146.72,89258.75
+Europe,Luxembourg,Household,Online,H,10/20/2010,840781390,11/13/2010,4752,668.27,502.54,3175619.04,2388070.08,787548.96
+Middle East and North Africa,Tunisia ,Snacks,Online,M,5/19/2014,502038991,7/8/2014,3349,152.58,97.44,510990.42,326326.56,184663.86
+Asia,North Korea,Snacks,Offline,C,7/27/2012,524485862,8/21/2012,5877,152.58,97.44,896712.66,572654.88,324057.78
+Europe,Spain,Vegetables,Online,H,3/31/2017,722233331,4/6/2017,3747,154.06,90.93,577262.82,340714.71,236548.11
+Sub-Saharan Africa,Burkina Faso,Beverages,Offline,C,11/8/2014,979705226,12/16/2014,5402,47.45,31.79,256324.90,171729.58,84595.32
+North America,Mexico,Cosmetics,Offline,H,8/14/2015,801637876,9/9/2015,1316,437.20,263.33,575355.20,346542.28,228812.92
+Europe,Portugal,Meat,Online,H,11/21/2011,663080108,12/10/2011,8994,421.89,364.69,3794478.66,3280021.86,514456.80
+Sub-Saharan Africa,Burkina Faso,Cosmetics,Offline,H,3/29/2012,659393250,4/22/2012,7971,437.20,263.33,3484921.20,2099003.43,1385917.77
+Sub-Saharan Africa,Niger,Household,Online,M,12/11/2014,956251132,1/20/2015,4815,668.27,502.54,3217720.05,2419730.10,797989.95
+Europe,Poland,Cereal,Online,L,10/7/2011,439640080,11/2/2011,8124,205.70,117.11,1671106.80,951401.64,719705.16
+Europe,Romania,Household,Offline,H,6/19/2014,765858924,7/21/2014,3530,668.27,502.54,2358993.10,1773966.20,585026.90
+Sub-Saharan Africa,Burkina Faso,Fruits,Online,C,2/25/2013,511518990,3/16/2013,8691,9.33,6.92,81087.03,60141.72,20945.31
+Europe,Austria,Cereal,Online,M,5/13/2010,123544108,6/22/2010,8302,205.70,117.11,1707721.40,972247.22,735474.18
+Europe,Latvia,Snacks,Offline,M,4/7/2017,569170606,4/13/2017,9085,152.58,97.44,1386189.30,885242.40,500946.90
+Europe,San Marino,Personal Care,Online,L,1/6/2012,185947310,1/27/2012,4796,81.73,56.67,391977.08,271789.32,120187.76
+Sub-Saharan Africa,Zambia,Clothes,Online,H,9/14/2011,531735551,11/2/2011,1221,109.28,35.84,133430.88,43760.64,89670.24
+Europe,Poland,Vegetables,Online,H,7/19/2015,534709155,9/2/2015,1176,154.06,90.93,181174.56,106933.68,74240.88
+Sub-Saharan Africa,Guinea,Household,Online,H,4/4/2016,543354451,4/28/2016,9511,668.27,502.54,6355915.97,4779657.94,1576258.03
+Sub-Saharan Africa,Togo,Meat,Online,C,5/27/2011,976470267,7/10/2011,8106,421.89,364.69,3419840.34,2956177.14,463663.20
+Sub-Saharan Africa,Guinea-Bissau,Baby Food,Offline,C,10/1/2014,973167932,10/22/2014,872,255.28,159.42,222604.16,139014.24,83589.92
+Sub-Saharan Africa,Djibouti,Household,Online,L,8/20/2014,642871272,9/1/2014,8750,668.27,502.54,5847362.50,4397225.00,1450137.50
+Australia and Oceania,Tonga,Snacks,Offline,H,8/10/2015,615316617,9/18/2015,4716,152.58,97.44,719567.28,459527.04,260040.24
+Asia,Uzbekistan,Personal Care,Offline,L,11/29/2011,690552794,12/7/2011,8772,81.73,56.67,716935.56,497109.24,219826.32
+Sub-Saharan Africa,Cameroon,Cereal,Offline,M,1/4/2014,288941133,2/16/2014,2957,205.70,117.11,608254.90,346294.27,261960.63
+North America,Canada,Vegetables,Offline,L,7/1/2014,701155459,7/2/2014,6337,154.06,90.93,976278.22,576223.41,400054.81
+Europe,Netherlands,Office Supplies,Online,C,8/9/2014,138182103,8/16/2014,10,651.21,524.96,6512.10,5249.60,1262.50
+Central America and the Caribbean,El Salvador,Cereal,Offline,M,11/2/2012,481319892,11/25/2012,2107,205.70,117.11,433409.90,246750.77,186659.13
+Asia,North Korea,Fruits,Offline,M,5/8/2016,532180154,5/31/2016,2789,9.33,6.92,26021.37,19299.88,6721.49
+Middle East and North Africa,Turkey,Personal Care,Online,M,6/2/2014,962686717,6/21/2014,9247,81.73,56.67,755757.31,524027.49,231729.82
+Central America and the Caribbean,The Bahamas,Household,Offline,H,7/15/2012,265075910,8/23/2012,707,668.27,502.54,472466.89,355295.78,117171.11
+Sub-Saharan Africa,Cameroon,Fruits,Offline,L,6/21/2013,601896560,8/6/2013,3422,9.33,6.92,31927.26,23680.24,8247.02
+Middle East and North Africa,Yemen,Household,Offline,C,6/26/2013,156009995,7/14/2013,5679,668.27,502.54,3795105.33,2853924.66,941180.67
+Europe,Bulgaria,Meat,Offline,H,9/10/2013,780590045,10/3/2013,2796,421.89,364.69,1179604.44,1019673.24,159931.20
+Sub-Saharan Africa,Djibouti,Beverages,Offline,H,4/8/2016,349123036,5/17/2016,2120,47.45,31.79,100594.00,67394.80,33199.20
+Sub-Saharan Africa,Mauritania,Vegetables,Offline,C,2/6/2013,405407798,3/11/2013,8031,154.06,90.93,1237255.86,730258.83,506997.03
+Sub-Saharan Africa,Ethiopia,Clothes,Online,M,4/12/2012,313555657,5/20/2012,6942,109.28,35.84,758621.76,248801.28,509820.48
+Asia,Sri Lanka,Office Supplies,Offline,L,8/10/2011,407990443,8/31/2011,2293,651.21,524.96,1493224.53,1203733.28,289491.25
+Europe,Greece,Fruits,Online,L,7/9/2017,643448483,7/25/2017,9560,9.33,6.92,89194.80,66155.20,23039.60
+Europe,Ireland,Office Supplies,Online,C,1/6/2011,144978606,2/19/2011,1246,651.21,524.96,811407.66,654100.16,157307.50
+Sub-Saharan Africa,Tanzania,Meat,Offline,M,1/9/2012,357942140,2/16/2012,1888,421.89,364.69,796528.32,688534.72,107993.60
+Asia,Kazakhstan,Meat,Offline,C,1/10/2015,998012912,1/31/2015,3054,421.89,364.69,1288452.06,1113763.26,174688.80
+Sub-Saharan Africa,South Africa,Baby Food,Online,M,7/30/2015,501177251,8/28/2015,8341,255.28,159.42,2129290.48,1329722.22,799568.26
+Sub-Saharan Africa,Liberia,Clothes,Offline,L,1/29/2014,973733985,3/6/2014,8380,109.28,35.84,915766.40,300339.20,615427.20
+Asia,Taiwan,Fruits,Online,H,1/2/2012,542294442,1/30/2012,5831,9.33,6.92,54403.23,40350.52,14052.71
+North America,Greenland,Baby Food,Offline,H,8/31/2015,103782451,10/1/2015,388,255.28,159.42,99048.64,61854.96,37193.68
+Sub-Saharan Africa,Angola,Vegetables,Offline,H,4/21/2017,175434339,5/26/2017,3774,154.06,90.93,581422.44,343169.82,238252.62
+Europe,Portugal,Household,Online,M,1/4/2014,444798934,1/20/2014,4744,668.27,502.54,3170272.88,2384049.76,786223.12
+Sub-Saharan Africa,Mauritius ,Cosmetics,Offline,L,7/7/2011,219737565,7/21/2011,4083,437.20,263.33,1785087.60,1075176.39,709911.21
+Australia and Oceania,Tonga,Cereal,Online,H,10/25/2012,678424060,11/3/2012,9610,205.70,117.11,1976777.00,1125427.10,851349.90
+Asia,Turkmenistan,Office Supplies,Online,M,6/2/2014,819344747,7/14/2014,1173,651.21,524.96,763869.33,615778.08,148091.25
+Sub-Saharan Africa,Liberia,Vegetables,Online,H,2/5/2010,611298453,3/20/2010,5652,154.06,90.93,870747.12,513936.36,356810.76
+Europe,Liechtenstein,Meat,Online,C,5/31/2017,543396508,6/5/2017,1957,421.89,364.69,825638.73,713698.33,111940.40
+Sub-Saharan Africa,Madagascar,Cereal,Offline,H,5/4/2013,275062739,5/16/2013,6032,205.70,117.11,1240782.40,706407.52,534374.88
+Sub-Saharan Africa,Cameroon,Personal Care,Online,C,10/13/2013,886033475,10/20/2013,5850,81.73,56.67,478120.50,331519.50,146601.00
+Middle East and North Africa,Israel,Beverages,Online,L,10/10/2016,826357543,11/3/2016,6415,47.45,31.79,304391.75,203932.85,100458.90
+Europe,Austria,Meat,Online,H,11/6/2013,866396272,11/16/2013,4765,421.89,364.69,2010305.85,1737747.85,272558.00
+Europe,Ireland,Cereal,Online,H,7/12/2016,946823489,8/30/2016,4966,205.70,117.11,1021506.20,581568.26,439937.94
+Sub-Saharan Africa,Ethiopia,Baby Food,Offline,L,9/8/2014,628625524,10/18/2014,3117,255.28,159.42,795707.76,496912.14,298795.62
+Asia,South Korea,Household,Offline,H,8/14/2010,443101203,9/1/2010,2347,668.27,502.54,1568429.69,1179461.38,388968.31
+Sub-Saharan Africa,Sierra Leone,Vegetables,Online,H,4/5/2015,541861855,5/9/2015,7819,154.06,90.93,1204595.14,710981.67,493613.47
+Asia,Uzbekistan,Office Supplies,Online,H,2/6/2014,246831309,3/5/2014,1724,651.21,524.96,1122686.04,905031.04,217655.00
+Sub-Saharan Africa,Chad,Snacks,Online,C,6/3/2016,300245893,7/19/2016,8287,152.58,97.44,1264430.46,807485.28,456945.18
+Sub-Saharan Africa,Malawi,Snacks,Offline,C,8/19/2013,614654433,9/20/2013,8761,152.58,97.44,1336753.38,853671.84,483081.54
+Central America and the Caribbean,Antigua and Barbuda ,Fruits,Online,H,5/10/2013,722918260,6/16/2013,6433,9.33,6.92,60019.89,44516.36,15503.53
+Europe,San Marino,Cosmetics,Online,H,11/30/2012,228211200,12/3/2012,1620,437.20,263.33,708264.00,426594.60,281669.40
+Australia and Oceania,Samoa ,Vegetables,Offline,L,9/14/2010,154019582,10/18/2010,6672,154.06,90.93,1027888.32,606684.96,421203.36
+Sub-Saharan Africa,Niger,Personal Care,Online,M,7/15/2017,694142234,8/7/2017,967,81.73,56.67,79032.91,54799.89,24233.02
+Sub-Saharan Africa,Gabon,Office Supplies,Offline,C,1/2/2015,762690484,1/28/2015,5918,651.21,524.96,3853860.78,3106713.28,747147.50
+Sub-Saharan Africa,Mali,Household,Online,H,4/6/2012,244088160,5/13/2012,9966,668.27,502.54,6659978.82,5008313.64,1651665.18
+Australia and Oceania,Nauru,Clothes,Offline,L,12/20/2011,443071591,1/1/2012,3585,109.28,35.84,391768.80,128486.40,263282.40
+Central America and the Caribbean,The Bahamas,Cereal,Online,H,1/17/2014,934689605,1/17/2014,4280,205.70,117.11,880396.00,501230.80,379165.20
+Sub-Saharan Africa,South Africa,Cereal,Offline,L,12/3/2011,914303529,12/11/2011,1587,205.70,117.11,326445.90,185853.57,140592.33
+Europe,Vatican City,Cereal,Online,M,6/9/2011,547587192,7/14/2011,2073,205.70,117.11,426416.10,242769.03,183647.07
+Asia,Kyrgyzstan,Fruits,Offline,H,12/7/2011,520526921,1/15/2012,4338,9.33,6.92,40473.54,30018.96,10454.58
+Europe,Italy,Clothes,Online,H,1/10/2010,689421546,1/31/2010,4011,109.28,35.84,438322.08,143754.24,294567.84
+Europe,Croatia,Meat,Online,M,12/21/2010,530882394,2/2/2011,8753,421.89,364.69,3692803.17,3192131.57,500671.60
+Asia,North Korea,Clothes,Online,L,4/19/2017,491833293,4/23/2017,3256,109.28,35.84,355815.68,116695.04,239120.64
+Sub-Saharan Africa,Cameroon,Cereal,Online,H,6/18/2017,639510571,7/9/2017,4244,205.70,117.11,872990.80,497014.84,375975.96
+Sub-Saharan Africa,Comoros,Personal Care,Offline,C,5/3/2012,211463057,6/15/2012,5473,81.73,56.67,447308.29,310154.91,137153.38
+Europe,Slovakia,Snacks,Offline,M,6/10/2011,765552079,7/17/2011,2727,152.58,97.44,416085.66,265718.88,150366.78
+Sub-Saharan Africa,Lesotho,Household,Online,C,12/28/2013,329951465,1/2/2014,8825,668.27,502.54,5897482.75,4434915.50,1462567.25
+Middle East and North Africa,Turkey,Meat,Offline,C,9/11/2012,153147542,9/27/2012,8616,421.89,364.69,3635004.24,3142169.04,492835.20
+Australia and Oceania,Federated States of Micronesia,Baby Food,Offline,H,9/12/2012,653939139,10/6/2012,3978,255.28,159.42,1015503.84,634172.76,381331.08
+Sub-Saharan Africa,Madagascar,Office Supplies,Offline,H,8/15/2012,971437585,10/2/2012,8824,651.21,524.96,5746277.04,4632247.04,1114030.00
+Asia,Turkmenistan,Fruits,Offline,L,12/13/2015,315066707,1/26/2016,4095,9.33,6.92,38206.35,28337.40,9868.95
+Middle East and North Africa,Bahrain,Household,Online,C,1/29/2012,214562833,3/2/2012,2765,668.27,502.54,1847766.55,1389523.10,458243.45
+Europe,Sweden,Baby Food,Offline,M,5/26/2010,469974792,6/17/2010,4840,255.28,159.42,1235555.20,771592.80,463962.40
+Central America and the Caribbean,Saint Vincent and the Grenadines,Fruits,Offline,H,10/22/2013,501663911,11/25/2013,2354,9.33,6.92,21962.82,16289.68,5673.14
+Europe,Slovenia,Personal Care,Offline,M,11/23/2014,700304019,12/21/2014,4376,81.73,56.67,357650.48,247987.92,109662.56
+Sub-Saharan Africa,Mauritania,Snacks,Offline,L,11/21/2014,176881444,12/19/2014,2005,152.58,97.44,305922.90,195367.20,110555.70
+Sub-Saharan Africa,Kenya,Baby Food,Online,H,4/20/2012,812695014,6/4/2012,3369,255.28,159.42,860038.32,537085.98,322952.34
+Europe,Norway,Clothes,Online,H,4/14/2014,509356057,4/17/2014,8631,109.28,35.84,943195.68,309335.04,633860.64
+Europe,Armenia,Baby Food,Offline,M,2/10/2010,838788402,2/26/2010,4983,255.28,159.42,1272060.24,794389.86,477670.38
+Central America and the Caribbean,Honduras,Fruits,Offline,H,11/7/2012,293228375,11/17/2012,1647,9.33,6.92,15366.51,11397.24,3969.27
+Middle East and North Africa,Israel,Cereal,Online,C,2/15/2010,135224807,4/6/2010,4880,205.70,117.11,1003816.00,571496.80,432319.20
+Central America and the Caribbean,Haiti,Cereal,Offline,M,5/5/2013,347639024,5/18/2013,2967,205.70,117.11,610311.90,347465.37,262846.53
+Sub-Saharan Africa,Zambia,Household,Online,C,1/16/2016,983644855,1/31/2016,1226,668.27,502.54,819299.02,616114.04,203184.98
+Australia and Oceania,Solomon Islands,Baby Food,Online,H,10/29/2012,816728627,12/5/2012,7005,255.28,159.42,1788236.40,1116737.10,671499.30
+Asia,Thailand,Personal Care,Offline,C,9/24/2010,490689170,11/9/2010,4684,81.73,56.67,382823.32,265442.28,117381.04
+North America,Canada,Office Supplies,Offline,C,4/10/2010,269637811,5/1/2010,675,651.21,524.96,439566.75,354348.00,85218.75
+Sub-Saharan Africa,Guinea,Clothes,Offline,M,10/28/2016,487998378,12/1/2016,8419,109.28,35.84,920028.32,301736.96,618291.36
+Europe,Bulgaria,Office Supplies,Offline,C,2/9/2014,200507199,2/25/2014,3391,651.21,524.96,2208253.11,1780139.36,428113.75
+Asia,Bhutan,Household,Online,M,5/29/2013,332213103,7/7/2013,8095,668.27,502.54,5409645.65,4068061.30,1341584.35
+Central America and the Caribbean,Honduras,Baby Food,Online,M,12/9/2011,528477418,1/14/2012,7067,255.28,159.42,1804063.76,1126621.14,677442.62
+Europe,Andorra,Meat,Online,M,10/3/2011,504973971,11/2/2011,1875,421.89,364.69,791043.75,683793.75,107250.00
+Asia,Bhutan,Clothes,Online,M,12/25/2015,497689092,12/31/2015,6117,109.28,35.84,668465.76,219233.28,449232.48
+Middle East and North Africa,Somalia,Meat,Online,H,6/13/2017,812921607,7/22/2017,423,421.89,364.69,178459.47,154263.87,24195.60
+Europe,Armenia,Cereal,Offline,H,1/20/2010,477282845,2/4/2010,7455,205.70,117.11,1533493.50,873055.05,660438.45
+Sub-Saharan Africa,Niger,Fruits,Online,C,4/6/2015,387696635,4/16/2015,6905,9.33,6.92,64423.65,47782.60,16641.05
+Europe,Slovakia,Cosmetics,Online,L,3/1/2010,161399304,3/15/2010,496,437.20,263.33,216851.20,130611.68,86239.52
+Middle East and North Africa,Pakistan,Vegetables,Online,M,7/27/2014,385939681,7/29/2014,6983,154.06,90.93,1075800.98,634964.19,440836.79
+Australia and Oceania,East Timor,Snacks,Offline,M,6/28/2011,369179093,7/14/2011,7153,152.58,97.44,1091404.74,696988.32,394416.42
+Sub-Saharan Africa,Rwanda,Baby Food,Offline,L,7/1/2011,389291369,8/4/2011,8822,255.28,159.42,2252080.16,1406403.24,845676.92
+Middle East and North Africa,Afghanistan,Snacks,Offline,L,2/4/2011,344762837,3/24/2011,1840,152.58,97.44,280747.20,179289.60,101457.60
+Europe,Hungary,Office Supplies,Online,H,8/20/2011,204392325,9/26/2011,3086,651.21,524.96,2009634.06,1620026.56,389607.50
+Australia and Oceania,Nauru,Meat,Online,L,7/11/2015,457291162,8/27/2015,1472,421.89,364.69,621022.08,536823.68,84198.40
+Sub-Saharan Africa,Cote d'Ivoire,Cosmetics,Online,C,11/22/2014,762883174,11/29/2014,2939,437.20,263.33,1284930.80,773926.87,511003.93
+Europe,Latvia,Cereal,Offline,M,6/28/2010,400904691,7/12/2010,5462,205.70,117.11,1123533.40,639654.82,483878.58
+Asia,Mongolia,Beverages,Online,H,7/3/2015,521404540,7/4/2015,4045,47.45,31.79,191935.25,128590.55,63344.70
+Sub-Saharan Africa,Kenya,Vegetables,Offline,M,11/19/2013,994744050,12/4/2013,5725,154.06,90.93,881993.50,520574.25,361419.25
+Sub-Saharan Africa,South Africa,Beverages,Offline,M,2/28/2017,861597049,4/9/2017,4568,47.45,31.79,216751.60,145216.72,71534.88
+Central America and the Caribbean,Saint Lucia,Baby Food,Online,H,3/18/2015,582949864,4/10/2015,6674,255.28,159.42,1703738.72,1063969.08,639769.64
+Sub-Saharan Africa,Guinea,Cosmetics,Online,L,4/27/2010,690101325,4/30/2010,5173,437.20,263.33,2261635.60,1362206.09,899429.51
+Sub-Saharan Africa,Malawi,Meat,Offline,L,6/6/2013,434662759,7/5/2013,5224,421.89,364.69,2203953.36,1905140.56,298812.80
+Sub-Saharan Africa,Central African Republic,Office Supplies,Offline,L,1/11/2010,938557994,2/18/2010,9022,651.21,524.96,5875216.62,4736189.12,1139027.50
+Europe,Belgium,Beverages,Offline,L,12/21/2016,244023358,1/22/2017,789,47.45,31.79,37438.05,25082.31,12355.74
+Sub-Saharan Africa,Niger,Fruits,Online,L,7/11/2010,963607680,7/11/2010,1781,9.33,6.92,16616.73,12324.52,4292.21
+Europe,Moldova ,Cosmetics,Online,H,6/13/2013,830172288,7/29/2013,5283,437.20,263.33,2309727.60,1391172.39,918555.21
+Central America and the Caribbean,Grenada,Beverages,Online,M,7/2/2015,346891009,7/12/2015,1613,47.45,31.79,76536.85,51277.27,25259.58
+Sub-Saharan Africa,Gabon,Baby Food,Online,H,1/27/2015,537250173,3/15/2015,3120,255.28,159.42,796473.60,497390.40,299083.20
+Sub-Saharan Africa,Burundi,Office Supplies,Offline,M,5/28/2015,695048606,7/17/2015,9183,651.21,524.96,5980061.43,4820707.68,1159353.75
+Asia,Malaysia,Clothes,Offline,H,3/26/2013,634397637,4/19/2013,1213,109.28,35.84,132556.64,43473.92,89082.72
+Australia and Oceania,Vanuatu,Personal Care,Offline,L,2/23/2010,239721095,3/9/2010,7654,81.73,56.67,625561.42,433752.18,191809.24
+Europe,Moldova ,Meat,Offline,L,5/13/2016,815755307,6/9/2016,8978,421.89,364.69,3787728.42,3274186.82,513541.60
+Sub-Saharan Africa,Cote d'Ivoire,Beverages,Offline,L,9/4/2016,137549102,9/13/2016,2691,47.45,31.79,127687.95,85546.89,42141.06
+Asia,Turkmenistan,Fruits,Online,M,1/28/2012,100463807,2/18/2012,8328,9.33,6.92,77700.24,57629.76,20070.48
+Europe,Austria,Clothes,Online,M,12/23/2015,870173251,12/30/2015,2457,109.28,35.84,268500.96,88058.88,180442.08
+Sub-Saharan Africa,Cote d'Ivoire,Personal Care,Offline,C,7/28/2012,432663762,8/27/2012,3677,81.73,56.67,300521.21,208375.59,92145.62
+Europe,Greece,Baby Food,Online,M,8/19/2013,444234168,9/27/2013,7617,255.28,159.42,1944467.76,1214302.14,730165.62
+Asia,Brunei,Baby Food,Offline,M,10/31/2016,381495797,12/15/2016,1939,255.28,159.42,494987.92,309115.38,185872.54
+Sub-Saharan Africa,South Sudan,Meat,Offline,C,2/17/2017,691372478,4/7/2017,1335,421.89,364.69,563223.15,486861.15,76362.00
+Asia,North Korea,Meat,Offline,M,7/23/2010,541100537,8/6/2010,2528,421.89,364.69,1066537.92,921936.32,144601.60
+Asia,Bhutan,Snacks,Online,L,2/18/2013,968228805,4/3/2013,9274,152.58,97.44,1415026.92,903658.56,511368.36
+Asia,Thailand,Cosmetics,Offline,L,8/27/2011,830618607,8/29/2011,7359,437.20,263.33,3217354.80,1937845.47,1279509.33
+Middle East and North Africa,Iran,Cosmetics,Offline,H,11/27/2012,856443774,1/10/2013,9600,437.20,263.33,4197120.00,2527968.00,1669152.00
+Sub-Saharan Africa,Mali,Meat,Offline,L,3/8/2017,494190633,4/13/2017,845,421.89,364.69,356497.05,308163.05,48334.00
+Asia,Kyrgyzstan,Household,Offline,C,6/21/2014,162658011,7/24/2014,2975,668.27,502.54,1988103.25,1495056.50,493046.75
+Sub-Saharan Africa,South Sudan,Baby Food,Offline,L,12/21/2010,800957238,12/23/2010,9901,255.28,159.42,2527527.28,1578417.42,949109.86
+Central America and the Caribbean,Dominica,Beverages,Offline,C,3/1/2010,718512141,3/4/2010,2564,47.45,31.79,121661.80,81509.56,40152.24
+Europe,Liechtenstein,Clothes,Offline,H,8/4/2016,545059049,8/8/2016,3940,109.28,35.84,430563.20,141209.60,289353.60
+Australia and Oceania,Fiji,Household,Offline,L,12/7/2016,980646789,12/20/2016,4032,668.27,502.54,2694464.64,2026241.28,668223.36
+Sub-Saharan Africa,Botswana,Household,Offline,H,1/29/2014,545636689,2/1/2014,4876,668.27,502.54,3258484.52,2450385.04,808099.48
+Europe,United Kingdom,Baby Food,Offline,M,10/7/2015,530702579,11/9/2015,5541,255.28,159.42,1414506.48,883346.22,531160.26
+Middle East and North Africa,Syria,Meat,Offline,C,8/25/2015,946830785,9/20/2015,7125,421.89,364.69,3005966.25,2598416.25,407550.00
+Asia,China,Cereal,Offline,H,3/29/2012,975320136,5/12/2012,7757,205.70,117.11,1595614.90,908422.27,687192.63
+Sub-Saharan Africa,Zimbabwe,Meat,Offline,M,9/9/2012,317781960,9/20/2012,7599,421.89,364.69,3205942.11,2771279.31,434662.80
+Europe,Iceland,Personal Care,Offline,L,11/7/2013,546140086,12/19/2013,3843,81.73,56.67,314088.39,217782.81,96305.58
+Sub-Saharan Africa,Eritrea,Beverages,Offline,L,8/22/2013,152630841,9/1/2013,5713,47.45,31.79,271081.85,181616.27,89465.58
+Sub-Saharan Africa,Ethiopia,Cosmetics,Offline,M,10/29/2014,399803054,11/30/2014,9463,437.20,263.33,4137223.60,2491891.79,1645331.81
+Asia,Cambodia,Household,Offline,H,9/3/2013,370518052,10/9/2013,3380,668.27,502.54,2258752.60,1698585.20,560167.40
+Central America and the Caribbean,Barbados,Beverages,Offline,C,4/17/2011,117949664,5/24/2011,2782,47.45,31.79,132005.90,88439.78,43566.12
+Europe,Belarus,Vegetables,Offline,M,6/7/2017,215584218,6/21/2017,5016,154.06,90.93,772764.96,456104.88,316660.08
+Europe,Sweden,Cereal,Online,L,5/29/2016,407220542,7/4/2016,4463,205.70,117.11,918039.10,522661.93,395377.17
+Europe,Ireland,Vegetables,Online,L,4/24/2016,956969964,5/27/2016,7533,154.06,90.93,1160533.98,684975.69,475558.29
+Europe,Slovenia,Fruits,Online,L,12/11/2014,399256312,1/5/2015,7670,9.33,6.92,71561.10,53076.40,18484.70
+Europe,Croatia,Snacks,Offline,M,3/3/2011,488815915,4/17/2011,347,152.58,97.44,52945.26,33811.68,19133.58
+Sub-Saharan Africa,Chad,Cereal,Online,M,4/11/2016,350697600,4/23/2016,8068,205.70,117.11,1659587.60,944843.48,714744.12
+Europe,Lithuania,Clothes,Offline,C,4/29/2012,530262696,5/11/2012,5370,109.28,35.84,586833.60,192460.80,394372.80
+Central America and the Caribbean,Barbados,Clothes,Offline,M,7/12/2016,743185031,7/29/2016,3821,109.28,35.84,417558.88,136944.64,280614.24
+Middle East and North Africa,Libya,Household,Online,C,11/9/2016,325450932,11/20/2016,7018,668.27,502.54,4689918.86,3526825.72,1163093.14
+Sub-Saharan Africa,Gabon,Vegetables,Offline,H,9/20/2013,483359229,10/10/2013,5592,154.06,90.93,861503.52,508480.56,353022.96
+Europe,Switzerland,Cosmetics,Online,L,2/26/2016,243521249,3/28/2016,2204,437.20,263.33,963588.80,580379.32,383209.48
+Middle East and North Africa,Jordan,Household,Offline,C,5/3/2015,502860820,5/21/2015,6546,668.27,502.54,4374495.42,3289626.84,1084868.58
+Europe,Iceland,Cosmetics,Online,M,1/27/2011,878614270,2/17/2011,342,437.20,263.33,149522.40,90058.86,59463.54
+Asia,South Korea,Cosmetics,Offline,C,8/9/2015,158330428,8/25/2015,2347,437.20,263.33,1026108.40,618035.51,408072.89
+Asia,Philippines,Clothes,Online,M,12/8/2011,349870622,1/23/2012,3347,109.28,35.84,365760.16,119956.48,245803.68
+Sub-Saharan Africa,Guinea,Cosmetics,Online,M,8/26/2010,831408679,10/2/2010,1159,437.20,263.33,506714.80,305199.47,201515.33
+Middle East and North Africa,Qatar,Office Supplies,Online,H,10/26/2015,601430928,11/26/2015,5632,651.21,524.96,3667614.72,2956574.72,711040.00
+Asia,Brunei,Household,Online,M,8/22/2013,528736197,8/31/2013,3645,668.27,502.54,2435844.15,1831758.30,604085.85
+Central America and the Caribbean,Belize,Clothes,Online,C,2/9/2014,202435815,2/24/2014,4111,109.28,35.84,449250.08,147338.24,301911.84
+Sub-Saharan Africa,Republic of the Congo,Meat,Offline,C,11/30/2016,181953608,12/31/2016,2971,421.89,364.69,1253435.19,1083493.99,169941.20
+Middle East and North Africa,Egypt,Clothes,Offline,M,3/30/2015,647025907,3/30/2015,8199,109.28,35.84,895986.72,293852.16,602134.56
+Asia,Kazakhstan,Cosmetics,Offline,C,9/13/2014,947701537,9/20/2014,4800,437.20,263.33,2098560.00,1263984.00,834576.00
+Europe,Denmark,Vegetables,Offline,H,5/23/2014,954341828,7/11/2014,9809,154.06,90.93,1511174.54,891932.37,619242.17
+Europe,Moldova ,Beverages,Online,H,9/12/2010,607620608,9/20/2010,7296,47.45,31.79,346195.20,231939.84,114255.36
+Central America and the Caribbean,Guatemala,Fruits,Offline,C,3/16/2016,368524205,4/21/2016,3357,9.33,6.92,31320.81,23230.44,8090.37
+North America,United States of America,Snacks,Online,M,6/30/2010,768351447,7/17/2010,1123,152.58,97.44,171347.34,109425.12,61922.22
+Sub-Saharan Africa,Madagascar,Snacks,Offline,M,1/27/2012,158713662,1/28/2012,5754,152.58,97.44,877945.32,560669.76,317275.56
+Europe,Cyprus,Personal Care,Online,L,1/2/2014,561534678,1/29/2014,9445,81.73,56.67,771939.85,535248.15,236691.70
+Australia and Oceania,Nauru,Fruits,Offline,L,6/5/2010,919050824,7/21/2010,6417,9.33,6.92,59870.61,44405.64,15464.97
+Australia and Oceania,East Timor,Snacks,Online,C,6/18/2015,243810927,8/4/2015,7926,152.58,97.44,1209349.08,772309.44,437039.64
+Europe,Hungary,Vegetables,Offline,L,1/6/2014,768676316,2/8/2014,7259,154.06,90.93,1118321.54,660060.87,458260.67
+Sub-Saharan Africa,Liberia,Snacks,Online,C,12/27/2010,296820819,2/10/2011,4731,152.58,97.44,721855.98,460988.64,260867.34
+Central America and the Caribbean,Grenada,Beverages,Offline,C,5/4/2012,751730763,6/11/2012,2693,47.45,31.79,127782.85,85610.47,42172.38
+Central America and the Caribbean,Dominican Republic,Meat,Online,L,9/29/2013,527204978,10/3/2013,523,421.89,364.69,220648.47,190732.87,29915.60
+Europe,Norway,Cosmetics,Offline,L,12/9/2011,337354791,1/28/2012,9634,437.20,263.33,4211984.80,2536921.22,1675063.58
+Middle East and North Africa,Tunisia ,Clothes,Online,M,1/28/2016,966604030,2/16/2016,8467,109.28,35.84,925273.76,303457.28,621816.48
+Australia and Oceania,Papua New Guinea,Office Supplies,Offline,L,8/30/2013,119689023,9/19/2013,7497,651.21,524.96,4882121.37,3935625.12,946496.25
+Australia and Oceania,Federated States of Micronesia,Baby Food,Offline,H,3/16/2012,971658599,5/3/2012,4227,255.28,159.42,1079068.56,673868.34,405200.22
+Europe,Norway,Meat,Offline,M,9/12/2012,917874085,9/23/2012,8194,421.89,364.69,3456966.66,2988269.86,468696.80
+Asia,Sri Lanka,Personal Care,Offline,H,5/31/2013,124009311,6/8/2013,5966,81.73,56.67,487601.18,338093.22,149507.96
+Europe,Poland,Cereal,Online,C,9/8/2013,176050603,10/28/2013,6140,205.70,117.11,1262998.00,719055.40,543942.60
+Europe,Lithuania,Meat,Offline,C,2/20/2010,930296790,3/26/2010,4348,421.89,364.69,1834377.72,1585672.12,248705.60
+Sub-Saharan Africa,Guinea-Bissau,Personal Care,Online,M,8/6/2015,963359200,8/30/2015,8250,81.73,56.67,674272.50,467527.50,206745.00
+Sub-Saharan Africa,Ghana,Meat,Offline,L,6/10/2017,722161662,6/29/2017,2539,421.89,364.69,1071178.71,925947.91,145230.80
+Europe,Romania,Cereal,Online,L,9/14/2011,273940503,10/19/2011,3937,205.70,117.11,809840.90,461062.07,348778.83
+Europe,Greece,Fruits,Offline,C,5/28/2014,656244552,6/19/2014,6201,9.33,6.92,57855.33,42910.92,14944.41
+Sub-Saharan Africa,Namibia,Personal Care,Offline,M,5/3/2012,726935136,6/19/2012,5116,81.73,56.67,418130.68,289923.72,128206.96
+Central America and the Caribbean,Nicaragua,Beverages,Online,L,4/19/2012,314186084,4/30/2012,3499,47.45,31.79,166027.55,111233.21,54794.34
+Europe,Macedonia,Household,Online,C,7/28/2014,666483724,8/31/2014,6199,668.27,502.54,4142605.73,3115245.46,1027360.27
+Middle East and North Africa,Saudi Arabia,Meat,Online,C,9/19/2016,402626883,10/8/2016,5097,421.89,364.69,2150373.33,1858824.93,291548.40
+Asia,China,Clothes,Online,M,5/14/2017,461726891,6/19/2017,4103,109.28,35.84,448375.84,147051.52,301324.32
+Asia,Sri Lanka,Snacks,Offline,L,6/4/2012,953207576,7/15/2012,4159,152.58,97.44,634580.22,405252.96,229327.26
+Sub-Saharan Africa,Chad,Baby Food,Online,L,1/4/2014,706805264,1/7/2014,8239,255.28,159.42,2103251.92,1313461.38,789790.54
+Europe,Malta,Meat,Online,H,5/15/2016,422568786,6/17/2016,6349,421.89,364.69,2678579.61,2315416.81,363162.80
+Sub-Saharan Africa,The Gambia,Vegetables,Offline,L,10/28/2014,420859467,10/28/2014,524,154.06,90.93,80727.44,47647.32,33080.12
+Central America and the Caribbean,Guatemala,Personal Care,Offline,C,2/8/2017,192351138,2/24/2017,9831,81.73,56.67,803487.63,557122.77,246364.86
+Sub-Saharan Africa,Equatorial Guinea,Vegetables,Online,H,11/17/2016,648030126,11/19/2016,5370,154.06,90.93,827302.20,488294.10,339008.10
+Europe,Denmark,Vegetables,Online,L,8/26/2012,969195258,9/17/2012,5269,154.06,90.93,811742.14,479110.17,332631.97
+Europe,Netherlands,Office Supplies,Online,C,7/29/2011,857457864,9/16/2011,9691,651.21,524.96,6310876.11,5087387.36,1223488.75
+North America,Canada,Office Supplies,Online,M,6/29/2010,984741771,8/13/2010,5828,651.21,524.96,3795251.88,3059466.88,735785.00
+Australia and Oceania,East Timor,Snacks,Online,H,11/26/2014,743283307,1/4/2015,2903,152.58,97.44,442939.74,282868.32,160071.42
+Europe,Hungary,Vegetables,Online,M,6/5/2012,495631301,7/18/2012,7171,154.06,90.93,1104764.26,652059.03,452705.23
+Europe,Slovakia,Office Supplies,Offline,H,6/23/2014,224647080,7/30/2014,6918,651.21,524.96,4505070.78,3631673.28,873397.50
+Europe,Armenia,Office Supplies,Offline,H,8/3/2014,883504474,9/8/2014,7462,651.21,524.96,4859329.02,3917251.52,942077.50
+Sub-Saharan Africa,Botswana,Clothes,Online,C,12/9/2014,345689809,12/28/2014,6151,109.28,35.84,672181.28,220451.84,451729.44
+Australia and Oceania,Federated States of Micronesia,Clothes,Online,M,12/26/2014,155001914,12/30/2014,7366,109.28,35.84,804956.48,263997.44,540959.04
+Europe,Austria,Office Supplies,Offline,C,4/3/2015,575552117,4/26/2015,7516,651.21,524.96,4894494.36,3945599.36,948895.00
+Europe,Andorra,Baby Food,Offline,H,7/15/2013,141764247,8/29/2013,46,255.28,159.42,11742.88,7333.32,4409.56
+Europe,Italy,Vegetables,Offline,M,4/11/2016,608374631,4/12/2016,428,154.06,90.93,65937.68,38918.04,27019.64
+Europe,Portugal,Household,Online,L,1/17/2012,200432097,1/31/2012,1167,668.27,502.54,779871.09,586464.18,193406.91
+Middle East and North Africa,United Arab Emirates,Household,Online,L,3/10/2013,363297975,3/27/2013,6799,668.27,502.54,4543567.73,3416769.46,1126798.27
+Australia and Oceania,Australia,Cosmetics,Offline,L,3/16/2014,812646090,4/17/2014,8892,437.20,263.33,3887582.40,2341530.36,1546052.04
+Europe,Romania,Snacks,Offline,M,8/21/2010,884462773,10/5/2010,1044,152.58,97.44,159293.52,101727.36,57566.16
+Europe,Czech Republic,Office Supplies,Offline,M,6/19/2010,885046851,7/19/2010,3886,651.21,524.96,2530602.06,2039994.56,490607.50
+Sub-Saharan Africa,Mali,Vegetables,Offline,L,2/25/2015,741009652,3/21/2015,78,154.06,90.93,12016.68,7092.54,4924.14
+Central America and the Caribbean,Guatemala,Fruits,Online,M,11/18/2015,449275004,11/21/2015,9313,9.33,6.92,86890.29,64445.96,22444.33
+Europe,Czech Republic,Vegetables,Online,M,6/14/2012,527079236,6/20/2012,3314,154.06,90.93,510554.84,301342.02,209212.82
+Australia and Oceania,Marshall Islands,Cosmetics,Offline,L,2/9/2017,661971175,2/18/2017,836,437.20,263.33,365499.20,220143.88,145355.32
+Europe,Denmark,Clothes,Online,C,11/9/2012,161812150,11/12/2012,2666,109.28,35.84,291340.48,95549.44,195791.04
+Sub-Saharan Africa,Gabon,Office Supplies,Online,L,4/12/2010,204775989,4/29/2010,6620,651.21,524.96,4311010.20,3475235.20,835775.00
+Europe,Hungary,Cosmetics,Offline,H,6/10/2013,689349019,7/23/2013,2548,437.20,263.33,1113985.60,670964.84,443020.76
+Sub-Saharan Africa,Democratic Republic of the Congo,Cosmetics,Offline,H,2/15/2016,684330070,2/25/2016,7330,437.20,263.33,3204676.00,1930208.90,1274467.10
+Middle East and North Africa,Syria,Cereal,Online,M,3/2/2013,678830468,3/15/2013,9876,205.70,117.11,2031493.20,1156578.36,874914.84
+Sub-Saharan Africa,Ghana,Baby Food,Offline,H,11/3/2011,332274043,12/5/2011,6128,255.28,159.42,1564355.84,976925.76,587430.08
+Asia,Bhutan,Personal Care,Online,M,11/23/2012,724397122,12/7/2012,4061,81.73,56.67,331905.53,230136.87,101768.66
+Asia,Laos,Personal Care,Online,H,5/16/2014,305248534,6/26/2014,8679,81.73,56.67,709334.67,491838.93,217495.74
+Australia and Oceania,Nauru,Meat,Offline,M,5/17/2015,745189607,5/26/2015,7019,421.89,364.69,2961245.91,2559759.11,401486.80
+Asia,Kazakhstan,Cereal,Offline,H,4/11/2012,184894168,4/16/2012,3148,205.70,117.11,647543.60,368662.28,278881.32
+Central America and the Caribbean,Panama,Household,Online,C,2/6/2010,885348546,3/4/2010,3164,668.27,502.54,2114406.28,1590036.56,524369.72
+Europe,Italy,Household,Offline,M,2/22/2011,677851569,3/2/2011,198,668.27,502.54,132317.46,99502.92,32814.54
+Sub-Saharan Africa,Senegal,Vegetables,Online,L,3/11/2011,614014565,3/13/2011,9410,154.06,90.93,1449704.60,855651.30,594053.30
+Asia,Bangladesh,Baby Food,Online,C,11/19/2010,915761363,1/3/2011,2992,255.28,159.42,763797.76,476984.64,286813.12
+Sub-Saharan Africa,Benin,Clothes,Online,H,12/4/2011,525328290,1/11/2012,5170,109.28,35.84,564977.60,185292.80,379684.80
+Asia,Mongolia,Household,Offline,M,4/19/2013,255264174,5/10/2013,7197,668.27,502.54,4809539.19,3616780.38,1192758.81
+Europe,Hungary,Clothes,Offline,H,1/21/2015,538430345,3/10/2015,2359,109.28,35.84,257791.52,84546.56,173244.96
+Asia,Kazakhstan,Beverages,Online,C,7/9/2014,978000628,7/16/2014,974,47.45,31.79,46216.30,30963.46,15252.84
+Europe,Switzerland,Beverages,Online,H,1/30/2010,797461354,2/5/2010,5391,47.45,31.79,255802.95,171379.89,84423.06
+Central America and the Caribbean,Barbados,Clothes,Offline,C,7/23/2012,190611350,8/29/2012,4989,109.28,35.84,545197.92,178805.76,366392.16
+Sub-Saharan Africa,Tanzania,Snacks,Online,M,2/11/2011,771561944,2/15/2011,1180,152.58,97.44,180044.40,114979.20,65065.20
+Central America and the Caribbean,Belize,Baby Food,Online,L,11/26/2014,624736964,11/28/2014,2406,255.28,159.42,614203.68,383564.52,230639.16
+Central America and the Caribbean,Barbados,Personal Care,Online,H,6/9/2011,154872739,7/20/2011,9140,81.73,56.67,747012.20,517963.80,229048.40
+Middle East and North Africa,Somalia,Cosmetics,Online,H,10/14/2015,737018096,10/27/2015,8888,437.20,263.33,3885833.60,2340477.04,1545356.56
+Sub-Saharan Africa,Niger,Baby Food,Offline,C,10/19/2013,666534364,11/18/2013,1185,255.28,159.42,302506.80,188912.70,113594.10
+Australia and Oceania,Tuvalu,Personal Care,Offline,C,4/30/2011,109095370,6/6/2011,2599,81.73,56.67,212416.27,147285.33,65130.94
+Middle East and North Africa,Syria,Snacks,Offline,M,4/11/2015,650687444,5/28/2015,1729,152.58,97.44,263810.82,168473.76,95337.06
+Europe,Switzerland,Cosmetics,Offline,C,9/10/2014,347609412,9/17/2014,4205,437.20,263.33,1838426.00,1107302.65,731123.35
+Central America and the Caribbean,Grenada,Office Supplies,Offline,C,10/30/2014,476472604,12/1/2014,7687,651.21,524.96,5005851.27,4035367.52,970483.75
+Sub-Saharan Africa,Republic of the Congo,Clothes,Online,C,8/25/2010,584200847,9/13/2010,6868,109.28,35.84,750535.04,246149.12,504385.92
+Australia and Oceania,Nauru,Beverages,Offline,M,4/27/2013,738030469,5/31/2013,8471,47.45,31.79,401948.95,269293.09,132655.86
+Sub-Saharan Africa,Lesotho,Snacks,Online,H,2/23/2016,175510299,3/23/2016,6252,152.58,97.44,953930.16,609194.88,344735.28
+Central America and the Caribbean,El Salvador,Fruits,Offline,M,6/30/2013,454501664,7/18/2013,5997,9.33,6.92,55952.01,41499.24,14452.77
+Middle East and North Africa,Afghanistan,Snacks,Offline,M,2/29/2012,503178393,3/6/2012,523,152.58,97.44,79799.34,50961.12,28838.22
+Asia,Myanmar,Baby Food,Online,M,6/6/2012,670026814,6/15/2012,4679,255.28,159.42,1194455.12,745926.18,448528.94
+Europe,Russia,Personal Care,Offline,H,11/12/2011,473845756,12/16/2011,344,81.73,56.67,28115.12,19494.48,8620.64
+Middle East and North Africa,Qatar,Clothes,Online,L,8/29/2016,853746545,10/15/2016,1430,109.28,35.84,156270.40,51251.20,105019.20
+Sub-Saharan Africa,Cameroon,Beverages,Offline,L,2/27/2015,119153010,3/5/2015,8878,47.45,31.79,421261.10,282231.62,139029.48
+Asia,Malaysia,Office Supplies,Offline,L,11/25/2011,699801480,12/26/2011,5664,651.21,524.96,3688453.44,2973373.44,715080.00
+Australia and Oceania,Samoa ,Meat,Online,C,4/12/2016,595740783,5/13/2016,1791,421.89,364.69,755604.99,653159.79,102445.20
+Sub-Saharan Africa,Zambia,Cereal,Online,M,1/16/2016,127332246,2/11/2016,9296,205.70,117.11,1912187.20,1088654.56,823532.64
+Sub-Saharan Africa,Gabon,Office Supplies,Online,M,5/9/2011,585249698,6/5/2011,7246,651.21,524.96,4718667.66,3803860.16,914807.50
+Europe,Belarus,Vegetables,Online,C,1/5/2011,180479466,1/12/2011,6740,154.06,90.93,1038364.40,612868.20,425496.20
+Sub-Saharan Africa,Chad,Snacks,Offline,M,7/16/2013,794320380,8/12/2013,5907,152.58,97.44,901290.06,575578.08,325711.98
+Asia,Indonesia,Personal Care,Offline,L,12/5/2010,328383767,12/18/2010,4909,81.73,56.67,401212.57,278193.03,123019.54
+Sub-Saharan Africa,Eritrea,Office Supplies,Online,H,3/7/2015,354593455,4/3/2015,938,651.21,524.96,610834.98,492412.48,118422.50
+Middle East and North Africa,Iran,Beverages,Offline,H,8/21/2016,265185773,10/5/2016,3218,47.45,31.79,152694.10,102300.22,50393.88
+Asia,South Korea,Clothes,Online,M,7/3/2010,422709548,8/4/2010,8004,109.28,35.84,874677.12,286863.36,587813.76
+Asia,Cambodia,Vegetables,Offline,L,10/3/2015,810026109,10/18/2015,3581,154.06,90.93,551688.86,325620.33,226068.53
+Asia,Laos,Cosmetics,Offline,L,10/13/2010,580309283,10/25/2010,5268,437.20,263.33,2303169.60,1387222.44,915947.16
+Asia,Sri Lanka,Office Supplies,Online,C,12/1/2012,307045400,12/2/2012,412,651.21,524.96,268298.52,216283.52,52015.00
+Europe,Norway,Personal Care,Offline,M,1/14/2014,634033286,1/15/2014,3394,81.73,56.67,277391.62,192337.98,85053.64
+Middle East and North Africa,United Arab Emirates,Household,Online,H,8/31/2014,925384271,10/12/2014,625,668.27,502.54,417668.75,314087.50,103581.25
+Asia,Thailand,Snacks,Online,C,8/8/2012,615522181,9/20/2012,5547,152.58,97.44,846361.26,540499.68,305861.58
+Europe,Ukraine,Cereal,Offline,L,4/14/2014,559183347,5/21/2014,3633,205.70,117.11,747308.10,425460.63,321847.47
+Europe,Armenia,Meat,Offline,M,11/9/2015,781416594,12/23/2015,7390,421.89,364.69,3117767.10,2695059.10,422708.00
+Middle East and North Africa,Iran,Clothes,Offline,L,7/11/2014,927583253,8/30/2014,1352,109.28,35.84,147746.56,48455.68,99290.88
+Europe,Denmark,Clothes,Offline,H,5/9/2012,713357150,6/3/2012,7088,109.28,35.84,774576.64,254033.92,520542.72
+Sub-Saharan Africa,Liberia,Cosmetics,Offline,M,6/17/2012,374724614,6/23/2012,8195,437.20,263.33,3582854.00,2157989.35,1424864.65
+Australia and Oceania,New Zealand,Household,Offline,C,4/3/2015,217984473,4/20/2015,5305,668.27,502.54,3545172.35,2665974.70,879197.65
+Middle East and North Africa,Azerbaijan,Clothes,Offline,L,8/17/2014,169748055,10/2/2014,1077,109.28,35.84,117694.56,38599.68,79094.88
+Asia,Myanmar,Baby Food,Offline,H,11/23/2016,226939189,12/10/2016,5204,255.28,159.42,1328477.12,829621.68,498855.44
+Europe,Finland,Clothes,Online,L,4/22/2014,906794202,5/11/2014,9410,109.28,35.84,1028324.80,337254.40,691070.40
+Sub-Saharan Africa,Tanzania,Vegetables,Online,L,7/8/2011,996861922,8/7/2011,2450,154.06,90.93,377447.00,222778.50,154668.50
diff --git a/freemarker-generator-cli/site/sample/csv/transactions.csv b/freemarker-generator-cli/site/sample/csv/transactions.csv
new file mode 100755
index 0000000..62311ef
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/csv/transactions.csv
@@ -0,0 +1,101 @@
+Region	Country	Item Type	Sales Channel	Order Priority	Order Date	Order ID	Ship Date	Units Sold	Unit Price	Unit Cost	Total Revenue	Total Cost	Total Profit
+Australia and Oceania	Tuvalu	Baby Food	Offline	H	5/28/2010	669165933	6/27/2010	9925	255.28	159.42	2533654.00	1582243.50	951410.50
+Central America and the Caribbean	Grenada	Cereal	Online	C	8/22/2012	963881480	9/15/2012	2804	205.70	117.11	576782.80	328376.44	248406.36
+Europe	Russia	Office Supplies	Offline	L	5/2/2014	341417157	5/8/2014	1779	651.21	524.96	1158502.59	933903.84	224598.75
+Sub-Saharan Africa	Sao Tome and Principe	Fruits	Online	C	6/20/2014	514321792	7/5/2014	8102	9.33	6.92	75591.66	56065.84	19525.82
+Sub-Saharan Africa	Rwanda	Office Supplies	Offline	L	2/1/2013	115456712	2/6/2013	5062	651.21	524.96	3296425.02	2657347.52	639077.50
+Australia and Oceania	Solomon Islands	Baby Food	Online	C	2/4/2015	547995746	2/21/2015	2974	255.28	159.42	759202.72	474115.08	285087.64
+Sub-Saharan Africa	Angola	Household	Offline	M	4/23/2011	135425221	4/27/2011	4187	668.27	502.54	2798046.49	2104134.98	693911.51
+Sub-Saharan Africa	Burkina Faso	Vegetables	Online	H	7/17/2012	871543967	7/27/2012	8082	154.06	90.93	1245112.92	734896.26	510216.66
+Sub-Saharan Africa	Republic of the Congo	Personal Care	Offline	M	7/14/2015	770463311	8/25/2015	6070	81.73	56.67	496101.10	343986.90	152114.20
+Sub-Saharan Africa	Senegal	Cereal	Online	H	4/18/2014	616607081	5/30/2014	6593	205.70	117.11	1356180.10	772106.23	584073.87
+Asia	Kyrgyzstan	Vegetables	Online	H	6/24/2011	814711606	7/12/2011	124	154.06	90.93	19103.44	11275.32	7828.12
+Sub-Saharan Africa	Cape Verde	Clothes	Offline	H	8/2/2014	939825713	8/19/2014	4168	109.28	35.84	455479.04	149381.12	306097.92
+Asia	Bangladesh	Clothes	Online	L	1/13/2017	187310731	3/1/2017	8263	109.28	35.84	902980.64	296145.92	606834.72
+Central America and the Caribbean	Honduras	Household	Offline	H	2/8/2017	522840487	2/13/2017	8974	668.27	502.54	5997054.98	4509793.96	1487261.02
+Asia	Mongolia	Personal Care	Offline	C	2/19/2014	832401311	2/23/2014	4901	81.73	56.67	400558.73	277739.67	122819.06
+Europe	Bulgaria	Clothes	Online	M	4/23/2012	972292029	6/3/2012	1673	109.28	35.84	182825.44	59960.32	122865.12
+Asia	Sri Lanka	Cosmetics	Offline	M	11/19/2016	419123971	12/18/2016	6952	437.20	263.33	3039414.40	1830670.16	1208744.24
+Sub-Saharan Africa	Cameroon	Beverages	Offline	C	4/1/2015	519820964	4/18/2015	5430	47.45	31.79	257653.50	172619.70	85033.80
+Asia	Turkmenistan	Household	Offline	L	12/30/2010	441619336	1/20/2011	3830	668.27	502.54	2559474.10	1924728.20	634745.90
+Australia and Oceania	East Timor	Meat	Online	L	7/31/2012	322067916	9/11/2012	5908	421.89	364.69	2492526.12	2154588.52	337937.60
+Europe	Norway	Baby Food	Online	L	5/14/2014	819028031	6/28/2014	7450	255.28	159.42	1901836.00	1187679.00	714157.00
+Europe	Portugal	Baby Food	Online	H	7/31/2015	860673511	9/3/2015	1273	255.28	159.42	324971.44	202941.66	122029.78
+Central America and the Caribbean	Honduras	Snacks	Online	L	6/30/2016	795490682	7/26/2016	2225	152.58	97.44	339490.50	216804.00	122686.50
+Australia and Oceania	New Zealand	Fruits	Online	H	9/8/2014	142278373	10/4/2014	2187	9.33	6.92	20404.71	15134.04	5270.67
+Europe	Moldova 	Personal Care	Online	L	5/7/2016	740147912	5/10/2016	5070	81.73	56.67	414371.10	287316.90	127054.20
+Europe	France	Cosmetics	Online	H	5/22/2017	898523128	6/5/2017	1815	437.20	263.33	793518.00	477943.95	315574.05
+Australia and Oceania	Kiribati	Fruits	Online	M	10/13/2014	347140347	11/10/2014	5398	9.33	6.92	50363.34	37354.16	13009.18
+Sub-Saharan Africa	Mali	Fruits	Online	L	5/7/2010	686048400	5/10/2010	5822	9.33	6.92	54319.26	40288.24	14031.02
+Europe	Norway	Beverages	Offline	C	7/18/2014	435608613	7/30/2014	5124	47.45	31.79	243133.80	162891.96	80241.84
+Sub-Saharan Africa	The Gambia	Household	Offline	L	5/26/2012	886494815	6/9/2012	2370	668.27	502.54	1583799.90	1191019.80	392780.10
+Europe	Switzerland	Cosmetics	Offline	M	9/17/2012	249693334	10/20/2012	8661	437.20	263.33	3786589.20	2280701.13	1505888.07
+Sub-Saharan Africa	South Sudan	Personal Care	Offline	C	12/29/2013	406502997	1/28/2014	2125	81.73	56.67	173676.25	120423.75	53252.50
+Australia and Oceania	Australia	Office Supplies	Online	C	10/27/2015	158535134	11/25/2015	2924	651.21	524.96	1904138.04	1534983.04	369155.00
+Asia	Myanmar	Household	Offline	H	1/16/2015	177713572	3/1/2015	8250	668.27	502.54	5513227.50	4145955.00	1367272.50
+Sub-Saharan Africa	Djibouti	Snacks	Online	M	2/25/2017	756274640	2/25/2017	7327	152.58	97.44	1117953.66	713942.88	404010.78
+Central America and the Caribbean	Costa Rica	Personal Care	Offline	L	5/8/2017	456767165	5/21/2017	6409	81.73	56.67	523807.57	363198.03	160609.54
+Middle East and North Africa	Syria	Fruits	Online	L	11/22/2011	162052476	12/3/2011	3784	9.33	6.92	35304.72	26185.28	9119.44
+Sub-Saharan Africa	The Gambia	Meat	Online	M	1/14/2017	825304400	1/23/2017	4767	421.89	364.69	2011149.63	1738477.23	272672.40
+Asia	Brunei	Office Supplies	Online	L	4/1/2012	320009267	5/8/2012	6708	651.21	524.96	4368316.68	3521431.68	846885.00
+Europe	Bulgaria	Office Supplies	Online	M	2/16/2012	189965903	2/28/2012	3987	651.21	524.96	2596374.27	2093015.52	503358.75
+Sub-Saharan Africa	Niger	Personal Care	Online	H	3/11/2017	699285638	3/28/2017	3015	81.73	56.67	246415.95	170860.05	75555.90
+Middle East and North Africa	Azerbaijan	Cosmetics	Online	M	2/6/2010	382392299	2/25/2010	7234	437.20	263.33	3162704.80	1904929.22	1257775.58
+Sub-Saharan Africa	The Gambia	Cereal	Offline	H	6/7/2012	994022214	6/8/2012	2117	205.70	117.11	435466.90	247921.87	187545.03
+Europe	Slovakia	Vegetables	Online	H	10/6/2012	759224212	11/10/2012	171	154.06	90.93	26344.26	15549.03	10795.23
+Asia	Myanmar	Clothes	Online	H	11/14/2015	223359620	11/18/2015	5930	109.28	35.84	648030.40	212531.20	435499.20
+Sub-Saharan Africa	Comoros	Cereal	Offline	H	3/29/2016	902102267	4/29/2016	962	205.70	117.11	197883.40	112659.82	85223.58
+Europe	Iceland	Cosmetics	Online	C	12/31/2016	331438481	12/31/2016	8867	437.20	263.33	3876652.40	2334947.11	1541705.29
+Europe	Switzerland	Personal Care	Online	M	12/23/2010	617667090	1/31/2011	273	81.73	56.67	22312.29	15470.91	6841.38
+Europe	Macedonia	Clothes	Offline	C	10/14/2014	787399423	11/14/2014	7842	109.28	35.84	856973.76	281057.28	575916.48
+Sub-Saharan Africa	Mauritania	Office Supplies	Offline	C	1/11/2012	837559306	1/13/2012	1266	651.21	524.96	824431.86	664599.36	159832.50
+Europe	Albania	Clothes	Online	C	2/2/2010	385383069	3/18/2010	2269	109.28	35.84	247956.32	81320.96	166635.36
+Sub-Saharan Africa	Lesotho	Fruits	Online	L	8/18/2013	918419539	9/18/2013	9606	9.33	6.92	89623.98	66473.52	23150.46
+Middle East and North Africa	Saudi Arabia	Cereal	Online	M	3/25/2013	844530045	3/28/2013	4063	205.70	117.11	835759.10	475817.93	359941.17
+Sub-Saharan Africa	Sierra Leone	Office Supplies	Offline	M	11/26/2011	441888415	1/7/2012	3457	651.21	524.96	2251232.97	1814786.72	436446.25
+Sub-Saharan Africa	Sao Tome and Principe	Fruits	Offline	H	9/17/2013	508980977	10/24/2013	7637	9.33	6.92	71253.21	52848.04	18405.17
+Sub-Saharan Africa	Cote d'Ivoire	Clothes	Online	C	6/8/2012	114606559	6/27/2012	3482	109.28	35.84	380512.96	124794.88	255718.08
+Australia and Oceania	Fiji	Clothes	Offline	C	6/30/2010	647876489	8/1/2010	9905	109.28	35.84	1082418.40	354995.20	727423.20
+Europe	Austria	Cosmetics	Offline	H	2/23/2015	868214595	3/2/2015	2847	437.20	263.33	1244708.40	749700.51	495007.89
+Europe	United Kingdom	Household	Online	L	1/5/2012	955357205	2/14/2012	282	668.27	502.54	188452.14	141716.28	46735.86
+Sub-Saharan Africa	Djibouti	Cosmetics	Offline	H	4/7/2014	259353148	4/19/2014	7215	437.20	263.33	3154398.00	1899925.95	1254472.05
+Australia and Oceania	Australia	Cereal	Offline	H	6/9/2013	450563752	7/2/2013	682	205.70	117.11	140287.40	79869.02	60418.38
+Europe	San Marino	Baby Food	Online	L	6/26/2013	569662845	7/1/2013	4750	255.28	159.42	1212580.00	757245.00	455335.00
+Sub-Saharan Africa	Cameroon	Office Supplies	Online	M	11/7/2011	177636754	11/15/2011	5518	651.21	524.96	3593376.78	2896729.28	696647.50
+Middle East and North Africa	Libya	Clothes	Offline	H	10/30/2010	705784308	11/17/2010	6116	109.28	35.84	668356.48	219197.44	449159.04
+Central America and the Caribbean	Haiti	Cosmetics	Offline	H	10/13/2013	505716836	11/16/2013	1705	437.20	263.33	745426.00	448977.65	296448.35
+Sub-Saharan Africa	Rwanda	Cosmetics	Offline	H	10/11/2013	699358165	11/25/2013	4477	437.20	263.33	1957344.40	1178928.41	778415.99
+Sub-Saharan Africa	Gabon	Personal Care	Offline	L	7/8/2012	228944623	7/9/2012	8656	81.73	56.67	707454.88	490535.52	216919.36
+Central America and the Caribbean	Belize	Clothes	Offline	M	7/25/2016	807025039	9/7/2016	5498	109.28	35.84	600821.44	197048.32	403773.12
+Europe	Lithuania	Office Supplies	Offline	H	10/24/2010	166460740	11/17/2010	8287	651.21	524.96	5396577.27	4350343.52	1046233.75
+Sub-Saharan Africa	Madagascar	Clothes	Offline	L	4/25/2015	610425555	5/28/2015	7342	109.28	35.84	802333.76	263137.28	539196.48
+Asia	Turkmenistan	Office Supplies	Online	M	4/23/2013	462405812	5/20/2013	5010	651.21	524.96	3262562.10	2630049.60	632512.50
+Middle East and North Africa	Libya	Fruits	Online	L	8/14/2015	816200339	9/30/2015	673	9.33	6.92	6279.09	4657.16	1621.93
+Sub-Saharan Africa	Democratic Republic of the Congo	Beverages	Online	C	5/26/2011	585920464	7/15/2011	5741	47.45	31.79	272410.45	182506.39	89904.06
+Sub-Saharan Africa	Djibouti	Cereal	Online	H	5/20/2017	555990016	6/17/2017	8656	205.70	117.11	1780539.20	1013704.16	766835.04
+Middle East and North Africa	Pakistan	Cosmetics	Offline	L	7/5/2013	231145322	8/16/2013	9892	437.20	263.33	4324782.40	2604860.36	1719922.04
+North America	Mexico	Household	Offline	C	11/6/2014	986435210	12/12/2014	6954	668.27	502.54	4647149.58	3494663.16	1152486.42
+Australia and Oceania	Federated States of Micronesia	Beverages	Online	C	10/28/2014	217221009	11/15/2014	9379	47.45	31.79	445033.55	298158.41	146875.14
+Asia	Laos	Vegetables	Offline	C	9/15/2011	789176547	10/23/2011	3732	154.06	90.93	574951.92	339350.76	235601.16
+Europe	Monaco	Baby Food	Offline	H	5/29/2012	688288152	6/2/2012	8614	255.28	159.42	2198981.92	1373243.88	825738.04
+Australia and Oceania	Samoa 	Cosmetics	Online	H	7/20/2013	670854651	8/7/2013	9654	437.20	263.33	4220728.80	2542187.82	1678540.98
+Europe	Spain	Household	Offline	L	10/21/2012	213487374	11/30/2012	4513	668.27	502.54	3015902.51	2267963.02	747939.49
+Middle East and North Africa	Lebanon	Clothes	Online	L	9/18/2012	663110148	10/8/2012	7884	109.28	35.84	861563.52	282562.56	579000.96
+Middle East and North Africa	Iran	Cosmetics	Online	H	11/15/2016	286959302	12/8/2016	6489	437.20	263.33	2836990.80	1708748.37	1128242.43
+Sub-Saharan Africa	Zambia	Snacks	Online	L	1/4/2011	122583663	1/5/2011	4085	152.58	97.44	623289.30	398042.40	225246.90
+Sub-Saharan Africa	Kenya	Vegetables	Online	L	3/18/2012	827844560	4/7/2012	6457	154.06	90.93	994765.42	587135.01	407630.41
+North America	Mexico	Personal Care	Offline	L	2/17/2012	430915820	3/20/2012	6422	81.73	56.67	524870.06	363934.74	160935.32
+Sub-Saharan Africa	Sao Tome and Principe	Beverages	Offline	C	1/16/2011	180283772	1/21/2011	8829	47.45	31.79	418936.05	280673.91	138262.14
+Sub-Saharan Africa	The Gambia	Baby Food	Offline	M	2/3/2014	494747245	3/20/2014	5559	255.28	159.42	1419101.52	886215.78	532885.74
+Middle East and North Africa	Kuwait	Fruits	Online	M	4/30/2012	513417565	5/18/2012	522	9.33	6.92	4870.26	3612.24	1258.02
+Europe	Slovenia	Beverages	Offline	C	10/23/2016	345718562	11/25/2016	4660	47.45	31.79	221117.00	148141.40	72975.60
+Sub-Saharan Africa	Sierra Leone	Office Supplies	Offline	H	12/6/2016	621386563	12/14/2016	948	651.21	524.96	617347.08	497662.08	119685.00
+Australia and Oceania	Australia	Beverages	Offline	H	7/7/2014	240470397	7/11/2014	9389	47.45	31.79	445508.05	298476.31	147031.74
+Middle East and North Africa	Azerbaijan	Office Supplies	Online	M	6/13/2012	423331391	7/24/2012	2021	651.21	524.96	1316095.41	1060944.16	255151.25
+Europe	Romania	Cosmetics	Online	H	11/26/2010	660643374	12/25/2010	7910	437.20	263.33	3458252.00	2082940.30	1375311.70
+Central America and the Caribbean	Nicaragua	Beverages	Offline	C	2/8/2011	963392674	3/21/2011	8156	47.45	31.79	387002.20	259279.24	127722.96
+Sub-Saharan Africa	Mali	Clothes	Online	M	7/26/2011	512878119	9/3/2011	888	109.28	35.84	97040.64	31825.92	65214.72
+Asia	Malaysia	Fruits	Offline	L	11/11/2011	810711038	12/28/2011	6267	9.33	6.92	58471.11	43367.64	15103.47
+Sub-Saharan Africa	Sierra Leone	Vegetables	Offline	C	6/1/2016	728815257	6/29/2016	1485	154.06	90.93	228779.10	135031.05	93748.05
+North America	Mexico	Personal Care	Offline	M	7/30/2015	559427106	8/8/2015	5767	81.73	56.67	471336.91	326815.89	144521.02
+Sub-Saharan Africa	Mozambique	Household	Offline	L	2/10/2012	665095412	2/15/2012	5367	668.27	502.54	3586605.09	2697132.18	889472.91
diff --git a/freemarker-generator-cli/site/sample/csv/user.csv b/freemarker-generator-cli/site/sample/csv/user.csv
new file mode 100644
index 0000000..3ead425
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/csv/user.csv
@@ -0,0 +1,5 @@
+disposer,user,password,token,device,name,description
+AAAAAAA,AAAAAAA,,0000000-0000-0000-0000-AAAAAAAAAAAAA,,AAAAAAA,test user AAAAAAA
+BBBBBBB,BBBBBBB,,0000000-0000-0000-0000-BBBBBBBBBBBBB,,BBBBBBB,test user BBBBBBB
+CCCCCCC,CCCCCCC,,0000000-0000-0000-0000-CCCCCCCCCCCCC,,CCCCCCC,test user CCCCCCC
+DDDDDDD,DDDDDDD,,0000000-0000-0000-0000-DDDDDDDDDDDDD,,DDDDDDD,test user DDDDDDD
\ No newline at end of file
diff --git a/freemarker-generator-cli/site/sample/excel/test-multiple-sheets.xlsx b/freemarker-generator-cli/site/sample/excel/test-multiple-sheets.xlsx
new file mode 100644
index 0000000..6fe449a
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/excel/test-multiple-sheets.xlsx
Binary files differ
diff --git a/freemarker-generator-cli/site/sample/excel/test.xls b/freemarker-generator-cli/site/sample/excel/test.xls
new file mode 100644
index 0000000..df48479
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/excel/test.xls
Binary files differ
diff --git a/freemarker-generator-cli/site/sample/excel/test.xlsx b/freemarker-generator-cli/site/sample/excel/test.xlsx
new file mode 100644
index 0000000..b79f954
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/excel/test.xlsx
Binary files differ
diff --git a/freemarker-generator-cli/site/sample/html/dependencies.html b/freemarker-generator-cli/site/sample/html/dependencies.html
new file mode 100644
index 0000000..c67940f
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/html/dependencies.html
@@ -0,0 +1,645 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- Generated by Apache Maven Doxia Site Renderer 1.8.1 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.0.0:dependencies at 2019-02-07 -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <title>FreeMarker CLI &#x2013; Project Dependencies</title>
+    <style type="text/css" media="all">
+      @import url("./css/maven-base.css");
+      @import url("./css/maven-theme.css");
+      @import url("./css/site.css");
+    </style>
+    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
+    <meta http-equiv="Content-Language" content="en" />
+    
+  </head>
+  <body class="composite">
+    <div id="banner">
+<div id="bannerLeft">
+FreeMarker CLI
+</div>
+      <div class="clear">
+        <hr/>
+      </div>
+    </div>
+    <div id="breadcrumbs">
+      <div class="xleft">
+        <span id="publishDate">Last Published: 2019-02-07</span>
+          &nbsp;| <span id="projectVersion">Version: 1.0.2-SNAPSHOT</span>
+      </div>
+      <div class="xright"><a href="${project.url}" title="FreeMarker CLI">FreeMarker CLI</a>      </div>
+      <div class="clear">
+        <hr/>
+      </div>
+    </div>
+    <div id="leftColumn">
+      <div id="navcolumn">
+       <h5>Project Documentation</h5>
+    <ul>
+     <li class="expanded"><a href="project-info.html" title="Project Information">Project Information</a>
+      <ul>
+       <li class="none"><strong>Dependencies</strong></li>
+       <li class="none"><a href="dependency-info.html" title="Dependency Information">Dependency Information</a></li>
+       <li class="none"><a href="index.html" title="About">About</a></li>
+       <li class="none"><a href="plugin-management.html" title="Plugin Management">Plugin Management</a></li>
+       <li class="none"><a href="plugins.html" title="Plugins">Plugins</a></li>
+       <li class="none"><a href="summary.html" title="Summary">Summary</a></li>
+      </ul></li>
+    </ul>
+      <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
+        <img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
+      </a>
+      </div>
+    </div>
+    <div id="bodyColumn">
+      <div id="contentBox">
+<a name="Project_Dependencies"></a>
+<div class="section">
+<h2><a name="Project_Dependencies"></a>Project Dependencies</h2><a name="Project_Dependencies_compile"></a>
+<div class="section">
+<h3><a name="compile"></a>compile</h3>
+<p>The following is a list of compile dependencies for this project. These dependencies are required to compile and run the application:</p>
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>GroupId</th>
+<th>ArtifactId</th>
+<th>Version</th>
+<th>Type</th>
+<th>Licenses</th></tr>
+<tr class="b">
+<td>com.jayway.jsonpath</td>
+<td><a class="externalLink" href="https://github.com/jayway/JsonPath">json-path</a></td>
+<td>2.4.0</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="a">
+<td>commons-cli</td>
+<td><a class="externalLink" href="http://commons.apache.org/proper/commons-cli/">commons-cli</a></td>
+<td>1.4</td>
+<td>jar</td>
+<td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
+<tr class="b">
+<td>org.apache.commons</td>
+<td><a class="externalLink" href="http://commons.apache.org/proper/commons-csv/">commons-csv</a></td>
+<td>1.5</td>
+<td>jar</td>
+<td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
+<tr class="a">
+<td>org.apache.poi</td>
+<td><a class="externalLink" href="http://poi.apache.org/">poi</a></td>
+<td>4.0.1</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="b">
+<td>org.apache.poi</td>
+<td><a class="externalLink" href="http://poi.apache.org/">poi-ooxml</a></td>
+<td>3.17</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="a">
+<td>org.apache.poi</td>
+<td><a class="externalLink" href="http://poi.apache.org/">poi-ooxml-schemas</a></td>
+<td>3.17</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="b">
+<td>org.freemarker</td>
+<td><a class="externalLink" href="https://freemarker.apache.org/">freemarker</a></td>
+<td>2.3.28</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
+<tr class="a">
+<td>org.jsoup</td>
+<td><a class="externalLink" href="https://jsoup.org/">jsoup</a></td>
+<td>1.11.3</td>
+<td>jar</td>
+<td><a class="externalLink" href="https://jsoup.org/license">The MIT License</a></td></tr>
+<tr class="b">
+<td>org.slf4j</td>
+<td><a class="externalLink" href="http://www.slf4j.org">slf4j-api</a></td>
+<td>1.7.21</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr>
+<tr class="a">
+<td>org.slf4j</td>
+<td><a class="externalLink" href="http://www.slf4j.org">slf4j-log4j12</a></td>
+<td>1.7.21</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></td></tr></table></div></div><a name="Project_Transitive_Dependencies"></a>
+<div class="section">
+<h2><a name="Project_Transitive_Dependencies"></a>Project Transitive Dependencies</h2>
+<p>The following is a list of transitive dependencies for this project. Transitive dependencies are the dependencies of the project dependencies.</p><a name="Project_Transitive_Dependencies_compile"></a>
+<div class="section">
+<h3><a name="compile"></a>compile</h3>
+<p>The following is a list of compile dependencies for this project. These dependencies are required to compile and run the application:</p>
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>GroupId</th>
+<th>ArtifactId</th>
+<th>Version</th>
+<th>Type</th>
+<th>Licenses</th></tr>
+<tr class="b">
+<td>com.github.virtuald</td>
+<td><a class="externalLink" href="https://github.com/virtuald/curvesapi">curvesapi</a></td>
+<td>1.04</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://opensource.org/licenses/BSD-3-Clause">BSD License</a></td></tr>
+<tr class="a">
+<td>commons-codec</td>
+<td><a class="externalLink" href="http://commons.apache.org/proper/commons-codec/">commons-codec</a></td>
+<td>1.11</td>
+<td>jar</td>
+<td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
+<tr class="b">
+<td>log4j</td>
+<td><a class="externalLink" href="http://logging.apache.org/log4j/1.2/">log4j</a></td>
+<td>1.2.17</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="a">
+<td>net.minidev</td>
+<td><a class="externalLink" href="http://www.minidev.net/">accessors-smart</a></td>
+<td>1.2</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="b">
+<td>net.minidev</td>
+<td><a class="externalLink" href="http://www.minidev.net/">json-smart</a></td>
+<td>2.3</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="a">
+<td>org.apache.commons</td>
+<td><a class="externalLink" href="http://commons.apache.org/proper/commons-collections/">commons-collections4</a></td>
+<td>4.2</td>
+<td>jar</td>
+<td><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
+<tr class="b">
+<td>org.apache.commons</td>
+<td><a class="externalLink" href="http://commons.apache.org/proper/commons-math/">commons-math3</a></td>
+<td>3.6.1</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></td></tr>
+<tr class="a">
+<td>org.apache.xmlbeans</td>
+<td><a class="externalLink" href="http://xmlbeans.apache.org">xmlbeans</a></td>
+<td>2.6.0</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr>
+<tr class="b">
+<td>org.ow2.asm</td>
+<td><a class="externalLink" href="http://asm.objectweb.org/asm/">asm</a></td>
+<td>5.0.4</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://asm.objectweb.org/license.html">BSD</a></td></tr>
+<tr class="a">
+<td>stax</td>
+<td><a class="externalLink" href="http://stax.codehaus.org/">stax-api</a></td>
+<td>1.0.1</td>
+<td>jar</td>
+<td><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></td></tr></table></div></div><a name="Project_Dependency_Graph"></a>
+<div class="section">
+<h2><a name="Project_Dependency_Graph"></a>Project Dependency Graph</h2>
+<script language="javascript" type="text/javascript">
+      function toggleDependencyDetails( divId, imgId )
+      {
+        var div = document.getElementById( divId );
+        var img = document.getElementById( imgId );
+        if( div.style.display == '' )
+        {
+          div.style.display = 'none';
+          img.src='./images/icon_info_sml.gif';
+          img.alt='[Information]';
+        }
+        else
+        {
+          div.style.display = '';
+          img.src='./images/close.gif';
+          img.alt='[Close]';
+        }
+      }
+</script>
+<a name="Dependency_Tree"></a>
+<div class="section">
+<h3><a name="Dependency_Tree"></a>Dependency Tree</h3>
+<ul>
+<li>org.github.sgoeschl:freemarker-cli:jar:1.0.2-SNAPSHOT <img id="_img1" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep0', '_img1' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep0" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>FreeMarker CLI</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>There is currently no description associated with this project.</p>
+<p><b>Project Licenses: </b>No licenses are defined for this project.</p></td></tr></table></div>
+<ul>
+<li>org.jsoup:jsoup:jar:1.11.3 (compile) <img id="_img3" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep2', '_img3' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep2" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>jsoup Java HTML Parser</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulating data, using the best of DOM, CSS, and jquery-like methods. jsoup implements the WHATWG HTML5 specification, and parses HTML to the same DOM as modern browsers do.</p>
+<p><b>URL: </b><a class="externalLink" href="https://jsoup.org/">https://jsoup.org/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="https://jsoup.org/license">The MIT License</a></p></td></tr></table></div></li>
+<li>org.freemarker:freemarker:jar:2.3.28 (compile) <img id="_img5" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep4', '_img5' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep4" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache FreeMarker</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>FreeMarker is a &quot;template engine&quot;; a generic tool to generate text output based on templates.</p>
+<p><b>URL: </b><a class="externalLink" href="https://freemarker.apache.org/">https://freemarker.apache.org/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></p></td></tr></table></div></li>
+<li>com.jayway.jsonpath:json-path:jar:2.4.0 (compile) <img id="_img7" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep6', '_img7' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep6" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>project ':json-path'</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Java port of Stefan Goessner JsonPath.</p>
+<p><b>URL: </b><a class="externalLink" href="https://github.com/jayway/JsonPath">https://github.com/jayway/JsonPath</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div>
+<ul>
+<li>net.minidev:json-smart:jar:2.3 (compile) <img id="_img9" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep8', '_img9' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep8" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>JSON Small and Fast Parser</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language.</p>
+<p><b>URL: </b><a class="externalLink" href="http://www.minidev.net/">http://www.minidev.net/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div>
+<ul>
+<li>net.minidev:accessors-smart:jar:1.2 (compile) <img id="_img11" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep10', '_img11' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep10" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>ASM based accessors helper used by json-smart</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Java reflect give poor performance on getter setter an constructor calls, accessors-smart use ASM to speed up those calls.</p>
+<p><b>URL: </b><a class="externalLink" href="http://www.minidev.net/">http://www.minidev.net/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div>
+<ul>
+<li>org.ow2.asm:asm:jar:5.0.4 (compile) <img id="_img13" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep12', '_img13' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep12" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>ASM Core</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>A very small and fast Java bytecode manipulation framework</p>
+<p><b>URL: </b><a class="externalLink" href="http://asm.objectweb.org/asm/">http://asm.objectweb.org/asm/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://asm.objectweb.org/license.html">BSD</a></p></td></tr></table></div></li></ul></li></ul></li></ul></li>
+<li>org.apache.commons:commons-csv:jar:1.5 (compile) <img id="_img15" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep14', '_img15' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep14" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache Commons CSV</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>The Apache Commons CSV library provides a simple interface for reading and writing
+CSV files of various types.</p>
+<p><b>URL: </b><a class="externalLink" href="http://commons.apache.org/proper/commons-csv/">http://commons.apache.org/proper/commons-csv/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></p></td></tr></table></div></li>
+<li>commons-cli:commons-cli:jar:1.4 (compile) <img id="_img17" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep16', '_img17' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep16" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache Commons CLI</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Apache Commons CLI provides a simple API for presenting, processing and validating a command line interface.</p>
+<p><b>URL: </b><a class="externalLink" href="http://commons.apache.org/proper/commons-cli/">http://commons.apache.org/proper/commons-cli/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></p></td></tr></table></div></li>
+<li>org.slf4j:slf4j-api:jar:1.7.21 (compile) <img id="_img19" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep18', '_img19' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep18" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>SLF4J API Module</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>The slf4j API</p>
+<p><b>URL: </b><a class="externalLink" href="http://www.slf4j.org">http://www.slf4j.org</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></p></td></tr></table></div></li>
+<li>org.slf4j:slf4j-log4j12:jar:1.7.21 (compile) <img id="_img21" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep20', '_img21' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep20" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>SLF4J LOG4J-12 Binding</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>SLF4J LOG4J-12 Binding</p>
+<p><b>URL: </b><a class="externalLink" href="http://www.slf4j.org">http://www.slf4j.org</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a></p></td></tr></table></div>
+<ul>
+<li>log4j:log4j:jar:1.2.17 (compile) <img id="_img23" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep22', '_img23' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep22" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache Log4j</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Apache Log4j 1.2</p>
+<p><b>URL: </b><a class="externalLink" href="http://logging.apache.org/log4j/1.2/">http://logging.apache.org/log4j/1.2/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div></li></ul></li>
+<li>org.apache.poi:poi:jar:4.0.1 (compile) <img id="_img25" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep24', '_img25' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep24" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache POI</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Apache POI - Java API To Access Microsoft Format Files</p>
+<p><b>URL: </b><a class="externalLink" href="http://poi.apache.org/">http://poi.apache.org/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div>
+<ul>
+<li>commons-codec:commons-codec:jar:1.11 (compile) <img id="_img27" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep26', '_img27' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep26" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache Commons Codec</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>The Apache Commons Codec package contains simple encoder and decoders for
+     various formats such as Base64 and Hexadecimal.  In addition to these
+     widely used encoders and decoders, the codec package also maintains a
+     collection of phonetic encoding utilities.</p>
+<p><b>URL: </b><a class="externalLink" href="http://commons.apache.org/proper/commons-codec/">http://commons.apache.org/proper/commons-codec/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></p></td></tr></table></div></li>
+<li>org.apache.commons:commons-collections4:jar:4.2 (compile) <img id="_img29" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep28', '_img29' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep28" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache Commons Collections</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>The Apache Commons Collections package contains types that extend and augment the Java Collections Framework.</p>
+<p><b>URL: </b><a class="externalLink" href="http://commons.apache.org/proper/commons-collections/">http://commons.apache.org/proper/commons-collections/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="https://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></p></td></tr></table></div></li>
+<li>org.apache.commons:commons-math3:jar:3.6.1 (compile) <img id="_img31" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep30', '_img31' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep30" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache Commons Math</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>The Apache Commons Math project is a library of lightweight, self-contained mathematics and statistics components addressing the most common practical problems not immediately available in the Java programming language or commons-lang.</p>
+<p><b>URL: </b><a class="externalLink" href="http://commons.apache.org/proper/commons-math/">http://commons.apache.org/proper/commons-math/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache License, Version 2.0</a></p></td></tr></table></div></li></ul></li>
+<li>org.apache.poi:poi-ooxml:jar:3.17 (compile) <img id="_img33" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep32', '_img33' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep32" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache POI</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Apache POI - Java API To Access Microsoft Format Files</p>
+<p><b>URL: </b><a class="externalLink" href="http://poi.apache.org/">http://poi.apache.org/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div>
+<ul>
+<li>com.github.virtuald:curvesapi:jar:1.04 (compile) <img id="_img35" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep34', '_img35' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep34" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>curvesapi</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Implementation of various mathematical curves that define themselves over a set of control points. The API is written in Java. The curves supported are: Bezier, B-Spline, Cardinal Spline, Catmull-Rom Spline, Lagrange, Natural Cubic Spline, and NURBS.</p>
+<p><b>URL: </b><a class="externalLink" href="https://github.com/virtuald/curvesapi">https://github.com/virtuald/curvesapi</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://opensource.org/licenses/BSD-3-Clause">BSD License</a></p></td></tr></table></div></li></ul></li>
+<li>org.apache.poi:poi-ooxml-schemas:jar:3.17 (compile) <img id="_img37" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep36', '_img37' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep36" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Apache POI</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>Apache POI - Java API To Access Microsoft Format Files</p>
+<p><b>URL: </b><a class="externalLink" href="http://poi.apache.org/">http://poi.apache.org/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div>
+<ul>
+<li>org.apache.xmlbeans:xmlbeans:jar:2.6.0 (compile) <img id="_img39" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep38', '_img39' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep38" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>XmlBeans</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>XmlBeans main jar</p>
+<p><b>URL: </b><a class="externalLink" href="http://xmlbeans.apache.org">http://xmlbeans.apache.org</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div>
+<ul>
+<li>stax:stax-api:jar:1.0.1 (compile) <img id="_img41" src="./images/icon_info_sml.gif" alt="[Information]" onclick="toggleDependencyDetails( '_dep40', '_img41' );" style="cursor: pointer; vertical-align: text-bottom;"></img><div id="_dep40" style="display:none">
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>StAX API</th></tr>
+<tr class="b">
+<td>
+<p><b>Description: </b>StAX API is the standard java XML processing API defined by JSR-173</p>
+<p><b>URL: </b><a class="externalLink" href="http://stax.codehaus.org/">http://stax.codehaus.org/</a></p>
+<p><b>Project Licenses: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div></li></ul></li></ul></li></ul></li></ul></div></div><a name="Licenses"></a>
+<div class="section">
+<h2><a name="Licenses"></a>Licenses</h2>
+<p><b>BSD: </b>ASM Core</p>
+<p><b>Unknown: </b>FreeMarker CLI</p>
+<p><b>BSD License: </b>curvesapi</p>
+<p><b>The MIT License: </b>jsoup Java HTML Parser</p>
+<p><b>MIT License: </b>SLF4J API Module, SLF4J LOG4J-12 Binding</p>
+<p><b>Apache License, Version 2.0: </b>Apache Commons CLI, Apache Commons CSV, Apache Commons Codec, Apache Commons Collections, Apache Commons Math, Apache FreeMarker</p>
+<p><b>The Apache Software License, Version 2.0: </b>ASM based accessors helper used by json-smart, Apache Log4j, Apache POI, JSON Small and Fast Parser, StAX API, XmlBeans, project ':json-path'</p></div><a name="Dependency_File_Details"></a>
+<div class="section">
+<h2><a name="Dependency_File_Details"></a>Dependency File Details</h2>
+<table border="0" class="bodyTable">
+<tr class="a">
+<th>Filename</th>
+<th>Size</th>
+<th>Entries</th>
+<th>Classes</th>
+<th>Packages</th>
+<th>Java Version</th>
+<th title="Indicates whether these dependencies have been compiled with debug information.">Debug Information</th></tr>
+<tr class="b">
+<td>curvesapi-1.04.jar</td>
+<td>98.4 kB</td>
+<td>102</td>
+<td>83</td>
+<td>6</td>
+<td>1.5</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>json-path-2.4.0.jar</td>
+<td>223.2 kB</td>
+<td>191</td>
+<td>174</td>
+<td>12</td>
+<td>1.6</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>commons-cli-1.4.jar</td>
+<td>53.8 kB</td>
+<td>40</td>
+<td>27</td>
+<td>1</td>
+<td>1.5</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>commons-codec-1.11.jar</td>
+<td>335 kB</td>
+<td>243</td>
+<td>96</td>
+<td>7</td>
+<td>1.6</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>log4j-1.2.17.jar</td>
+<td>489.9 kB</td>
+<td>353</td>
+<td>314</td>
+<td>21</td>
+<td>1.4</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>accessors-smart-1.2.jar</td>
+<td>30 kB</td>
+<td>24</td>
+<td>13</td>
+<td>2</td>
+<td>1.6</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>json-smart-2.3.jar</td>
+<td>120.3 kB</td>
+<td>106</td>
+<td>92</td>
+<td>5</td>
+<td>1.6</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>commons-collections4-4.2.jar</td>
+<td>752.8 kB</td>
+<td>552</td>
+<td>521</td>
+<td>19</td>
+<td>1.7</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>commons-csv-1.5.jar</td>
+<td>41.6 kB</td>
+<td>28</td>
+<td>15</td>
+<td>1</td>
+<td>1.7</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>commons-math3-3.6.1.jar</td>
+<td>2.2 MB</td>
+<td>1402</td>
+<td>1301</td>
+<td>75</td>
+<td>1.5</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>poi-4.0.1.jar</td>
+<td>2.7 MB</td>
+<td>1784</td>
+<td>1706</td>
+<td>65</td>
+<td>1.8</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>poi-ooxml-3.17.jar</td>
+<td>1.5 MB</td>
+<td>732</td>
+<td>670</td>
+<td>46</td>
+<td>1.6</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>poi-ooxml-schemas-3.17.jar</td>
+<td>5.9 MB</td>
+<td>5846</td>
+<td>2579</td>
+<td>48</td>
+<td>1.6</td>
+<td>No</td></tr>
+<tr class="a">
+<td>xmlbeans-2.6.0.jar</td>
+<td>2.7 MB</td>
+<td>2249</td>
+<td>1523</td>
+<td>52</td>
+<td>1.4</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>freemarker-2.3.28.jar</td>
+<td>1.5 MB</td>
+<td>1148</td>
+<td>1124</td>
+<td>17</td>
+<td>1.8</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>jsoup-1.11.3.jar</td>
+<td>395.7 kB</td>
+<td>266</td>
+<td>248</td>
+<td>7</td>
+<td>1.7</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>asm-5.0.4.jar</td>
+<td>53.3 kB</td>
+<td>30</td>
+<td>25</td>
+<td>2</td>
+<td>1.2</td>
+<td>No</td></tr>
+<tr class="a">
+<td>slf4j-api-1.7.21.jar</td>
+<td>41.1 kB</td>
+<td>46</td>
+<td>34</td>
+<td>4</td>
+<td>1.5</td>
+<td>Yes</td></tr>
+<tr class="b">
+<td>slf4j-log4j12-1.7.21.jar</td>
+<td>10 kB</td>
+<td>16</td>
+<td>6</td>
+<td>1</td>
+<td>1.5</td>
+<td>Yes</td></tr>
+<tr class="a">
+<td>stax-api-1.0.1.jar</td>
+<td>26.5 kB</td>
+<td>48</td>
+<td>40</td>
+<td>5</td>
+<td>1.2</td>
+<td>Yes</td></tr>
+<tr class="b">
+<th>Total</th>
+<th>Size</th>
+<th>Entries</th>
+<th>Classes</th>
+<th>Packages</th>
+<th>Java Version</th>
+<th>Debug Information</th></tr>
+<tr class="a">
+<td>20</td>
+<td>19.3 MB</td>
+<td>15206</td>
+<td>10591</td>
+<td>396</td>
+<td>1.8</td>
+<td>18</td></tr>
+<tr class="b">
+<td>compile: 20</td>
+<td>compile: 19.3 MB</td>
+<td>compile: 15206</td>
+<td>compile: 10591</td>
+<td>compile: 396</td>
+<td>-</td>
+<td>compile: 18</td></tr></table></div>
+      </div>
+    </div>
+    <div class="clear">
+      <hr/>
+    </div>
+    <div id="footer">
+      <div class="xright">
+        Copyright &#169;      2016&#x2013;2019.All rights reserved.      </div>
+      <div class="clear">
+        <hr/>
+      </div>
+    </div>
+  </body>
+</html>
diff --git a/freemarker-generator-cli/site/sample/json/github-users.json b/freemarker-generator-cli/site/sample/json/github-users.json
new file mode 100644
index 0000000..e12d648
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/json/github-users.json
@@ -0,0 +1,135 @@
+[
+    {
+        "login": "mojombo",
+        "id": 1,
+        "avatar_url": "https://avatars.githubusercontent.com/u/1?v=3",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/mojombo",
+        "html_url": "https://github.com/mojombo",
+        "followers_url": "https://api.github.com/users/mojombo/followers",
+        "following_url": "https://api.github.com/users/mojombo/following{/other_user}",
+        "gists_url": "https://api.github.com/users/mojombo/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/mojombo/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/mojombo/subscriptions",
+        "organizations_url": "https://api.github.com/users/mojombo/orgs",
+        "repos_url": "https://api.github.com/users/mojombo/repos",
+        "events_url": "https://api.github.com/users/mojombo/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/mojombo/received_events",
+        "type": "User",
+        "site_admin": false
+    },
+    {
+        "login": "defunkt",
+        "id": 2,
+        "avatar_url": "https://avatars.githubusercontent.com/u/2?v=3",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/defunkt",
+        "html_url": "https://github.com/defunkt",
+        "followers_url": "https://api.github.com/users/defunkt/followers",
+        "following_url": "https://api.github.com/users/defunkt/following{/other_user}",
+        "gists_url": "https://api.github.com/users/defunkt/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/defunkt/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/defunkt/subscriptions",
+        "organizations_url": "https://api.github.com/users/defunkt/orgs",
+        "repos_url": "https://api.github.com/users/defunkt/repos",
+        "events_url": "https://api.github.com/users/defunkt/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/defunkt/received_events",
+        "type": "User",
+        "site_admin": true
+    },
+    {
+        "login": "pjhyett",
+        "id": 3,
+        "avatar_url": "https://avatars.githubusercontent.com/u/3?v=3",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/pjhyett",
+        "html_url": "https://github.com/pjhyett",
+        "followers_url": "https://api.github.com/users/pjhyett/followers",
+        "following_url": "https://api.github.com/users/pjhyett/following{/other_user}",
+        "gists_url": "https://api.github.com/users/pjhyett/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/pjhyett/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/pjhyett/subscriptions",
+        "organizations_url": "https://api.github.com/users/pjhyett/orgs",
+        "repos_url": "https://api.github.com/users/pjhyett/repos",
+        "events_url": "https://api.github.com/users/pjhyett/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/pjhyett/received_events",
+        "type": "User",
+        "site_admin": true
+    },
+    {
+        "login": "wycats",
+        "id": 4,
+        "avatar_url": "https://avatars.githubusercontent.com/u/4?v=3",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/wycats",
+        "html_url": "https://github.com/wycats",
+        "followers_url": "https://api.github.com/users/wycats/followers",
+        "following_url": "https://api.github.com/users/wycats/following{/other_user}",
+        "gists_url": "https://api.github.com/users/wycats/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/wycats/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/wycats/subscriptions",
+        "organizations_url": "https://api.github.com/users/wycats/orgs",
+        "repos_url": "https://api.github.com/users/wycats/repos",
+        "events_url": "https://api.github.com/users/wycats/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/wycats/received_events",
+        "type": "User",
+        "site_admin": false
+    },
+    {
+        "login": "ezmobius",
+        "id": 5,
+        "avatar_url": "https://avatars.githubusercontent.com/u/5?v=3",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/ezmobius",
+        "html_url": "https://github.com/ezmobius",
+        "followers_url": "https://api.github.com/users/ezmobius/followers",
+        "following_url": "https://api.github.com/users/ezmobius/following{/other_user}",
+        "gists_url": "https://api.github.com/users/ezmobius/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/ezmobius/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/ezmobius/subscriptions",
+        "organizations_url": "https://api.github.com/users/ezmobius/orgs",
+        "repos_url": "https://api.github.com/users/ezmobius/repos",
+        "events_url": "https://api.github.com/users/ezmobius/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/ezmobius/received_events",
+        "type": "User",
+        "site_admin": false
+    },
+    {
+        "login": "ivey",
+        "id": 6,
+        "avatar_url": "https://avatars.githubusercontent.com/u/6?v=3",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/ivey",
+        "html_url": "https://github.com/ivey",
+        "followers_url": "https://api.github.com/users/ivey/followers",
+        "following_url": "https://api.github.com/users/ivey/following{/other_user}",
+        "gists_url": "https://api.github.com/users/ivey/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/ivey/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/ivey/subscriptions",
+        "organizations_url": "https://api.github.com/users/ivey/orgs",
+        "repos_url": "https://api.github.com/users/ivey/repos",
+        "events_url": "https://api.github.com/users/ivey/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/ivey/received_events",
+        "type": "User",
+        "site_admin": false
+    },
+    {
+        "login": "evanphx",
+        "id": 7,
+        "avatar_url": "https://avatars.githubusercontent.com/u/7?v=3",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/evanphx",
+        "html_url": "https://github.com/evanphx",
+        "followers_url": "https://api.github.com/users/evanphx/followers",
+        "following_url": "https://api.github.com/users/evanphx/following{/other_user}",
+        "gists_url": "https://api.github.com/users/evanphx/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/evanphx/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/evanphx/subscriptions",
+        "organizations_url": "https://api.github.com/users/evanphx/orgs",
+        "repos_url": "https://api.github.com/users/evanphx/repos",
+        "events_url": "https://api.github.com/users/evanphx/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/evanphx/received_events",
+        "type": "User",
+        "site_admin": false
+    }
+]
diff --git a/freemarker-generator-cli/site/sample/json/swagger-spec.json b/freemarker-generator-cli/site/sample/json/swagger-spec.json
new file mode 100644
index 0000000..35cf52c
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/json/swagger-spec.json
@@ -0,0 +1,210 @@
+{
+    "swagger": "2.0",
+    "info": {
+        "version": "1.0.0",
+        "title": "Swagger Petstore",
+        "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification",
+        "termsOfService": "http://swagger.io/terms/",
+        "contact": {
+            "name": "Swagger API Team",
+            "email": "apiteam@swagger.io",
+            "url": "http://swagger.io"
+        },
+        "license": {
+            "name": "Apache 2.0",
+            "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
+        }
+    },
+    "host": "petstore.swagger.io",
+    "basePath": "/api",
+    "schemes": [
+        "http"
+    ],
+    "consumes": [
+        "application/json"
+    ],
+    "produces": [
+        "application/json"
+    ],
+    "paths": {
+        "/pets": {
+            "get": {
+                "description": "Returns all pets from the system that the user has access to",
+                "operationId": "findPets",
+                "parameters": [
+                    {
+                        "name": "tags",
+                        "in": "query",
+                        "description": "tags to filter by",
+                        "required": false,
+                        "type": "array",
+                        "collectionFormat": "csv",
+                        "items": {
+                            "type": "string"
+                        }
+                    },
+                    {
+                        "name": "limit",
+                        "in": "query",
+                        "description": "maximum number of results to return",
+                        "required": false,
+                        "type": "integer",
+                        "format": "int32"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "pet response",
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "$ref": "#/definitions/Pet"
+                            }
+                        }
+                    },
+                    "default": {
+                        "description": "unexpected error",
+                        "schema": {
+                            "$ref": "#/definitions/Error"
+                        }
+                    }
+                }
+            },
+            "post": {
+                "description": "Creates a new pet in the store.  Duplicates are allowed",
+                "operationId": "addPet",
+                "parameters": [
+                    {
+                        "name": "pet",
+                        "in": "body",
+                        "description": "Pet to add to the store",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/NewPet"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "pet response",
+                        "schema": {
+                            "$ref": "#/definitions/Pet"
+                        }
+                    },
+                    "default": {
+                        "description": "unexpected error",
+                        "schema": {
+                            "$ref": "#/definitions/Error"
+                        }
+                    }
+                }
+            }
+        },
+        "/pets/{id}": {
+            "get": {
+                "description": "Returns a user based on a single ID, if the user does not have access to the pet",
+                "operationId": "find pet by id",
+                "parameters": [
+                    {
+                        "name": "id",
+                        "in": "path",
+                        "description": "ID of pet to fetch",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "pet response",
+                        "schema": {
+                            "$ref": "#/definitions/Pet"
+                        }
+                    },
+                    "default": {
+                        "description": "unexpected error",
+                        "schema": {
+                            "$ref": "#/definitions/Error"
+                        }
+                    }
+                }
+            },
+            "delete": {
+                "description": "Deletes a single pet based on the ID supplied",
+                "operationId": "deletePet",
+                "parameters": [
+                    {
+                        "name": "id",
+                        "in": "path",
+                        "description": "ID of pet to delete",
+                        "required": true,
+                        "type": "integer",
+                        "format": "int64"
+                    }
+                ],
+                "responses": {
+                    "204": {
+                        "description": "pet deleted"
+                    },
+                    "default": {
+                        "description": "unexpected error",
+                        "schema": {
+                            "$ref": "#/definitions/Error"
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "definitions": {
+        "Pet": {
+            "type": "object",
+            "allOf": [
+                {
+                    "$ref": "#/definitions/NewPet"
+                },
+                {
+                    "required": [
+                        "id"
+                    ],
+                    "properties": {
+                        "id": {
+                            "type": "integer",
+                            "format": "int64"
+                        }
+                    }
+                }
+            ]
+        },
+        "NewPet": {
+            "type": "object",
+            "required": [
+                "name"
+            ],
+            "properties": {
+                "name": {
+                    "type": "string"
+                },
+                "tag": {
+                    "type": "string"
+                }
+            }
+        },
+        "Error": {
+            "type": "object",
+            "required": [
+                "code",
+                "message"
+            ],
+            "properties": {
+                "code": {
+                    "type": "integer",
+                    "format": "int32"
+                },
+                "message": {
+                    "type": "string"
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/freemarker-generator-cli/site/sample/properties/user_0001.properties b/freemarker-generator-cli/site/sample/properties/user_0001.properties
new file mode 100644
index 0000000..050b2f7
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/properties/user_0001.properties
@@ -0,0 +1,3 @@
+USER_ID=user_0001
+PASSWORD=password_0001
+ENVIRONMENTS=TENANT_B_FAT
diff --git a/freemarker-generator-cli/site/sample/properties/user_0002.properties b/freemarker-generator-cli/site/sample/properties/user_0002.properties
new file mode 100644
index 0000000..604b287
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/properties/user_0002.properties
@@ -0,0 +1,5 @@
+USER_ID=user_0002
+PASSWORD=password_0004
+SMS_OTP=000000
+ENVIRONMENTS=TENANT_C_FAT,TENANT_C_UAT
+DESCRIPTION=Many products
\ No newline at end of file
diff --git a/freemarker-generator-cli/site/sample/properties/user_0003.properties b/freemarker-generator-cli/site/sample/properties/user_0003.properties
new file mode 100644
index 0000000..1cf1877
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/properties/user_0003.properties
@@ -0,0 +1,3 @@
+USER_ID=user_0003
+PASSWORD=password_0003
+ENVIRONMENTS=TENANT_B_UAT
\ No newline at end of file
diff --git a/freemarker-generator-cli/site/sample/properties/user_0004.properties b/freemarker-generator-cli/site/sample/properties/user_0004.properties
new file mode 100644
index 0000000..0817b31
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/properties/user_0004.properties
@@ -0,0 +1,3 @@
+USER_ID=user_0004
+PASSWORD=password_0004
+ENVIRONMENTS=TENANT_A_FAT
diff --git a/freemarker-generator-cli/site/sample/xml/recipients.xml b/freemarker-generator-cli/site/sample/xml/recipients.xml
new file mode 100644
index 0000000..4bf4118
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/xml/recipients.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<recipients>
+    <person>
+        <name>John Smith</name>
+        <address>3033 Long Drive, Houston, TX</address>
+    </person>
+    <person>
+        <name>Janet Mason</name>
+        <address>11c Poplar Drive, Knoxville, TN</address>
+    </person>
+</recipients>
diff --git a/freemarker-generator-cli/site/sample/yaml/customer.yaml b/freemarker-generator-cli/site/sample/yaml/customer.yaml
new file mode 100644
index 0000000..35d8b23
--- /dev/null
+++ b/freemarker-generator-cli/site/sample/yaml/customer.yaml
@@ -0,0 +1,13 @@
+firstName: "John"
+lastName: "Doe"
+age: 31
+contactDetails:
+  - type: "mobile"
+    number: 123456789
+  - type: "landline"
+    number: 456786868
+homeAddress:
+  line: "Xyz, DEF Street"
+  city: "City Y"
+  state: "State Y"
+  zip: 345657
diff --git a/freemarker-generator-cli/src/main/assembly/app.xml b/freemarker-generator-cli/src/main/assembly/app.xml
new file mode 100644
index 0000000..179b4fb
--- /dev/null
+++ b/freemarker-generator-cli/src/main/assembly/app.xml
@@ -0,0 +1,34 @@
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>app</id>
+    <formats>
+        <format>tar.gz</format>
+        <format>zip</format>
+    </formats>
+    <fileSets>
+        <fileSet>
+            <directory>${project.basedir}/target/appassembler</directory>
+            <outputDirectory>${file.separator}</outputDirectory>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/main/assembly/dist.xml b/freemarker-generator-cli/src/main/assembly/dist.xml
new file mode 100644
index 0000000..80dc5b4
--- /dev/null
+++ b/freemarker-generator-cli/src/main/assembly/dist.xml
@@ -0,0 +1,41 @@
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>dist</id>
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    <fileSets>
+        <fileSet>
+            <directory>${project.basedir}</directory>
+            <outputDirectory>${file.separator}</outputDirectory>
+            <useDefaultExcludes>true</useDefaultExcludes>
+            <excludes>
+                <exclude>./src/**</exclude>
+                <exclude>./target/**</exclude>
+                <exclude>./.idea/**</exclude>
+                <exclude>./*.iml</exclude>
+                <exclude>./pom.xml</exclude>
+                <exclude>./pom.xml</exclude>
+            </excludes>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/main/config/freemarker-cli.properties b/freemarker-generator-cli/src/main/config/freemarker-cli.properties
new file mode 100644
index 0000000..af23b05
--- /dev/null
+++ b/freemarker-generator-cli/src/main/config/freemarker-cli.properties
@@ -0,0 +1,38 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#############################################################################
+# General FreeMarker Configuration
+# See https://freemarker.apache.org/docs/api/freemarker/template/Configuration.html#setSetting-java.lang.String-java.lang.String-
+#############################################################################
+# freemarker.configuration.setting.locale=JVM default
+
+#############################################################################
+# Configure FreeMarker Tools (name -> implementation class)
+#############################################################################
+freemarker.tools.CSVTool=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool
+freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool
+freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool
+freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool
+freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool
+freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool
+freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool
+freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool
+freemarker.tools.YamlTool=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool
+freemarker.tools.SystemTool=org.apache.freemarker.generator.tools.system.SystemTool
+freemarker.tools.UUIDTool=org.apache.freemarker.generator.tools.uuid.UUIDTool
+freemarker.tools.XmlTool=org.apache.freemarker.generator.tools.xml.XmlTool
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
new file mode 100644
index 0000000..5b7ac9b
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import org.apache.freemarker.generator.base.util.ClosableUtils;
+import org.apache.freemarker.generator.base.util.StringUtils;
+import org.apache.freemarker.generator.cli.config.Settings;
+import org.apache.freemarker.generator.cli.picocli.GitVersionProvider;
+import org.apache.freemarker.generator.cli.task.FreeMarkerTask;
+import picocli.CommandLine;
+import picocli.CommandLine.ArgGroup;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Option;
+import picocli.CommandLine.Parameters;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.Callable;
+import java.util.stream.IntStream;
+
+import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.cli.config.Suppliers.propertiesSupplier;
+import static org.apache.freemarker.generator.cli.config.Suppliers.templateDirectorySupplier;
+
+@Command(description = "Apache FreeMarker CLI", name = "freemarker-cli", mixinStandardHelpOptions = true, versionProvider = GitVersionProvider.class)
+public class Main implements Callable<Integer> {
+
+    private static final String FREEMARKER_CLI_PROPERTY_FILE = "freemarker-cli.properties";
+
+    @ArgGroup(multiplicity = "1")
+    private TemplateSourceOptions templateSourceOptions;
+
+    private static final class TemplateSourceOptions {
+        @Option(names = { "-t", "--template" }, description = "FreeMarker template to render")
+        private String template;
+
+        @Option(names = { "-i", "--interactive" }, description = "Interactive FreeMarker template")
+        private String interactiveTemplate;
+    }
+
+    @Option(names = { "-b", "--basedir" }, description = "Optional template base directory")
+    private String baseDir;
+
+    @Option(names = { "-D", "--system-property" }, description = "Set system property")
+    private Properties systemProperties;
+
+    @Option(names = { "-e", "--input-encoding" }, description = "Encoding of input documents", defaultValue = "UTF-8")
+    private String inputEncoding;
+
+    @Option(names = { "-E", "--expose-env" }, description = "Expose environment variables and user-supplied properties globally")
+    private boolean isEnvironmentExposed;
+
+    @Option(names = { "-l", "--locale" }, description = "Locale being used for the output, e.g. 'en_US'")
+    private String locale;
+
+    @Option(names = { "-o", "--output" }, description = "Output file")
+    private String outputFile;
+
+    @Option(names = { "-P", "--param" }, description = "Set parameter")
+    private Map<String, String> parameters;
+
+    @Option(names = { "--config" }, defaultValue = FREEMARKER_CLI_PROPERTY_FILE, description = "FreeMarker CLI configuration file")
+    private String configFile;
+
+    @Option(names = { "--include" }, description = "File pattern for document input directory")
+    private String include;
+
+    @Option(names = { "--exclude" }, description = "File pattern for document input directory")
+    private String exclude;
+
+    @Option(names = { "--output-encoding" }, description = "Encoding of output, e.g. UTF-8", defaultValue = "UTF-8")
+    private String outputEncoding;
+
+    @Option(names = { "--stdin" }, description = "Read input document from stdin")
+    private boolean readFromStdin;
+
+    @Option(names = { "--times" }, defaultValue = "1", description = "Re-run X times for profiling")
+    private int times;
+
+    @Parameters(description = "List of input files and/or input directories")
+    private List<String> sources;
+
+    /** User-supplied command line parameters */
+    private final String[] args;
+
+    /** User-supplied writer (used mainly for unit testing) */
+    private Writer userSuppliedWriter;
+
+    private Main(String[] args) {
+        this.args = requireNonNull(args);
+    }
+
+    private Main(String[] args, Writer userSuppliedWriter) {
+        this.args = requireNonNull(args);
+        this.userSuppliedWriter = requireNonNull(userSuppliedWriter);
+    }
+
+    public static void main(String[] args) {
+        try {
+            System.exit(execute(args));
+        } catch (RuntimeException e) {
+            System.err.println(e.getMessage());
+            System.exit(1);
+        }
+    }
+
+    public static int execute(String[] args) {
+        return new CommandLine(new Main(args)).execute(args);
+    }
+
+    /**
+     * Used for testing to inject a writer.
+     *
+     * @param args   command line parameters
+     * @param writer writer used for template rendering
+     * @return exit code
+     */
+    public static int execute(String[] args, Writer writer) {
+        return new CommandLine(new Main(args, writer)).execute(args);
+    }
+
+    @Override
+    public Integer call() {
+        return IntStream.range(0, times).map(i -> onCall()).max().orElse(0);
+    }
+
+    private Integer onCall() {
+        updateSystemProperties();
+
+        final Properties configuration = loadFreeMarkerCliConfiguration(configFile);
+        final List<File> templateDirectories = getTemplateDirectories(baseDir);
+        final Settings settings = settings(configuration, templateDirectories);
+
+        try {
+            final FreeMarkerTask freeMarkerTask = new FreeMarkerTask(settings);
+            return freeMarkerTask.call();
+        } finally {
+            if (settings.hasOutputFile()) {
+                ClosableUtils.closeQuietly(settings.getWriter());
+            }
+        }
+    }
+
+    private Settings settings(Properties configuration, List<File> templateDirectories) {
+        return Settings.builder()
+                .isEnvironmentExposed(isEnvironmentExposed)
+                .isReadFromStdin(readFromStdin)
+                .setArgs(args)
+                .setConfiguration(configuration)
+                .setInclude(include)
+                .setExclude(exclude)
+                .setInputEncoding(inputEncoding)
+                .setInteractiveTemplate(templateSourceOptions.interactiveTemplate)
+                .setLocale(locale)
+                .setOutputEncoding(outputEncoding)
+                .setOutputFile(outputFile)
+                .setParameters(parameters != null ? parameters : new HashMap<>())
+                .setSources(sources != null ? sources : new ArrayList<>())
+                .setSystemProperties(systemProperties != null ? systemProperties : new Properties())
+                .setTemplateDirectories(templateDirectories)
+                .setTemplateName(templateSourceOptions.template)
+                .setWriter(writer(outputFile, outputEncoding))
+                .build();
+    }
+
+    private Writer writer(String outputFile, String ouputEncoding) {
+        try {
+            if (userSuppliedWriter != null) {
+                return userSuppliedWriter;
+            } else if (!StringUtils.isEmpty(outputFile)) {
+                return new BufferedWriter(new FileWriter(outputFile));
+            } else {
+                return new BufferedWriter(new OutputStreamWriter(System.out, ouputEncoding));
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Unable to create writer", e);
+        }
+    }
+
+    private void updateSystemProperties() {
+        if (systemProperties != null && !systemProperties.isEmpty()) {
+            System.getProperties().putAll(systemProperties);
+        }
+    }
+
+    private static List<File> getTemplateDirectories(String baseDir) {
+        return templateDirectorySupplier(baseDir).get();
+    }
+
+    private static Properties loadFreeMarkerCliConfiguration(String fileName) {
+        final Properties properties = propertiesSupplier(fileName).get();
+        if (properties != null) {
+            return properties;
+        } else {
+            throw new RuntimeException("FreeMarker CLI configuration file not found: " + fileName);
+        }
+    }
+}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java
new file mode 100644
index 0000000..c7d4ea7
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import freemarker.cache.TemplateLoader;
+import freemarker.template.Configuration;
+import freemarker.template.Version;
+
+import java.util.Properties;
+import java.util.function.Supplier;
+
+import static freemarker.core.TemplateClassResolver.ALLOWS_NOTHING_RESOLVER;
+import static freemarker.template.Configuration.VERSION_2_3_29;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Stream.of;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Configuration.SETTING_PREFIX;
+import static org.apache.freemarker.generator.base.util.PropertiesTransformer.filterKeyPrefix;
+import static org.apache.freemarker.generator.base.util.PropertiesTransformer.removeKeyPrefix;
+
+/**
+ * Supply a FreeMarker configuration.
+ */
+public class ConfigurationSupplier implements Supplier<Configuration> {
+
+    private static final Version FREEMARKER_VERSION = VERSION_2_3_29;
+
+    private final Settings settings;
+    private final Supplier<TemplateLoader> templateLoader;
+
+    public ConfigurationSupplier(Settings settings, Supplier<TemplateLoader> templateLoader) {
+        this.settings = requireNonNull(settings);
+        this.templateLoader = requireNonNull(templateLoader);
+    }
+
+    @Override
+    public Configuration get() {
+        try {
+            final Configuration configuration = new Configuration(FREEMARKER_VERSION);
+
+            // apply safe default configuration
+            configuration.setAPIBuiltinEnabled(false);
+            configuration.setNewBuiltinClassResolver(ALLOWS_NOTHING_RESOLVER);
+
+            // apply all "freemarker.configuration.setting" values
+            configuration.setSettings(freeMarkerConfigurationSettings());
+
+            // override current configuration with caller-provided settings
+            configuration.setDefaultEncoding(settings.getTemplateEncoding().name());
+            configuration.setLocale(settings.getLocale());
+            configuration.setOutputEncoding(settings.getOutputEncoding().name());
+            configuration.setTemplateLoader(templateLoader.get());
+
+            return configuration;
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to create FreeMarker configuration", e);
+        }
+    }
+
+    /**
+     * Slice through the given configuration to extract
+     * FreeMarker configuration settings.
+     *
+     * @return FreeMarker configuration settings
+     */
+    private Properties freeMarkerConfigurationSettings() {
+        return of(settings.getConfiguration())
+                .map(p -> filterKeyPrefix(p, SETTING_PREFIX))
+                .map(p -> removeKeyPrefix(p, SETTING_PREFIX))
+                .findFirst().get();
+    }
+}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
new file mode 100644
index 0000000..c1a63b3
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
@@ -0,0 +1,448 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import org.apache.freemarker.generator.base.FreeMarkerConstants.Model;
+import org.apache.freemarker.generator.base.util.LocaleUtils;
+import org.apache.freemarker.generator.base.util.NonClosableWriterWrapper;
+
+import java.io.File;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Collections.emptyList;
+import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Configuration.LOCALE_KEY;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_CHARSET;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_LOCALE;
+import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
+
+/**
+ * Capture all the settings required for rendering a FreeMarker template.
+ */
+public class Settings {
+
+    /** FreeMarker CLI configuration containing tool mappings, etc. */
+    private final Properties configuration;
+
+    /** Command line arguments */
+    private final List<String> args;
+
+    /** List of FreeMarker template directories */
+    private final List<File> templateDirectories;
+
+    /** Name of the template to be loaded and rendered  */
+    private final String templateName;
+
+    /** Template provided by the user interactivly */
+    private final String interactiveTemplate;
+
+    /** Encoding of input files */
+    private final Charset inputEncoding;
+
+    /** Encoding of output files */
+    private final Charset outputEncoding;
+
+    /** Enable verbose mode (currently not used) **/
+    private final boolean verbose;
+
+    /** Optional output file if not written to stdout */
+    private final File outputFile;
+
+    /** Optional include pattern for recursice directly search of source files */
+    private final String include;
+
+    /** Optional exclude pattern for recursice directly search of source files */
+    private final String exclude;
+
+    /** The locale used for rendering the template */
+    private final Locale locale;
+
+    /** Read from stdin? */
+    private final boolean isReadFromStdin;
+
+    /** Expose environment variables globally in the data model? */
+    private final boolean isEnvironmentExposed;
+
+    /** User-supplied list of source files or directories */
+    private final List<String> sources;
+
+    /** User-supplied parameters */
+    private final Map<String, String> parameters;
+
+    /** User-supplied system properties */
+    private final Properties sytemProperties;
+
+    /** The writer used for rendering templates, e.g. stdout or a file writer */
+    private final Writer writer;
+
+    private Settings(
+            Properties configuration,
+            List<String> args,
+            List<File> templateDirectories,
+            String template,
+            String interactiveTemplate,
+            Charset inputEncoding,
+            Charset outputEncoding,
+            boolean verbose,
+            File outputFile,
+            String include,
+            String exclude,
+            Locale locale,
+            boolean isReadFromStdin,
+            boolean isEnvironmentExposed,
+            List<String> sources,
+            Map<String, String> parameters,
+            Properties sytemProperties,
+            Writer writer) {
+        if (isEmpty(template) && isEmpty(interactiveTemplate)) {
+            throw new IllegalArgumentException("Either 'template' or 'interactiveTemplate' must be provided");
+        }
+
+        this.args = requireNonNull(args);
+        this.templateDirectories = requireNonNull(templateDirectories);
+        this.templateName = template;
+        this.interactiveTemplate = interactiveTemplate;
+        this.inputEncoding = inputEncoding;
+        this.outputEncoding = outputEncoding;
+        this.verbose = verbose;
+        this.outputFile = outputFile;
+        this.include = include;
+        this.exclude = exclude;
+        this.locale = requireNonNull(locale);
+        this.isReadFromStdin = isReadFromStdin;
+        this.isEnvironmentExposed = isEnvironmentExposed;
+        this.sources = requireNonNull(sources);
+        this.parameters = requireNonNull(parameters);
+        this.sytemProperties = requireNonNull(sytemProperties);
+        this.configuration = requireNonNull(configuration);
+        this.writer = new NonClosableWriterWrapper(requireNonNull(writer));
+    }
+
+    public static SettingsBuilder builder() {
+        return new SettingsBuilder();
+    }
+
+    public Properties getConfiguration() {
+        return configuration;
+    }
+
+    public List<String> getArgs() {
+        return args;
+    }
+
+    public List<File> getTemplateDirectories() {
+        return templateDirectories;
+    }
+
+    public String getTemplateName() {
+        return templateName;
+    }
+
+    public String getInteractiveTemplate() {
+        return interactiveTemplate;
+    }
+
+    public Charset getInputEncoding() {
+        return inputEncoding;
+    }
+
+    public Charset getOutputEncoding() {
+        return outputEncoding;
+    }
+
+    public Charset getTemplateEncoding() {
+        return UTF_8;
+    }
+
+    public boolean isVerbose() {
+        return verbose;
+    }
+
+    public File getOutputFile() {
+        return outputFile;
+    }
+
+    public String getInclude() {
+        return include;
+    }
+
+    public String getExclude() {
+        return exclude;
+    }
+
+    public Locale getLocale() {
+        return locale;
+    }
+
+    public boolean isReadFromStdin() {
+        return isReadFromStdin;
+    }
+
+    public boolean isEnvironmentExposed() {
+        return isEnvironmentExposed;
+    }
+
+    public List<String> getSources() {
+        return sources;
+    }
+
+    public Map<String, String> getParameters() {
+        return parameters;
+    }
+
+    public Properties getSytemProperties() {
+        return sytemProperties;
+    }
+
+    public boolean hasOutputFile() {
+        return outputFile != null;
+    }
+
+    public Writer getWriter() {
+        return writer;
+    }
+
+    /**
+     * Create a settings map only exposing the most important information
+     * to avoid coupling between "Settings" and the various tools.
+     *
+     * @return Map with settings
+     */
+    public Map<String, Object> toMap() {
+        final Map<String, Object> result = new HashMap<>();
+        result.put(Model.FREEMARKER_CLI_ARGS, getArgs());
+        result.put(Model.FREEMARKER_LOCALE, getLocale());
+        result.put(Model.FREEMARKER_TEMPLATE_DIRECTORIES, getTemplateDirectories());
+        result.put(Model.FREEMARKER_USER_PARAMETERS, getParameters());
+        result.put(Model.FREEMARKER_USER_SYSTEM_PROPERTIES, getSytemProperties());
+        result.put(Model.FREEMARKER_WRITER, getWriter());
+        return result;
+    }
+
+    public boolean isInteractiveTemplate() {
+        return interactiveTemplate != null;
+    }
+
+    @Override
+    public String toString() {
+        return "Settings{" +
+                "configuration=" + configuration +
+                ", args=" + args +
+                ", templateDirectories=" + templateDirectories +
+                ", templateName='" + templateName + '\'' +
+                ", interactiveTemplate='" + interactiveTemplate + '\'' +
+                ", inputEncoding=" + inputEncoding +
+                ", outputEncoding=" + outputEncoding +
+                ", verbose=" + verbose +
+                ", outputFile=" + outputFile +
+                ", include='" + include + '\'' +
+                ", exclude='" + include + '\'' +
+                ", locale=" + locale +
+                ", isReadFromStdin=" + isReadFromStdin +
+                ", isEnvironmentExposed=" + isEnvironmentExposed +
+                ", sources=" + sources +
+                ", properties=" + parameters +
+                ", sytemProperties=" + sytemProperties +
+                ", writer=" + writer +
+                ", templateEncoding=" + getTemplateEncoding() +
+                ", readFromStdin=" + isReadFromStdin() +
+                ", environmentExposed=" + isEnvironmentExposed() +
+                ", hasOutputFile=" + hasOutputFile() +
+                ", toMap=" + toMap() +
+                '}';
+    }
+
+    public static class SettingsBuilder {
+        private List<String> args;
+        private List<File> templateDirectories;
+        private String templateName;
+        private String interactiveTemplate;
+        private String inputEncoding;
+        private String outputEncoding;
+        private boolean verbose;
+        private String outputFile;
+        private String include;
+        private String exclude;
+        private String locale;
+        private boolean isReadFromStdin;
+        private boolean isEnvironmentExposed;
+        private List<String> sources;
+        private Map<String, String> parameters;
+        private Properties systemProperties;
+        private Properties configuration;
+        private Writer writer;
+
+        private SettingsBuilder() {
+            this.args = emptyList();
+            this.configuration = new Properties();
+            this.locale = DEFAULT_LOCALE.toString();
+            this.parameters = new HashMap<>();
+            this.systemProperties = new Properties();
+            this.setInputEncoding(DEFAULT_CHARSET.name());
+            this.setOutputEncoding(DEFAULT_CHARSET.name());
+            this.sources = emptyList();
+            this.templateDirectories = emptyList();
+        }
+
+        public SettingsBuilder setArgs(String[] args) {
+            if (args == null) {
+                this.args = emptyList();
+            } else {
+                this.args = Arrays.asList(args);
+            }
+
+            return this;
+        }
+
+        public SettingsBuilder setTemplateDirectories(List<File> list) {
+            this.templateDirectories = list;
+            return this;
+        }
+
+        public SettingsBuilder setTemplateName(String templateName) {
+            this.templateName = templateName;
+            return this;
+        }
+
+        public SettingsBuilder setInteractiveTemplate(String interactiveTemplate) {
+            this.interactiveTemplate = interactiveTemplate;
+            return this;
+        }
+
+        public SettingsBuilder setInputEncoding(String inputEncoding) {
+            if (inputEncoding != null) {
+                this.inputEncoding = inputEncoding;
+            }
+            return this;
+        }
+
+        public SettingsBuilder setOutputEncoding(String outputEncoding) {
+            if (outputEncoding != null) {
+                this.outputEncoding = outputEncoding;
+            }
+            return this;
+        }
+
+        public SettingsBuilder setVerbose(boolean verbose) {
+            this.verbose = verbose;
+            return this;
+        }
+
+        public SettingsBuilder setOutputFile(String outputFile) {
+            this.outputFile = outputFile;
+            return this;
+        }
+
+        public SettingsBuilder setInclude(String include) {
+            this.include = include;
+            return this;
+        }
+
+        public SettingsBuilder setExclude(String exclude) {
+            this.exclude = exclude;
+            return this;
+        }
+
+        public SettingsBuilder setLocale(String locale) {
+            this.locale = locale;
+            return this;
+        }
+
+        public SettingsBuilder isReadFromStdin(boolean stdin) {
+            this.isReadFromStdin = stdin;
+            return this;
+        }
+
+        public SettingsBuilder isEnvironmentExposed(boolean isEnvironmentExposed) {
+            this.isEnvironmentExposed = isEnvironmentExposed;
+            return this;
+        }
+
+        public SettingsBuilder setSources(List<String> sources) {
+            this.sources = sources;
+            return this;
+        }
+
+        public SettingsBuilder setParameters(Map<String, String> parameters) {
+            if (parameters != null) {
+                this.parameters = parameters;
+            }
+            return this;
+        }
+
+        public SettingsBuilder setSystemProperties(Properties systemProperties) {
+            if(systemProperties != null) {
+                this.systemProperties = systemProperties;
+            }
+            return this;
+        }
+
+        public SettingsBuilder setConfiguration(Properties configuration) {
+            if (configuration != null) {
+                this.configuration = configuration;
+            }
+            return this;
+        }
+
+        public SettingsBuilder setWriter(Writer writer) {
+            this.writer = writer;
+            return this;
+        }
+
+        public Settings build() {
+            final Charset inputEncoding = Charset.forName(this.inputEncoding);
+            final Charset outputEncoding = Charset.forName(this.outputEncoding);
+            final String currLocale = locale != null ? locale : getDefaultLocale();
+            final File currOutputFile = outputFile != null ? new File(outputFile) : null;
+
+            return new Settings(
+                    configuration,
+                    args,
+                    templateDirectories,
+                    templateName,
+                    interactiveTemplate,
+                    inputEncoding,
+                    outputEncoding,
+                    verbose,
+                    currOutputFile,
+                    include,
+                    exclude,
+                    LocaleUtils.parseLocale(currLocale),
+                    isReadFromStdin,
+                    isEnvironmentExposed,
+                    sources,
+                    parameters,
+                    systemProperties,
+                    writer
+            );
+        }
+
+        private String getDefaultLocale() {
+            return configuration.getProperty(
+                    LOCALE_KEY,
+                    System.getProperty(LOCALE_KEY, DEFAULT_LOCALE.toString()));
+        }
+    }
+}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
new file mode 100644
index 0000000..084be3d
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
@@ -0,0 +1,48 @@
+package org.apache.freemarker.generator.cli.config;
+
+import freemarker.cache.TemplateLoader;
+import org.apache.freemarker.generator.base.document.DocumentsSupplier;
+import org.apache.freemarker.generator.base.file.PropertiesClassPathSupplier;
+import org.apache.freemarker.generator.base.file.PropertiesFileSystemSupplier;
+import org.apache.freemarker.generator.base.file.PropertiesSupplier;
+
+import java.util.function.Supplier;
+
+/**
+ * Convenience methods to create suppliers.
+ */
+public class Suppliers {
+
+    public static ConfigurationSupplier configurationSupplier(Settings settings) {
+        return new ConfigurationSupplier(settings, templateLoaderSupplier(settings));
+    }
+
+    public static ConfigurationSupplier configurationSupplier(Settings settings, Supplier<TemplateLoader> templateLoader) {
+        return new ConfigurationSupplier(settings, templateLoader);
+    }
+
+    public static TemplateDirectorySupplier templateDirectorySupplier(String userDefinedTemplateDir) {
+        return new TemplateDirectorySupplier(userDefinedTemplateDir);
+    }
+
+    public static TemplateLoaderSupplier templateLoaderSupplier(Settings settings) {
+        return new TemplateLoaderSupplier(settings.getTemplateDirectories());
+    }
+
+    public static ToolsSupplier toolsSupplier(Settings settings) {
+        return new ToolsSupplier(settings.getConfiguration(), settings.toMap());
+    }
+
+    public static DocumentsSupplier documentsSupplier(Settings settings) {
+        return new DocumentsSupplier(settings.getSources(),
+                settings.getInclude(),
+                settings.getExclude(),
+                settings.getInputEncoding());
+    }
+
+    public static PropertiesSupplier propertiesSupplier(String fileName) {
+        return new PropertiesSupplier(
+                new PropertiesFileSystemSupplier(fileName),
+                new PropertiesClassPathSupplier(fileName));
+    }
+}
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplier.java
new file mode 100644
index 0000000..976c4d4
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplier.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import org.apache.commons.io.FilenameUtils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+import static java.util.Arrays.asList;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * Determine a list of directories to load a relative template file in the following order
+ * <ol>
+ *    <li>User-defined template directory</li>
+ *    <li>Current working directory</li>
+ *    <li>~/.freemarker-cli</li>
+ *    <li>Application installation directory</li>
+ * </ol>
+ */
+public class TemplateDirectorySupplier implements Supplier<List<File>> {
+
+    /** Installation directory of "freemarker-cli" when invoked with shell wrapper */
+    private static final String APP_HOME = "app.home";
+
+    /** Current working directory when invoked with shell wrapper */
+    private static final String USER_DIR = "user.dir";
+
+    /** Home directory of the user */
+    private static final String USER_HOME = "user.home";
+
+    /** The user's optional "freemarker-cli" directory */
+    private static final String USER_CONFIGURATION_DIR_NAME = ".freemarker-cli";
+
+    /** User-defined template directory */
+    private final String userDefinedTemplateDir;
+
+    public TemplateDirectorySupplier(String userDefinedTemplateDir) {
+        this.userDefinedTemplateDir = userDefinedTemplateDir;
+    }
+
+    @Override
+    public List<File> get() {
+        return templateLoaderDirectories().stream()
+                .filter(Objects::nonNull)
+                .map(FilenameUtils::normalize)
+                .map(File::new)
+                .distinct()
+                .filter(TemplateDirectorySupplier::isDirectory)
+                .collect(toList());
+    }
+
+    private List<String> templateLoaderDirectories() {
+        return new ArrayList<>(asList(
+                userTemplateDirName(),
+                currentWorkingDirName(),
+                userConfigDirName(),
+                applicationDirName()
+        ));
+    }
+
+    private String userTemplateDirName() {
+        return userDefinedTemplateDir != null ? new File(userDefinedTemplateDir).getAbsolutePath() : null;
+    }
+
+    private String userConfigDirName() {
+        final String userHomeDir = System.getProperty(USER_HOME);
+        return new File(userHomeDir, USER_CONFIGURATION_DIR_NAME).getAbsolutePath();
+    }
+
+    private static String applicationDirName() {
+        return System.getProperty(APP_HOME);
+    }
+
+    private static String currentWorkingDirName() {
+        return System.getProperty(USER_DIR);
+    }
+
+    private static boolean isDirectory(File directory) {
+        return directory != null && directory.exists() && directory.isDirectory() && directory.canRead();
+    }
+}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateLoaderSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateLoaderSupplier.java
new file mode 100644
index 0000000..89182dd
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateLoaderSupplier.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import freemarker.cache.FileTemplateLoader;
+import freemarker.cache.MultiTemplateLoader;
+import freemarker.cache.TemplateLoader;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Supply a FreeMarker template loader using a list of directories.
+ */
+public class TemplateLoaderSupplier implements Supplier<TemplateLoader> {
+
+    private final List<File> templateDirectories;
+
+    public TemplateLoaderSupplier(List<File> templateDirectories) {
+        this.templateDirectories = requireNonNull(templateDirectories);
+    }
+
+    @Override
+    public TemplateLoader get() {
+        return multiTemplateLoader(templateDirectories);
+    }
+
+    private static MultiTemplateLoader multiTemplateLoader(List<File> templateDirectories) {
+        return new MultiTemplateLoader(
+                templateDirectories.stream()
+                        .map(TemplateLoaderSupplier::fileTemplateLoader)
+                        .toArray(TemplateLoader[]::new));
+    }
+
+    private static FileTemplateLoader fileTemplateLoader(File directory) {
+        try {
+            return new FileTemplateLoader(directory);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to create template loader: " + directory, e);
+        }
+    }
+}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java
new file mode 100644
index 0000000..e775eb1
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import org.apache.freemarker.generator.base.tools.ToolsFactory;
+
+import java.util.Map;
+import java.util.Properties;
+import java.util.function.Supplier;
+
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Stream.of;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Configuration.TOOLS_PREFIX;
+import static org.apache.freemarker.generator.base.util.PropertiesTransformer.filterKeyPrefix;
+import static org.apache.freemarker.generator.base.util.PropertiesTransformer.removeKeyPrefix;
+
+/**
+ * Supplies FreeMarker tools based on the provided settings.
+ */
+public class ToolsSupplier implements Supplier<Map<String, Object>> {
+
+    private final Properties configuration;
+    private final Map<String, Object> settings;
+
+    /**
+     * Constructor.
+     *
+     * @param configuration Containing "freemarker.tools.XXX=class"
+     * @param settings      Settings passed to the instantiated tools
+     */
+    public ToolsSupplier(Properties configuration, Map<String, Object> settings) {
+        this.configuration = requireNonNull(configuration);
+        this.settings = requireNonNull(settings);
+    }
+
+    @Override
+    public Map<String, Object> get() {
+        final Properties properties = toolsProperties();
+        return properties.stringPropertyNames().stream()
+                .filter(key -> toolExists(properties.getProperty(key)))
+                .collect(toMap(key -> key, key -> tool(properties.getProperty(key), settings)));
+    }
+
+    /**
+     * Slice through the properties to create a list of "tool" to
+     * implementation class mapping.
+     *
+     * @return tool properties
+     */
+    private Properties toolsProperties() {
+        return of(configuration)
+                .map(p -> filterKeyPrefix(p, TOOLS_PREFIX))
+                .map(p -> removeKeyPrefix(p, TOOLS_PREFIX))
+                .findFirst().get();
+    }
+
+    private static boolean toolExists(String clazzName) {
+        return ToolsFactory.exists(clazzName);
+    }
+
+    private static Object tool(String clazzName, Map<String, Object> settings) {
+        return ToolsFactory.create(clazzName, settings);
+    }
+}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/GitVersionProvider.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/GitVersionProvider.java
new file mode 100644
index 0000000..bfa3f3d
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/GitVersionProvider.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.picocli;
+
+import org.apache.freemarker.generator.cli.Main;
+import picocli.CommandLine.IVersionProvider;
+
+import java.io.InputStream;
+import java.util.Properties;
+
+import static java.lang.String.format;
+
+public class GitVersionProvider implements IVersionProvider {
+
+    private final String gitBuildVersion;
+    private final String gitCommitId;
+    private final String gitCommitTime;
+
+    public GitVersionProvider() {
+        final Properties gitProperties = getGitProperties();
+        this.gitBuildVersion = gitProperties.getProperty("git.build.version", "unknown");
+        this.gitCommitId = gitProperties.getProperty("git.commit.id", "unknown");
+        this.gitCommitTime = gitProperties.getProperty("git.commit.time", "unknown");
+    }
+
+    @Override
+    public String[] getVersion() {
+        return new String[] { format("version=%s, time=%s, commit=%s", gitBuildVersion, gitCommitTime, gitCommitId) };
+    }
+
+    private static Properties getGitProperties() {
+        final Properties properties = new Properties();
+        try (InputStream is = Main.class.getClassLoader().getResourceAsStream("git.properties")) {
+            if (is != null) {
+                properties.load(is);
+            }
+        } catch (Exception e) {
+            return properties;
+        }
+        return properties;
+    }
+}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
new file mode 100644
index 0000000..c09faae
--- /dev/null
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.task;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import org.apache.commons.io.FileUtils;
+import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.freemarker.generator.base.document.Documents;
+import org.apache.freemarker.generator.cli.config.Settings;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.function.Supplier;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Location.STDIN;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.DOCUMENTS;
+import static org.apache.freemarker.generator.cli.config.Suppliers.configurationSupplier;
+import static org.apache.freemarker.generator.cli.config.Suppliers.documentsSupplier;
+import static org.apache.freemarker.generator.cli.config.Suppliers.toolsSupplier;
+
+/**
+ * Renders a FreeMarker template.
+ */
+public class FreeMarkerTask implements Callable<Integer> {
+
+    private static final int SUCCESS = 0;
+
+    private final Settings settings;
+    private final Supplier<Map<String, Object>> toolsSupplier;
+    private final Supplier<List<Document>> documentsSupplier;
+    private final Supplier<Configuration> configurationSupplier;
+
+    public FreeMarkerTask(Settings settings) {
+        this(settings, toolsSupplier(settings), documentsSupplier(settings), configurationSupplier(settings));
+    }
+
+    public FreeMarkerTask(Settings settings,
+                          Supplier<Map<String, Object>> toolsSupplier,
+                          Supplier<List<Document>> documentsSupplier,
+                          Supplier<Configuration> configurationSupplier) {
+        this.settings = requireNonNull(settings);
+        this.toolsSupplier = requireNonNull(toolsSupplier);
+        this.documentsSupplier = requireNonNull(documentsSupplier);
+        this.configurationSupplier = requireNonNull(configurationSupplier);
+    }
+
+    @Override
+    public Integer call() {
+        final Template template = template(settings, configurationSupplier);
+        try (Writer writer = settings.getWriter(); Documents documents = documents(settings, documentsSupplier)) {
+            final Map<String, Object> dataModel = dataModel(settings, documents, toolsSupplier);
+            template.process(dataModel, writer);
+            return SUCCESS;
+        } catch (RuntimeException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to render FreeMarker template: " + template.getName(), e);
+        }
+    }
+
+    private static Documents documents(Settings settings, Supplier<List<Document>> documentsSupplier) {
+        final List<Document> documents = new ArrayList<>(documentsSupplier.get());
+
+        // Add optional document from STDIN at the start of the list since
+        // this allows easy sequence slicing in FreeMarker.
+        if (settings.isReadFromStdin()) {
+            documents.add(0, DocumentFactory.create(STDIN, System.in, STDIN, UTF_8));
+        }
+
+        return new Documents(documents);
+    }
+
+    /**
+     * Loading FreeMarker templates from absolute paths is not encouraged due to security
+     * concern (see https://freemarker.apache.org/docs/pgui_config_templateloading.html#autoid_42)
+     * which are mostly irrelevant when running on the command line. So we resolve the absolute file
+     * instead of relying on existing template loaders.
+     *
+     * @param settings              Settings
+     * @param configurationSupplier Supplies FreeMarker configuration
+     * @return FreeMarker template
+     */
+    private static Template template(Settings settings, Supplier<Configuration> configurationSupplier) {
+        final String templateName = settings.getTemplateName();
+        final Configuration configuration = configurationSupplier.get();
+
+        try {
+            if (settings.isInteractiveTemplate()) {
+                return interactiveTemplate(settings, configuration);
+            } else if (isAbsoluteTemplateFile(settings)) {
+                return fileTemplate(settings, configuration);
+            } else {
+                return configuration.getTemplate(templateName);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to load template: " + templateName, e);
+        }
+    }
+
+    private static Map<String, Object> dataModel(Settings settings, Documents documents, Supplier<Map<String, Object>> tools) {
+        final Map<String, Object> dataModel = new HashMap<>();
+
+        dataModel.put(DOCUMENTS, documents);
+
+        if (settings.isEnvironmentExposed()) {
+            // add all system & user-supplied properties as top-level entries
+            dataModel.putAll(System.getenv());
+            dataModel.putAll(settings.getParameters());
+        }
+
+        dataModel.putAll(tools.get());
+
+        return dataModel;
+    }
+
+    private static boolean isAbsoluteTemplateFile(Settings settings) {
+        final File file = new File(settings.getTemplateName());
+        return file.isAbsolute() && file.exists() & !file.isDirectory();
+    }
+
+    private static Template fileTemplate(Settings settings, Configuration configuration) {
+        final String templateName = settings.getTemplateName();
+        final File templateFile = new File(templateName);
+        try {
+            final String content = FileUtils.readFileToString(templateFile, settings.getTemplateEncoding());
+            return new Template(templateName, content, configuration);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to load template: " + templateName, e);
+        }
+    }
+
+    private static Template interactiveTemplate(Settings settings, Configuration configuration) {
+        try {
+            return new Template(Location.INTERACTIVE, settings.getInteractiveTemplate(), configuration);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to load interactive template", e);
+        }
+    }
+
+}
diff --git a/freemarker-generator-cli/src/main/resources/freemarker-cli.properties b/freemarker-generator-cli/src/main/resources/freemarker-cli.properties
new file mode 100644
index 0000000..8dd5f59
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/freemarker-cli.properties
@@ -0,0 +1,38 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#############################################################################
+# General FreeMarker Configuration
+# See https://freemarker.apache.org/docs/api/freemarker/template/Configuration.html#setSetting-java.lang.String-java.lang.String-
+#############################################################################
+# freemarker.configuration.setting.locale=JVM default
+
+#############################################################################
+# Configure FreeMarker Tools (name -> implementation class)
+#############################################################################
+freemarker.tools.CSVTool=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool
+freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool
+freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool
+freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool
+freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool
+freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool
+freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool
+freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool
+freemarker.tools.SystemTool=org.apache.freemarker.generator.tools.system.SystemTool
+freemarker.tools.UUIDTool=org.apache.freemarker.generator.tools.uuid.UUIDTool
+freemarker.tools.XmlTool=org.apache.freemarker.generator.tools.xml.XmlTool
+freemarker.tools.YamlTool=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool
diff --git a/freemarker-generator-cli/src/main/resources/patterns/firewalls b/freemarker-generator-cli/src/main/resources/patterns/firewalls
new file mode 100755
index 0000000..8f16bea
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/firewalls
@@ -0,0 +1,3 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+# NetScreen firewall logs
+NETSCREENSESSIONLOG %{SYSLOGTIMESTAMP:date} %{IPORHOST:device} %{IPORHOST}: NetScreen device_id=%{WORD:device_id}%{DATA}: start_time=%{QUOTEDSTRING:start_time} duration=%{INT:duration} policy_id=%{INT:policy_id} service=%{DATA:service} proto=%{INT:proto} src zone=%{WORD:src_zone} dst zone=%{WORD:dst_zone} action=%{WORD:action} sent=%{INT:sent} rcvd=%{INT:rcvd} src=%{IPORHOST:src_ip} dst=%{IPORHOST:dst_ip} src_port=%{INT:src_port} dst_port=%{INT:dst_port} src-xlated ip=%{IPORHOST:src_xlated_ip} port=%{INT:src_xlated_port} dst-xlated ip=%{IPORHOST:dst_xlated_ip} port=%{INT:dst_xlated_port} session_id=%{INT:session_id} reason=%{GREEDYDATA:reason}
diff --git a/freemarker-generator-cli/src/main/resources/patterns/haproxy b/freemarker-generator-cli/src/main/resources/patterns/haproxy
new file mode 100755
index 0000000..99fff30
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/haproxy
@@ -0,0 +1,38 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+## These patterns were tested w/ haproxy-1.4.15
+
+## Documentation of the haproxy log formats can be found at the following links:
+## http://code.google.com/p/haproxy-docs/wiki/HTTPLogFormat
+## http://code.google.com/p/haproxy-docs/wiki/TCPLogFormat
+
+HAPROXYTIME (?!<[0-9])%{HOUR:haproxy_hour}:%{MINUTE:haproxy_minute}(?::%{SECOND:haproxy_second})(?![0-9])
+HAPROXYDATE %{MONTHDAY:haproxy_monthday}/%{MONTH:haproxy_month}/%{YEAR:haproxy_year}:%{HAPROXYTIME:haproxy_time}.%{INT:haproxy_milliseconds}
+
+# Override these default patterns to parse out what is captured in your haproxy.cfg
+HAPROXYCAPTUREDREQUESTHEADERS %{DATA:captured_request_headers}
+HAPROXYCAPTUREDRESPONSEHEADERS %{DATA:captured_response_headers}
+
+# Example:
+#  These haproxy config lines will add data to the logs that are captured
+#  by the patterns below. Place them in your custom patterns directory to
+#  override the defaults.
+#
+#  capture request header Host len 40
+#  capture request header X-Forwarded-For len 50
+#  capture request header Accept-Language len 50
+#  capture request header Referer len 200
+#  capture request header User-Agent len 200
+#
+#  capture response header Content-Type len 30
+#  capture response header Content-Encoding len 10
+#  capture response header Cache-Control len 200
+#  capture response header Last-Modified len 200
+#
+# HAPROXYCAPTUREDREQUESTHEADERS %{DATA:request_header_host}\|%{DATA:request_header_x_forwarded_for}\|%{DATA:request_header_accept_language}\|%{DATA:request_header_referer}\|%{DATA:request_header_user_agent}
+# HAPROXYCAPTUREDRESPONSEHEADERS %{DATA:response_header_content_type}\|%{DATA:response_header_content_encoding}\|%{DATA:response_header_cache_control}\|%{DATA:response_header_last_modified}
+
+# parse a haproxy 'httplog' line
+HAPROXYHTTP %{SYSLOGTIMESTAMP:syslog_timestamp} %{IPORHOST:syslog_server} %{SYSLOGPROG}: %{IP:client_ip}:%{INT:client_port} \[%{HAPROXYDATE:accept_date}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} (\{%{HAPROXYCAPTUREDREQUESTHEADERS}\})?( )?(\{%{HAPROXYCAPTUREDRESPONSEHEADERS}\})?( )?"%{WORD:http_verb} %{URIPATHPARAM:http_request}( HTTP/%{NUMBER:http_version}")?
+
+# parse a haproxy 'tcplog' line
+HAPROXYTCP %{SYSLOGTIMESTAMP:syslog_timestamp} %{IPORHOST:syslog_server} %{SYSLOGPROG}: %{IP:client_ip}:%{INT:client_port} \[%{HAPROXYDATE:accept_date}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_queue}/%{INT:time_backend_connect}/%{NOTSPACE:time_duration} %{NOTSPACE:bytes_read} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue}
diff --git a/freemarker-generator-cli/src/main/resources/patterns/java b/freemarker-generator-cli/src/main/resources/patterns/java
new file mode 100755
index 0000000..611952c
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/java
@@ -0,0 +1,4 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+JAVACLASS (?:[a-zA-Z0-9-]+\.)+[A-Za-z0-9$]+
+JAVAFILE (?:[A-Za-z0-9_.-]+)
+JAVASTACKTRACEPART at %{JAVACLASS:class}\.%{WORD:method}\(%{JAVAFILE:file}:%{NUMBER:line}\)
diff --git a/freemarker-generator-cli/src/main/resources/patterns/linux-syslog b/freemarker-generator-cli/src/main/resources/patterns/linux-syslog
new file mode 100755
index 0000000..a888999
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/linux-syslog
@@ -0,0 +1,8 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+SYSLOGBASE2 (?:%{SYSLOGTIMESTAMP:timestamp}|%{TIMESTAMP_ISO8601:timestamp8601}) (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
+SYSLOGPAMSESSION %{SYSLOGBASE} (?=%{GREEDYDATA:message})%{WORD:pam_module}\(%{DATA:pam_caller}\): session %{WORD:pam_session_state} for user %{USERNAME:username}(?: by %{GREEDYDATA:pam_by})?
+
+CRON_ACTION [A-Z ]+
+CRONLOG %{SYSLOGBASE} \(%{USER:user}\) %{CRON_ACTION:action} \(%{DATA:message}\)
+
+SYSLOGLINE %{SYSLOGBASE2} %{GREEDYDATA:message}
diff --git a/freemarker-generator-cli/src/main/resources/patterns/nagios b/freemarker-generator-cli/src/main/resources/patterns/nagios
new file mode 100755
index 0000000..771cb0a
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/nagios
@@ -0,0 +1,109 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+##################################################################################
+##################################################################################
+# Chop Nagios log files to smithereens!
+#
+# A set of GROK filters to process logfiles generated by Nagios.
+# While it does not, this set intends to cover all possible Nagios logs.
+#
+# Some more work needs to be done to cover all External Commands:
+#	http://old.nagios.org/developerinfo/externalcommands/commandlist.php
+#
+# If you need some support on these rules please contact:
+#	Jelle Smet http://smetj.net
+#
+#################################################################################
+#################################################################################
+
+NAGIOSTIME \[%{NUMBER:nagios_epoch}\]
+
+###############################################
+######## Begin nagios log types
+###############################################
+NAGIOS_TYPE_CURRENT_SERVICE_STATE CURRENT SERVICE STATE
+NAGIOS_TYPE_CURRENT_HOST_STATE CURRENT HOST STATE
+
+NAGIOS_TYPE_SERVICE_NOTIFICATION SERVICE NOTIFICATION
+NAGIOS_TYPE_HOST_NOTIFICATION HOST NOTIFICATION
+
+NAGIOS_TYPE_SERVICE_ALERT SERVICE ALERT
+NAGIOS_TYPE_HOST_ALERT HOST ALERT
+
+NAGIOS_TYPE_SERVICE_FLAPPING_ALERT SERVICE FLAPPING ALERT
+NAGIOS_TYPE_HOST_FLAPPING_ALERT HOST FLAPPING ALERT
+
+NAGIOS_TYPE_SERVICE_DOWNTIME_ALERT SERVICE DOWNTIME ALERT
+NAGIOS_TYPE_HOST_DOWNTIME_ALERT HOST DOWNTIME ALERT
+
+NAGIOS_TYPE_PASSIVE_SERVICE_CHECK PASSIVE SERVICE CHECK
+NAGIOS_TYPE_PASSIVE_HOST_CHECK PASSIVE HOST CHECK
+
+NAGIOS_TYPE_SERVICE_EVENT_HANDLER SERVICE EVENT HANDLER
+NAGIOS_TYPE_HOST_EVENT_HANDLER HOST EVENT HANDLER
+
+NAGIOS_TYPE_EXTERNAL_COMMAND EXTERNAL COMMAND
+NAGIOS_TYPE_TIMEPERIOD_TRANSITION TIMEPERIOD TRANSITION
+###############################################
+######## End nagios log types
+###############################################
+
+###############################################
+######## Begin external check types
+###############################################
+NAGIOS_EC_DISABLE_SVC_CHECK DISABLE_SVC_CHECK
+NAGIOS_EC_ENABLE_SVC_CHECK ENABLE_SVC_CHECK
+NAGIOS_EC_DISABLE_HOST_CHECK DISABLE_HOST_CHECK
+NAGIOS_EC_ENABLE_HOST_CHECK ENABLE_HOST_CHECK
+NAGIOS_EC_PROCESS_SERVICE_CHECK_RESULT PROCESS_SERVICE_CHECK_RESULT
+NAGIOS_EC_PROCESS_HOST_CHECK_RESULT PROCESS_HOST_CHECK_RESULT
+NAGIOS_EC_SCHEDULE_SERVICE_DOWNTIME SCHEDULE_SERVICE_DOWNTIME
+NAGIOS_EC_SCHEDULE_HOST_DOWNTIME SCHEDULE_HOST_DOWNTIME
+###############################################
+######## End external check types
+###############################################
+NAGIOS_WARNING Warning:%{SPACE}%{GREEDYDATA:nagios_message}
+
+NAGIOS_CURRENT_SERVICE_STATE %{NAGIOS_TYPE_CURRENT_SERVICE_STATE:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statetype};%{DATA:nagios_statecode};%{GREEDYDATA:nagios_message}
+NAGIOS_CURRENT_HOST_STATE %{NAGIOS_TYPE_CURRENT_HOST_STATE:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statetype};%{DATA:nagios_statecode};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_NOTIFICATION %{NAGIOS_TYPE_SERVICE_NOTIFICATION:nagios_type}: %{DATA:nagios_notifyname};%{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_contact};%{GREEDYDATA:nagios_message}
+NAGIOS_HOST_NOTIFICATION %{NAGIOS_TYPE_HOST_NOTIFICATION}: %{DATA:nagios_notifyname};%{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_contact};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_ALERT %{NAGIOS_TYPE_SERVICE_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{NUMBER:nagios_attempt};%{GREEDYDATA:nagios_message}
+NAGIOS_HOST_ALERT %{NAGIOS_TYPE_HOST_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{NUMBER:nagios_attempt};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_FLAPPING_ALERT %{NAGIOS_TYPE_SERVICE_FLAPPING_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_message}
+NAGIOS_HOST_FLAPPING_ALERT %{NAGIOS_TYPE_HOST_FLAPPING_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_DOWNTIME_ALERT %{NAGIOS_TYPE_SERVICE_DOWNTIME_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+NAGIOS_HOST_DOWNTIME_ALERT %{NAGIOS_TYPE_HOST_DOWNTIME_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+
+NAGIOS_PASSIVE_SERVICE_CHECK %{NAGIOS_TYPE_PASSIVE_SERVICE_CHECK:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+NAGIOS_PASSIVE_HOST_CHECK %{NAGIOS_TYPE_PASSIVE_HOST_CHECK:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+
+NAGIOS_SERVICE_EVENT_HANDLER %{NAGIOS_TYPE_SERVICE_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
+NAGIOS_HOST_EVENT_HANDLER %{NAGIOS_TYPE_HOST_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
+
+NAGIOS_TIMEPERIOD_TRANSITION %{NAGIOS_TYPE_TIMEPERIOD_TRANSITION:nagios_type}: %{DATA:nagios_service};%{DATA:nagios_unknown1};%{DATA:nagios_unknown2};
+
+####################
+#### External checks
+####################
+
+#Disable host & service check
+NAGIOS_EC_LINE_DISABLE_SVC_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_DISABLE_SVC_CHECK:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_service}
+NAGIOS_EC_LINE_DISABLE_HOST_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_DISABLE_HOST_CHECK:nagios_command};%{DATA:nagios_hostname}
+
+#Enable host & service check
+NAGIOS_EC_LINE_ENABLE_SVC_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_ENABLE_SVC_CHECK:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_service}
+NAGIOS_EC_LINE_ENABLE_HOST_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_ENABLE_HOST_CHECK:nagios_command};%{DATA:nagios_hostname}
+
+#Process host & service check
+NAGIOS_EC_LINE_PROCESS_SERVICE_CHECK_RESULT %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_PROCESS_SERVICE_CHECK_RESULT:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_check_result}
+NAGIOS_EC_LINE_PROCESS_HOST_CHECK_RESULT %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_PROCESS_HOST_CHECK_RESULT:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_check_result}
+
+#Schedule host & service downtime
+NAGIOS_EC_LINE_SCHEDULE_HOST_DOWNTIME %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_SCHEDULE_HOST_DOWNTIME:nagios_command};%{DATA:nagios_hostname};%{NUMBER:nagios_start_time};%{NUMBER:nagios_end_time};%{NUMBER:nagios_fixed};%{NUMBER:nagios_trigger_id};%{NUMBER:nagios_duration};%{DATA:author};%{DATA:comment}
+
+#End matching line
+NAGIOSLOGLINE %{NAGIOSTIME} (?:%{NAGIOS_WARNING}|%{NAGIOS_CURRENT_SERVICE_STATE}|%{NAGIOS_CURRENT_HOST_STATE}|%{NAGIOS_SERVICE_NOTIFICATION}|%{NAGIOS_HOST_NOTIFICATION}|%{NAGIOS_SERVICE_ALERT}|%{NAGIOS_HOST_ALERT}|%{NAGIOS_SERVICE_FLAPPING_ALERT}|%{NAGIOS_HOST_FLAPPING_ALERT}|%{NAGIOS_SERVICE_DOWNTIME_ALERT}|%{NAGIOS_HOST_DOWNTIME_ALERT}|%{NAGIOS_PASSIVE_SERVICE_CHECK}|%{NAGIOS_PASSIVE_HOST_CHECK}|%{NAGIOS_SERVICE_EVENT_HANDLER}|%{NAGIOS_HOST_EVENT_HANDLER}|%{NAGIOS_TIMEPERIOD_TRANSITION}|%{NAGIOS_EC_LINE_DISABLE_SVC_CHECK}|%{NAGIOS_EC_LINE_ENABLE_SVC_CHECK}|%{NAGIOS_EC_LINE_DISABLE_HOST_CHECK|%{NAGIOS_EC_LINE_ENABLE_HOST_CHECK}|%{NAGIOS_EC_LINE_PROCESS_HOST_CHECK_RESULT}|%{NAGIOS_EC_LINE_PROCESS_SERVICE_CHECK_RESULT}|%{NAGIOS_EC_LINE_SCHEDULE_HOST_DOWNTIME})
diff --git a/freemarker-generator-cli/src/main/resources/patterns/patterns b/freemarker-generator-cli/src/main/resources/patterns/patterns
new file mode 100755
index 0000000..52235d8
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/patterns
@@ -0,0 +1,108 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+
+USERNAME [a-zA-Z0-9._-]+
+USER %{USERNAME:UNWANTED}
+INT (?:[+-]?(?:[0-9]+))
+BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
+NUMBER (?:%{BASE10NUM:UNWANTED})
+BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
+BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b
+
+POSINT \b(?:[1-9][0-9]*)\b
+NONNEGINT \b(?:[0-9]+)\b
+WORD \b\w+\b
+NOTSPACE \S+
+SPACE \s*
+DATA .*?
+GREEDYDATA .*
+#QUOTEDSTRING (?:(?<!\\)(?:"(?:\\.|[^\\"])*"|(?:'(?:\\.|[^\\'])*')|(?:`(?:\\.|[^\\`])*`)))
+QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``))
+UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}
+
+# Networking
+MAC (?:%{CISCOMAC:UNWANTED}|%{WINDOWSMAC:UNWANTED}|%{COMMONMAC:UNWANTED})
+CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4})
+WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2})
+COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})
+IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
+IPV4 (?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])
+IP (?:%{IPV6:UNWANTED}|%{IPV4:UNWANTED})
+HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
+HOST %{HOSTNAME:UNWANTED}
+IPORHOST (?:%{HOSTNAME:UNWANTED}|%{IP:UNWANTED})
+HOSTPORT (?:%{IPORHOST}:%{POSINT:PORT})
+
+# paths
+PATH (?:%{UNIXPATH}|%{WINPATH})
+UNIXPATH (?>/(?>[\w_%!$@:.,~-]+|\\.)*)+
+#UNIXPATH (?<![\w\/])(?:/[^\/\s?*]*)+
+TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+))
+WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+
+URIPROTO [A-Za-z]+(\+[A-Za-z+]+)?
+URIHOST %{IPORHOST}(?::%{POSINT:port})?
+# uripath comes loosely from RFC1738, but mostly from what Firefox
+# doesn't turn into %XX
+URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+
+#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
+URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
+URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?
+URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
+
+# Months: January, Feb, 3, 03, 12, December
+MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b
+MONTHNUM (?:0?[1-9]|1[0-2])
+MONTHNUM2 (?:0[1-9]|1[0-2])
+MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])
+
+# Days: Monday, Tue, Thu, etc...
+DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)
+
+# Years?
+YEAR (?>\d\d){1,2}
+# Time: HH:MM:SS
+#TIME \d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?
+# I'm still on the fence about using grok to perform the time match,
+# since it's probably slower.
+# TIME %{POSINT<24}:%{POSINT<60}(?::%{POSINT<60}(?:\.%{POSINT})?)?
+HOUR (?:2[0123]|[01]?[0-9])
+MINUTE (?:[0-5][0-9])
+# '60' is a leap second in most time standards and thus is valid.
+SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)
+TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
+# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
+DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
+DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
+ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
+ISO8601_SECOND (?:%{SECOND}|60)
+TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
+DATE %{DATE_US}|%{DATE_EU}
+DATESTAMP %{DATE}[- ]%{TIME}
+TZ (?:[PMCE][SD]T|UTC)
+DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
+DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE}
+DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}
+DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND}
+
+# Syslog Dates: Month Day HH:MM:SS
+SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
+PROG (?:[\w._/%-]+)
+SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])?
+SYSLOGHOST %{IPORHOST}
+SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}>
+HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}
+
+# Shortcuts
+QS %{QUOTEDSTRING:UNWANTED}
+
+# Log formats
+SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
+
+MESSAGESLOG %{SYSLOGBASE} %{DATA}
+
+COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
+COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}
+COMMONAPACHELOG_DATATYPED %{IPORHOST:clientip} %{USER:ident;boolean} %{USER:auth} \[%{HTTPDATE:timestamp;date;dd/MMM/yyyy:HH:mm:ss Z}\] "(?:%{WORD:verb;string} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion;float})?|%{DATA:rawrequest})" %{NUMBER:response;int} (?:%{NUMBER:bytes;long}|-)
+
+
+# Log Levels
+LOGLEVEL ([A|a]lert|ALERT|[T|t]race|TRACE|[D|d]ebug|DEBUG|[N|n]otice|NOTICE|[I|i]nfo|INFO|[W|w]arn?(?:ing)?|WARN?(?:ING)?|[E|e]rr?(?:or)?|ERR?(?:OR)?|[C|c]rit?(?:ical)?|CRIT?(?:ICAL)?|[F|f]atal|FATAL|[S|s]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
diff --git a/freemarker-generator-cli/src/main/resources/patterns/postfix b/freemarker-generator-cli/src/main/resources/patterns/postfix
new file mode 100755
index 0000000..3adcb69
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/postfix
@@ -0,0 +1,125 @@
+# common postfix patterns
+POSTFIX_QUEUEID ([0-9A-F]{6,}|[0-9a-zA-Z]{15,})
+POSTFIX_CLIENT_INFO %{HOSTNAME:postfix_client_hostname}?\[%{IP:postfix_client_ip}\](:%{INT:postfix_client_port})?
+POSTFIX_RELAY_INFO %{HOSTNAME:postfix_relay_hostname}?\[(%{IP:postfix_relay_ip}|%{DATA:postfix_relay_service})\](:%{INT:postfix_relay_port})?|%{WORD:postfix_relay_service}
+POSTFIX_SMTP_STAGE (CONNECT|HELO|EHLO|STARTTLS|AUTH|MAIL( FROM)?|RCPT( TO)?|(end of )?DATA|RSET|UNKNOWN|END-OF-MESSAGE|VRFY|\.)
+POSTFIX_ACTION (accept|defer|discard|filter|header-redirect|reject)
+POSTFIX_STATUS_CODE \d{3}
+POSTFIX_STATUS_CODE_ENHANCED \d\.\d\.\d
+POSTFIX_DNSBL_MESSAGE Service unavailable; .* \[%{GREEDYDATA:postfix_status_data}\] %{GREEDYDATA:postfix_status_message};
+POSTFIX_PS_ACCESS_ACTION (DISCONNECT|BLACKLISTED|WHITELISTED|WHITELIST VETO|PASS NEW|PASS OLD)
+POSTFIX_PS_VIOLATION (BARE NEWLINE|COMMAND (TIME|COUNT|LENGTH) LIMIT|COMMAND PIPELINING|DNSBL|HANGUP|NON-SMTP COMMAND|PREGREET)
+POSTFIX_TIME_UNIT %{NUMBER}[smhd]
+POSTFIX_KEYVALUE_DATA [\w-]+=[^;]*
+POSTFIX_KEYVALUE %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+POSTFIX_WARNING_LEVEL (warning|fatal|info)
+
+POSTFIX_TLSCONN (Anonymous|Trusted|Untrusted|Verified) TLS connection established (to %{POSTFIX_RELAY_INFO}|from %{POSTFIX_CLIENT_INFO}): %{DATA:postfix_tls_version} with cipher %{DATA:postfix_tls_cipher} \(%{DATA:postfix_tls_cipher_size} bits\)
+POSTFIX_DELAYS %{NUMBER:postfix_delay_before_qmgr}/%{NUMBER:postfix_delay_in_qmgr}/%{NUMBER:postfix_delay_conn_setup}/%{NUMBER:postfix_delay_transmission}
+POSTFIX_LOSTCONN (lost connection|timeout|SSL_accept error)
+POSTFIX_LOSTCONN_REASONS (receiving the initial server greeting|sending message body|sending end of data -- message may be sent more than once)
+POSTFIX_PROXY_MESSAGE (%{POSTFIX_STATUS_CODE:postfix_proxy_status_code} )?(%{POSTFIX_STATUS_CODE_ENHANCED:postfix_proxy_status_code_enhanced})?.*
+
+# helper patterns
+GREEDYDATA_NO_COLON [^:]*
+GREEDYDATA_NO_SEMICOLON [^;]*
+
+# warning patterns
+POSTFIX_WARNING_WITH_KV (%{POSTFIX_QUEUEID:postfix_queueid}: )?%{POSTFIX_WARNING_LEVEL:postfix_message_level}: %{GREEDYDATA:postfix_message}; %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+POSTFIX_WARNING_WITHOUT_KV (%{POSTFIX_QUEUEID:postfix_queueid}: )?%{POSTFIX_WARNING_LEVEL:postfix_message_level}: %{GREEDYDATA:postfix_message}
+POSTFIX_WARNING %{POSTFIX_WARNING_WITH_KV}|%{POSTFIX_WARNING_WITHOUT_KV}
+
+# smtpd patterns
+POSTFIX_SMTPD_CONNECT connect from %{POSTFIX_CLIENT_INFO}
+POSTFIX_SMTPD_DISCONNECT disconnect from %{POSTFIX_CLIENT_INFO}
+POSTFIX_SMTPD_LOSTCONN %{POSTFIX_LOSTCONN:postfix_smtpd_lostconn_data}( after %{POSTFIX_SMTP_STAGE:postfix_smtp_stage}( \(%{INT} bytes\))?)? from %{POSTFIX_CLIENT_INFO}(: %{GREEDYDATA:postfix_smtpd_lostconn_reason})?
+POSTFIX_SMTPD_NOQUEUE NOQUEUE: %{POSTFIX_ACTION:postfix_action}: %{POSTFIX_SMTP_STAGE:postfix_smtp_stage} from %{POSTFIX_CLIENT_INFO}:( %{POSTFIX_STATUS_CODE:postfix_status_code} %{POSTFIX_STATUS_CODE_ENHANCED:postfix_status_code_enhanced})?( <%{DATA:postfix_status_data}>:)? (%{POSTFIX_DNSBL_MESSAGE}|%{GREEDYDATA:postfix_status_message};) %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+POSTFIX_SMTPD_PIPELINING improper command pipelining after %{POSTFIX_SMTP_STAGE:postfix_smtp_stage} from %{POSTFIX_CLIENT_INFO}: %{GREEDYDATA:postfix_improper_pipelining_data}
+POSTFIX_SMTPD_PROXY proxy-%{POSTFIX_ACTION:postfix_proxy_result}: (%{POSTFIX_SMTP_STAGE:postfix_proxy_smtp_stage}): %{POSTFIX_PROXY_MESSAGE:postfix_proxy_message}; %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+
+# cleanup patterns
+POSTFIX_CLEANUP_MILTER %{POSTFIX_QUEUEID:postfix_queueid}: milter-%{POSTFIX_ACTION:postfix_milter_result}: %{GREEDYDATA:postfix_milter_message}; %{GREEDYDATA_NO_COLON:postfix_keyvalue_data}(: %{GREEDYDATA:postfix_milter_data})?
+
+# qmgr patterns
+POSTFIX_QMGR_REMOVED %{POSTFIX_QUEUEID:postfix_queueid}: removed
+POSTFIX_QMGR_ACTIVE %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data} \(queue active\)
+POSTFIX_QMGR_EXPIRED %{POSTFIX_QUEUEID:postfix_queueid}: from=<%{DATA:postfix_from}>, status=%{WORD:postfix_status}, returned to sender
+
+# pipe patterns
+POSTFIX_PIPE_ANY %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}, status=%{WORD:postfix_status} \(%{GREEDYDATA:postfix_pipe_response}\)
+
+# error patterns
+POSTFIX_ERROR_ANY %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}, status=%{WORD:postfix_status} \(%{GREEDYDATA:postfix_error_response}\)
+
+# discard patterns
+POSTFIX_DISCARD_ANY %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data} status=%{WORD:postfix_status} %{GREEDYDATA}
+
+# postsuper patterns
+POSTFIX_POSTSUPER_ACTIONS (removed|requeued|placed on hold|released from hold)
+POSTFIX_POSTSUPER_ACTION %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_POSTSUPER_ACTIONS:postfix_postsuper_action}
+POSTFIX_POSTSUPER_SUMMARY_ACTIONS (Deleted|Requeued|Placed on hold|Released from hold)
+POSTFIX_POSTSUPER_SUMMARY %{POSTFIX_POSTSUPER_SUMMARY_ACTIONS:postfix_postsuper_summary_action}: %{NUMBER:postfix_postsuper_summary_count} messages?
+
+# postscreen patterns
+POSTFIX_PS_CONNECT CONNECT from %{POSTFIX_CLIENT_INFO} to \[%{IP:postfix_server_ip}\]:%{INT:postfix_server_port}
+POSTFIX_PS_ACCESS %{POSTFIX_PS_ACCESS_ACTION:postfix_postscreen_access} %{POSTFIX_CLIENT_INFO}
+POSTFIX_PS_NOQUEUE %{POSTFIX_SMTPD_NOQUEUE}
+POSTFIX_PS_TOOBUSY NOQUEUE: reject: CONNECT from %{POSTFIX_CLIENT_INFO}: %{GREEDYDATA:postfix_postscreen_toobusy_data}
+POSTFIX_PS_DNSBL %{POSTFIX_PS_VIOLATION:postfix_postscreen_violation} rank %{INT:postfix_postscreen_dnsbl_rank} for %{POSTFIX_CLIENT_INFO}
+POSTFIX_PS_CACHE cache %{DATA} full cleanup: retained=%{NUMBER:postfix_postscreen_cache_retained} dropped=%{NUMBER:postfix_postscreen_cache_dropped} entries
+POSTFIX_PS_VIOLATIONS %{POSTFIX_PS_VIOLATION:postfix_postscreen_violation}( %{INT})?( after %{NUMBER:postfix_postscreen_violation_time})? from %{POSTFIX_CLIENT_INFO}(( after %{POSTFIX_SMTP_STAGE:postfix_smtp_stage})?(: %{GREEDYDATA:postfix_postscreen_data})?| in tests (after|before) SMTP handshake)
+
+# dnsblog patterns
+POSTFIX_DNSBLOG_LISTING addr %{IP:postfix_client_ip} listed by domain %{HOSTNAME:postfix_dnsbl_domain} as %{IP:postfix_dnsbl_result}
+
+# tlsproxy patterns
+POSTFIX_TLSPROXY_CONN (DIS)?CONNECT( from)? %{POSTFIX_CLIENT_INFO}
+
+# anvil patterns
+POSTFIX_ANVIL_CONN_RATE statistics: max connection rate %{NUMBER:postfix_anvil_conn_rate}/%{POSTFIX_TIME_UNIT:postfix_anvil_conn_period} for \(%{DATA:postfix_service}:%{IP:postfix_client_ip}\) at %{SYSLOGTIMESTAMP:postfix_anvil_timestamp}
+POSTFIX_ANVIL_CONN_CACHE statistics: max cache size %{NUMBER:postfix_anvil_cache_size} at %{SYSLOGTIMESTAMP:postfix_anvil_timestamp}
+POSTFIX_ANVIL_CONN_COUNT statistics: max connection count %{NUMBER:postfix_anvil_conn_count} for \(%{DATA:postfix_service}:%{IP:postfix_client_ip}\) at %{SYSLOGTIMESTAMP:postfix_anvil_timestamp}
+
+# smtp patterns
+POSTFIX_SMTP_DELIVERY %{POSTFIX_KEYVALUE} status=%{WORD:postfix_status}( \(%{GREEDYDATA:postfix_smtp_response}\))?
+POSTFIX_SMTP_CONNERR connect to %{POSTFIX_RELAY_INFO}: (Connection timed out|No route to host|Connection refused|Network is unreachable)
+POSTFIX_SMTP_LOSTCONN %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_LOSTCONN:postfix_smtp_lostconn_data} with %{POSTFIX_RELAY_INFO}( while %{POSTFIX_LOSTCONN_REASONS:postfix_smtp_lostconn_reason})?
+POSTFIX_SMTP_TIMEOUT %{POSTFIX_QUEUEID:postfix_queueid}: conversation with %{POSTFIX_RELAY_INFO} timed out( while %{POSTFIX_LOSTCONN_REASONS:postfix_smtp_lostconn_reason})?
+POSTFIX_SMTP_RELAYERR %{POSTFIX_QUEUEID:postfix_queueid}: host %{POSTFIX_RELAY_INFO} said: %{GREEDYDATA:postfix_smtp_response} \(in reply to %{POSTFIX_SMTP_STAGE:postfix_smtp_stage} command\)
+
+# master patterns
+POSTFIX_MASTER_START (daemon started|reload) -- version %{DATA:postfix_version}, configuration %{PATH:postfix_config_path}
+POSTFIX_MASTER_EXIT terminating on signal %{INT:postfix_termination_signal}
+
+# bounce patterns
+POSTFIX_BOUNCE_NOTIFICATION %{POSTFIX_QUEUEID:postfix_queueid}: sender (non-delivery|delivery status|delay) notification: %{POSTFIX_QUEUEID:postfix_bounce_queueid}
+
+# scache patterns
+POSTFIX_SCACHE_LOOKUPS statistics: (address|domain) lookup hits=%{INT:postfix_scache_hits} miss=%{INT:postfix_scache_miss} success=%{INT:postfix_scache_success}%
+POSTFIX_SCACHE_SIMULTANEOUS statistics: max simultaneous domains=%{INT:postfix_scache_domains} addresses=%{INT:postfix_scache_addresses} connection=%{INT:postfix_scache_connection}
+POSTFIX_SCACHE_TIMESTAMP statistics: start interval %{SYSLOGTIMESTAMP:postfix_scache_timestamp}
+
+# aggregate all patterns
+POSTFIX_SMTPD %{POSTFIX_SMTPD_CONNECT}|%{POSTFIX_SMTPD_DISCONNECT}|%{POSTFIX_SMTPD_LOSTCONN}|%{POSTFIX_SMTPD_NOQUEUE}|%{POSTFIX_SMTPD_PIPELINING}|%{POSTFIX_TLSCONN}|%{POSTFIX_WARNING}|%{POSTFIX_SMTPD_PROXY}|%{POSTFIX_KEYVALUE}
+POSTFIX_CLEANUP %{POSTFIX_CLEANUP_MILTER}|%{POSTFIX_WARNING}|%{POSTFIX_KEYVALUE}
+POSTFIX_QMGR %{POSTFIX_QMGR_REMOVED}|%{POSTFIX_QMGR_ACTIVE}|%{POSTFIX_QMGR_EXPIRED}|%{POSTFIX_WARNING}
+POSTFIX_PIPE %{POSTFIX_PIPE_ANY}
+POSTFIX_POSTSCREEN %{POSTFIX_PS_CONNECT}|%{POSTFIX_PS_ACCESS}|%{POSTFIX_PS_NOQUEUE}|%{POSTFIX_PS_TOOBUSY}|%{POSTFIX_PS_CACHE}|%{POSTFIX_PS_DNSBL}|%{POSTFIX_PS_VIOLATIONS}|%{POSTFIX_WARNING}
+POSTFIX_DNSBLOG %{POSTFIX_DNSBLOG_LISTING}|%{POSTFIX_WARNING}
+POSTFIX_ANVIL %{POSTFIX_ANVIL_CONN_RATE}|%{POSTFIX_ANVIL_CONN_CACHE}|%{POSTFIX_ANVIL_CONN_COUNT}
+POSTFIX_SMTP %{POSTFIX_SMTP_DELIVERY}|%{POSTFIX_SMTP_CONNERR}|%{POSTFIX_SMTP_LOSTCONN}|%{POSTFIX_SMTP_TIMEOUT}|%{POSTFIX_SMTP_RELAYERR}|%{POSTFIX_TLSCONN}|%{POSTFIX_WARNING}
+POSTFIX_DISCARD %{POSTFIX_DISCARD_ANY}|%{POSTFIX_WARNING}
+POSTFIX_LMTP %{POSTFIX_SMTP}
+POSTFIX_PICKUP %{POSTFIX_KEYVALUE}
+POSTFIX_TLSPROXY %{POSTFIX_TLSPROXY_CONN}|%{POSTFIX_WARNING}
+POSTFIX_MASTER %{POSTFIX_MASTER_START}|%{POSTFIX_MASTER_EXIT}|%{POSTFIX_WARNING}
+POSTFIX_BOUNCE %{POSTFIX_BOUNCE_NOTIFICATION}
+POSTFIX_SENDMAIL %{POSTFIX_WARNING}
+POSTFIX_POSTDROP %{POSTFIX_WARNING}
+POSTFIX_SCACHE %{POSTFIX_SCACHE_LOOKUPS}|%{POSTFIX_SCACHE_SIMULTANEOUS}|%{POSTFIX_SCACHE_TIMESTAMP}
+POSTFIX_TRIVIAL_REWRITE %{POSTFIX_WARNING}
+POSTFIX_TLSMGR %{POSTFIX_WARNING}
+POSTFIX_LOCAL %{POSTFIX_KEYVALUE}
+POSTFIX_VIRTUAL %{POSTFIX_SMTP_DELIVERY}
+POSTFIX_ERROR %{POSTFIX_ERROR_ANY}
+POSTFIX_POSTSUPER %{POSTFIX_POSTSUPER_ACTION}|%{POSTFIX_POSTSUPER_SUMMARY}
diff --git a/freemarker-generator-cli/src/main/resources/patterns/ruby b/freemarker-generator-cli/src/main/resources/patterns/ruby
new file mode 100755
index 0000000..9e5aa5b
--- /dev/null
+++ b/freemarker-generator-cli/src/main/resources/patterns/ruby
@@ -0,0 +1,3 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+RUBY_LOGLEVEL (?:DEBUG|FATAL|ERROR|WARN|INFO)
+RUBY_LOGGER [DFEWI], \[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid}\] *%{RUBY_LOGLEVEL:loglevel} -- +%{DATA:progname}: %{GREEDYDATA:message}
diff --git a/freemarker-generator-cli/src/main/scripts/run-samples.sh b/freemarker-generator-cli/src/main/scripts/run-samples.sh
new file mode 100755
index 0000000..cf192cc
--- /dev/null
+++ b/freemarker-generator-cli/src/main/scripts/run-samples.sh
@@ -0,0 +1,167 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Check that java is on the path
+
+hash java 2>/dev/null || { echo >&2 "I require JDK but it's not installed.  Aborting."; exit 1; }
+
+# Run all the samples being documented
+
+mkdir target 2>/dev/null
+mkdir target/out 2>/dev/null
+
+FREEMARKER_CMD=./bin/freemarker-cli
+
+#############################################################################
+# Info
+#############################################################################
+
+echo "templates/info.ftl"
+$FREEMARKER_CMD -t templates/info.ftl README.md > target/out/info.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# Demo
+#############################################################################
+
+echo "templates/demo.ftl"
+$FREEMARKER_CMD -t templates/demo.ftl README.md > target/out/demo.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# Interactive Mode
+#############################################################################
+
+$FREEMARKER_CMD -i '${JsonPathTool.parse(Documents.first).read("$.info.title")}' site/sample/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${XmlTool.parse(Documents.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${JsoupTool.parse(Documents.first).select("a")[0]}' site/sample/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# CSV
+#############################################################################
+
+echo "templates/csv/html/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/html/transform.ftl site/sample/csv/contract.csv > target/out/contract.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/csv/md/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/md/transform.ftl site/sample/csv/contract.csv > target/out/contract.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/csv/shell/curl.ftl"
+$FREEMARKER_CMD -t ./templates/csv/shell/curl.ftl site/sample/csv/user.csv > target/out/curl.sh || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/csv/md/filter.ftl"
+$FREEMARKER_CMD -e UTF-8 -l de_AT -Pcolumn="Order ID" -Pvalues=226939189,957081544 -Pformat=DEFAULT -Pdelimiter=COMMA -t templates/csv/md/filter.ftl site/sample/csv/sales-records.csv > target/out/sales-records.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# CSV To XML-FO & PDF
+#############################################################################
+
+echo "templates/csv/fo/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/fo/transform.ftl site/sample/csv/locker-test-users.csv > target/out/locker-test-users.fo || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash fop 2>/dev/null; then
+	echo "fop -fo target/out/locker-test-users.fo target/out/locker-test-users.pdf"
+    fop -fo target/out/locker-test-users.fo target/out/locker-test-users.pdf 2>/dev/null || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+echo "templates/csv/fo/transactions.ftl"
+$FREEMARKER_CMD -t templates/csv/fo/transactions.ftl site/sample/csv/transactions.csv > target/out/transactions.fo || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash fop 2>/dev/null; then
+	echo "fop -fo target/out/transactions.fo target/out/transactions-fo.pdf"
+    fop -fo target/out/transactions.fo target/out/transactions-fo.pdf 2>/dev/null || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+#############################################################################
+# CSV to HTML & PDF
+#############################################################################
+
+echo "templates/csv/html/transform.ftl"
+$FREEMARKER_CMD -t templates/csv/html/transactions.ftl site/sample/csv/transactions.csv > target/out/transactions.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash wkhtmltopdf 2>/dev/null; then
+	echo "wkhtmltopdf -O landscape target/out/transactions.html target/out/transactions-html.pdf"
+    wkhtmltopdf -O landscape target/out/transactions.html target/out/transactions-html.pdf 2>/dev/null || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+#############################################################################
+# Grok
+#############################################################################
+
+echo "templates/accesslog/combined-access.ftl"
+$FREEMARKER_CMD -t templates/accesslog/combined-access.ftl site/sample/accesslog/combined-access.log > target/out/combined-access.log.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# Excel
+#############################################################################
+
+echo "templates/excel/html/transform.ftl"
+$FREEMARKER_CMD -t templates/excel/html/transform.ftl site/sample/excel/test.xls > target/out/test.xls.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -t templates/excel/html/transform.ftl site/sample/excel/test.xlsx > target/out/test.xslx.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -t templates/excel/html/transform.ftl site/sample/excel/test-multiple-sheets.xlsx > target/out/test-multiple-sheets.xlsx.html || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/excel/md/transform.ftl"
+$FREEMARKER_CMD -t templates/excel/md/transform.ftl site/sample/excel/test-multiple-sheets.xlsx > target/out/test-multiple-sheets.xlsx.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/excel/csv/transform.ftl"
+$FREEMARKER_CMD -t templates/excel/csv/transform.ftl site/sample/excel/test-multiple-sheets.xlsx > target/out/test-multiple-sheets.xlsx.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "templates/excel/csv/custom.ftl"
+$FREEMARKER_CMD -t templates/excel/csv/custom.ftl -Pcsv.format=MYSQL site/sample/excel/test.xls > target/out/test-transform-xls.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# HTML
+#############################################################################
+
+echo "templates/html/csv/dependencies.ftl"
+$FREEMARKER_CMD -t templates/html/csv/dependencies.ftl site/sample/html/dependencies.html > target/out/dependencies.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# JSON
+#############################################################################
+
+echo "templates/json/csv/swagger-endpoints.ftl"
+$FREEMARKER_CMD -t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json > target/out/swagger-spec.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+if hash curl 2>/dev/null; then
+echo "templates/json/md/github-users.ftl"
+$FREEMARKER_CMD -t templates/json/md/github-users.ftl site/sample/json/github-users.json > target/out/github-users-curl.md || { echo >&2 "Test failed.  Aborting."; exit 1; }
+fi
+
+#############################################################################
+# Properties
+#############################################################################
+
+echo "templates/properties/csv/locker-test-users.ftl"
+$FREEMARKER_CMD -t templates/properties/csv/locker-test-users.ftl site/sample/properties > target/out/locker-test-users.csv || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# YAML
+#############################################################################
+
+echo "templates/yaml/txt/transform.ftl"
+$FREEMARKER_CMD -t ./templates/yaml/txt/transform.ftl ./site/sample/yaml/customer.yaml > target/out/customer.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+#############################################################################
+# XML
+#############################################################################
+
+echo "templates/xml/txt/recipients.ftl"
+$FREEMARKER_CMD -t ./templates/xml/txt/recipients.ftl site/sample/xml/recipients.xml > target/out/recipients.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+
+echo "Created the following sample files in ./target/out"
+ls -l ./target/out
diff --git a/freemarker-generator-cli/src/test/data/encoding/utf16.txt b/freemarker-generator-cli/src/test/data/encoding/utf16.txt
new file mode 100755
index 0000000..4d8e1f2
--- /dev/null
+++ b/freemarker-generator-cli/src/test/data/encoding/utf16.txt
Binary files differ
diff --git a/freemarker-generator-cli/src/test/data/encoding/utf8.txt b/freemarker-generator-cli/src/test/data/encoding/utf8.txt
new file mode 100755
index 0000000..c43eb00
--- /dev/null
+++ b/freemarker-generator-cli/src/test/data/encoding/utf8.txt
@@ -0,0 +1,4 @@
+première is first
+première is slightly different
+Кириллица is Cyrillic
+𐐀 am Deseret
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/AbstractMainTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/AbstractMainTest.java
new file mode 100644
index 0000000..2d3e101
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/AbstractMainTest.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Arrays;
+
+abstract class AbstractMainTest {
+
+    private static final String SPACE = " ";
+
+    String execute(String commandLine) throws IOException {
+        try (Writer writer = new StringWriter()) {
+            final String[] args = commandLine.split(SPACE);
+            if (Main.execute(args, writer) == 0) {
+                return writer.toString();
+            } else {
+                throw new RuntimeException("Executing freemarker-cli failed: " + Arrays.toString(args));
+            }
+        }
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
new file mode 100644
index 0000000..6e152dd
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class ExamplesTest extends AbstractMainTest {
+
+    private static final int MIN_OUTPUT_SIZE = 1;
+
+    @Test
+    public void shouldRunInfo() throws IOException {
+        assertValid(execute("-t templates/info.ftl README.md"));
+    }
+
+    @Test
+    public void shouldRunMultipleTimes() throws IOException {
+        assertValid(execute("--times=2 -t templates/info.ftl README.md"));
+    }
+
+    @Test
+    public void shouldRunDemoExamples() throws IOException {
+        assertValid(execute("-t templates/demo.ftl README.md"));
+    }
+
+    @Test
+    public void shouldRunCsvExamples() throws IOException {
+        assertValid(execute("-t templates/csv/html/transform.ftl site/sample/csv/contract.csv"));
+        assertValid(execute("-t templates/csv/md/transform.ftl site/sample/csv/contract.csv"));
+        assertValid(execute("-t templates/csv/shell/curl.ftl site/sample/csv/user.csv"));
+        assertValid(execute("-t templates/csv/fo/transform.ftl site/sample/csv/locker-test-users.csv"));
+        assertValid(execute("-t templates/csv/fo/transactions.ftl site/sample/csv/transactions.csv"));
+        assertValid(execute("-t templates/csv/html/transactions.ftl site/sample/csv/transactions.csv"));
+        assertValid(execute("-t templates/csv/transform.ftl site/sample/csv/contract.csv"));
+    }
+
+    @Test
+    public void shouldRunExcelExamples() throws IOException {
+        assertValid(execute("-t templates/excel/html/transform.ftl site/sample/excel/test.xls"));
+        assertValid(execute("-t templates/excel/html/transform.ftl site/sample/excel/test.xlsx"));
+        assertValid(execute("-t templates/excel/html/transform.ftl site/sample/excel/test-multiple-sheets.xlsx"));
+        assertValid(execute("-t templates/excel/md/transform.ftl site/sample/excel/test-multiple-sheets.xlsx"));
+        assertValid(execute("-t templates/excel/csv/transform.ftl site/sample/excel/test-multiple-sheets.xlsx"));
+        assertValid(execute("-t templates/excel/csv/custom.ftl -Pcsv.format=MYSQL site/sample/excel/test.xls"));
+    }
+
+    @Test
+    public void shouldRunHtmlExamples() throws IOException {
+        assertValid(execute("-t templates/html/csv/dependencies.ftl site/sample/html/dependencies.html"));
+    }
+
+    @Test
+    public void shouldRunJsonExamples() throws IOException {
+        assertValid(execute("-t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json"));
+        assertValid(execute("-t templates/json/md/github-users.ftl site/sample/json/github-users.json"));
+    }
+
+    @Test
+    public void shouldRunPropertiesExamples() throws IOException {
+        assertValid(execute("-t templates/properties/csv/locker-test-users.ftl site/sample/properties"));
+    }
+
+    @Test
+    public void shouldRunYamlExamples() throws IOException {
+        assertValid(execute("-t templates/yaml/txt/transform.ftl site/sample/yaml/customer.yaml"));
+    }
+
+    @Test
+    public void shouldRunXmlExamples() throws IOException {
+        assertValid(execute("-t templates/xml/txt/recipients.ftl site/sample/xml/recipients.xml"));
+    }
+
+    @Test
+    public void shouldRunGrokExamples() throws IOException {
+        assertValid(execute("-t templates/accesslog/combined-access.ftl site/sample/accesslog/combined-access.log"));
+    }
+
+    @Test
+    public void shouldRunWithExposedEnvironmentVariableExamples() throws IOException {
+        assertValid(execute("-b ./src/test -E -t templates/environment.ftl"));
+    }
+
+    @Test
+    public void shouldRunInteractiveTemplateExamples() throws IOException {
+        assertValid(execute("-i ${JsonPathTool.parse(Documents.first).read(\"$.info.title\")} site/sample/json/swagger-spec.json"));
+        assertValid(execute("-i ${XmlTool.parse(Documents.first)[\"recipients/person[1]/name\"]} site/sample/xml/recipients.xml"));
+        assertValid(execute("-i ${JsoupTool.parse(Documents.first).select(\"a\")[0]} site/sample/html/dependencies.html"));
+    }
+
+    @Test
+    @Ignore("Manual test to check memory consumption and resource handling")
+    public void shouldCloseAllResources() throws IOException {
+        for (int i = 0; i < 5000; i++) {
+            shouldRunInfo();
+            shouldRunDemoExamples();
+            shouldRunCsvExamples();
+            shouldRunExcelExamples();
+            shouldRunHtmlExamples();
+            shouldRunJsonExamples();
+            shouldRunPropertiesExamples();
+            shouldRunYamlExamples();
+            shouldRunXmlExamples();
+            shouldRunGrokExamples();
+            shouldRunInteractiveTemplateExamples();
+            shouldRunWithExposedEnvironmentVariableExamples();
+        }
+    }
+
+    private static void assertValid(String output) {
+        assertTrue(output.length() > MIN_OUTPUT_SIZE);
+        assertFalse(output.contains("Exception"));
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
new file mode 100644
index 0000000..81f47eb
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import java.util.Arrays;
+
+/**
+ * Invoke freemarker-cli and dump the output for ad-hoc manual testing.
+ */
+public class ManualTest {
+
+    private static final String SPACE = " ";
+    // private static final String CMD = "-b ./src/test -t templates/csv/html/transactions.ftl site/sample/csv/transactions.csv";
+    // private static final String CMD = "-b ./src/test -l de_AT -DFOO=foo -DBAR=bar -t templates/info.ftl site/sample/csv/transactions.csv";
+    // private static final String CMD = "-b ./src/test -DFOO=foo -PBAR=bar -l de -t templates/demo.ftl site/sample/csv/transactions.csv";
+    // private static final String CMD = "-b ./src/test -DFOO=foo -PBAR=bar -t templates/demo.ftl site/sample/csv/transactions.csv";
+    // private static final String CMD = "-b ./src/test -Dcsv.out.format=TDF -t templates/csv/transform.ftl site/sample/csv/contract.csv";
+    // private static final String CMD = "-t templates/excel/csv/transform.ftl -l de_AT site/sample/excel/test.xlsx";
+    // private static final String CMD = "-i ${JsonPathTool.parse(Documents.first).read('$.info.title')} site/sample/json/swagger-spec.json";
+    // private static final String CMD = "-i ${XmlTool.parse(Documents.first)['recipients/person[1]/name']} site/sample/xml/recipients.xml";
+    // private static final String CMD = "-i ${JsoupTool.parse(Documents.first).select('a')[0]} site/sample/html/dependencies.html";
+    // private static final String CMD = "-b ./src/test -t templates/properties/csv/locker-test-users.ftl site/sample/properties";
+    // private static final String CMD = "-b ./src/test -e UTF-8 -l de_AT -Dcolumn=Order%20ID -Dvalues=226939189,957081544 -Dformat=DEFAULT -Ddelimiter=COMMA -t templates/csv/md/filter.ftl site/sample/csv/sales-records.csv";
+    private static final String CMD = "-E -b ./src/test -t templates/environment.ftl";
+
+    public static void main(String[] args) {
+        Main.execute(toArgs(CMD));
+    }
+
+    private static String[] toArgs(String line) {
+        // map a "%20" to space to protect system property values containing a space
+        return Arrays.stream(line.split(SPACE)).map(s -> s.replace("%20", " ")).toArray(String[]::new);
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/SecurityRelatedTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/SecurityRelatedTest.java
new file mode 100644
index 0000000..e3c5d9d
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/SecurityRelatedTest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.IOException;
+
+@Ignore("Manual security testing")
+public class SecurityRelatedTest extends AbstractMainTest {
+
+    @Test(expected = RuntimeException.class)
+    public void shouldDisallowFreeMarkerNewBuiltIn() throws IOException {
+        execute("-b ./src/test -t templates/security/new.ftl");
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void shouldDisallowFreeMarkerApiBuiltIn() throws IOException {
+        execute("-b ./src/test -t templates/security/api.ftl");
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/SourceEncodingTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/SourceEncodingTest.java
new file mode 100644
index 0000000..8f6e762
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/SourceEncodingTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertTrue;
+
+public class SourceEncodingTest extends AbstractMainTest {
+
+    private static final String CYRILLIC_TERM = "\u041A\u0438\u0440\u0438\u043B\u043B\u0438\u0446\u0430";
+
+    @Test
+    public void shouldLoadUtf8Text() throws IOException {
+        final String output = execute("-b ./src/test -e UTF-8 -t templates/echo.ftl ./src/test/data/encoding/utf8.txt");
+        assertTrue("Unable to find expected cyrillic term", output.contains(CYRILLIC_TERM));
+    }
+
+    @Test
+    public void shouldLoadUtf16Text() throws IOException {
+        final String output = execute("-b ./src/test -e UTF-16 -t templates/echo.ftl ./src/test/data/encoding/utf16.txt");
+        assertTrue("Unable to find expected cyrillic term", output.contains(CYRILLIC_TERM));
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/TemplateLoadingTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/TemplateLoadingTest.java
new file mode 100644
index 0000000..723f4a8
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/TemplateLoadingTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import org.apache.commons.io.output.NullWriter;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class TemplateLoadingTest extends AbstractMainTest {
+
+    private static final int SUCCESS = 0;
+    private static final String ANY_TEMPLATE_NAME = "templates/info.ftl";
+    private static final String CURR_DIR = System.getProperty("user.dir", ".");
+
+    @Test
+    public void shouldLoadRelativeTemplate() {
+        final String[] args = new String[] { "-t", ANY_TEMPLATE_NAME };
+
+        assertEquals(SUCCESS, Main.execute(args, new NullWriter()));
+    }
+
+    @Test
+    public void shouldLoadAbsoluteTemplate() {
+        final String absoluteFileName = new File(CURR_DIR, ANY_TEMPLATE_NAME).getAbsolutePath();
+        final String[] args = new String[] { "-t", absoluteFileName };
+
+        assertEquals(SUCCESS, Main.execute(args, new NullWriter()));
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/UserSuppliedLocaleTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/UserSuppliedLocaleTest.java
new file mode 100644
index 0000000..2a3e76c
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/UserSuppliedLocaleTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli;
+
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertTrue;
+
+public class UserSuppliedLocaleTest extends AbstractMainTest {
+
+    @Test
+    public void shouldUserGermanLocalForRenderingTemplate() throws IOException {
+        final String output = execute("-b ./src/test -l de -t templates/locale.ftl README.md");
+
+        assertTrue(output.contains("3,142"));
+        assertTrue(output.contains("99.999,99"));
+    }
+
+    @Test
+    public void shouldUserEnglishLocalForRenderingTemplate() throws IOException {
+        final String output = execute("-b ./src/test -l en -t templates/locale.ftl README.md");
+
+        assertTrue(output.contains("3.142"));
+        assertTrue(output.contains("99,999.99"));
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java
new file mode 100644
index 0000000..ad24631
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import freemarker.template.Configuration;
+import org.apache.freemarker.generator.cli.config.Settings.SettingsBuilder;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.StringWriter;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class ConfigurationSupplierTest {
+
+    private static final String ANY_TEMPLATE_NAME = "templateName";
+
+    @Test
+    public void shouldProvideDefaultConfiguration() {
+        final ConfigurationSupplier configurationSupplier = configurationSupplier(settingsBuilder().build());
+
+        final Configuration configuration = configurationSupplier.get();
+
+        assertTrue(configuration.isDefaultEncodingExplicitlySet());
+        assertTrue(configuration.isLocaleExplicitlySet());
+        assertTrue(configuration.isTemplateLoaderExplicitlySet());
+        assertTrue(configuration.isOutputEncodingSet());
+
+        assertFalse(configuration.isCacheStorageExplicitlySet());
+        assertFalse(configuration.isObjectWrapperExplicitlySet());
+        assertFalse(configuration.isOutputFormatExplicitlySet());
+        assertFalse(configuration.isTemplateExceptionHandlerExplicitlySet());
+        assertFalse(configuration.isTimeZoneExplicitlySet());
+        assertFalse(configuration.isWrapUncheckedExceptionsExplicitlySet());
+    }
+
+    private ConfigurationSupplier configurationSupplier(Settings settings) {
+        return new ConfigurationSupplier(settings, templateLoaderSupplier());
+    }
+
+    private TemplateLoaderSupplier templateLoaderSupplier() {
+        return new TemplateLoaderSupplier(singletonList(new File(".")));
+    }
+
+    private SettingsBuilder settingsBuilder() {
+        return Settings.builder().setTemplateName(ANY_TEMPLATE_NAME).setWriter(new StringWriter());
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
new file mode 100644
index 0000000..4821723
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import org.apache.freemarker.generator.cli.config.Settings.SettingsBuilder;
+import org.junit.Test;
+
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class SettingsTest {
+
+    private static final String[] ANY_ARGS = singletonList("arg1 arg2").toArray(new String[0]);
+    private static final Properties ANY_CONFIGURATION = new Properties();
+    private static final String ANY_INCLUDE = "*.csv";
+    private static final String ANY_INPUT_ENCODING = "US-ASCII";
+    private static final String ANY_INTERACTIVE_TEMPLATE = "interactiveTemplate";
+    private static final String ANY_LOCALE = "th-TH";
+    private static final String ANY_OUTPUT_ENCODING = "UTF-16";
+    private static final String ANY_OUTPUT_FILE = "outputFile";
+    private static final List<String> ANY_SOURCES = singletonList("sources");
+    private static final String ANY_TEMPLATE_NAME = "templateName";
+    private static final Map<String, String> ANY_USER_PARAMETERS = new HashMap<>();
+    private static final Properties ANY_SYSTEM_PROPERTIES = new Properties();
+
+    @Test
+    public void shouldProvideAllExpectedSettings() {
+        final Settings settings = allSettingsBuilder().build();
+
+        assertEquals(1, settings.getArgs().size());
+        assertNotNull(settings.getConfiguration());
+        assertEquals(ANY_INCLUDE, settings.getInclude());
+        assertEquals(ANY_INPUT_ENCODING, settings.getInputEncoding().name());
+        assertEquals(ANY_OUTPUT_ENCODING, settings.getOutputEncoding().name());
+        assertEquals(ANY_OUTPUT_FILE, settings.getOutputFile().getName());
+        assertEquals(ANY_TEMPLATE_NAME, settings.getTemplateName());
+        assertNotNull(settings.getSources());
+        assertNotNull(settings.getParameters());
+        assertNotNull(settings.getSytemProperties());
+        assertTrue(settings.isReadFromStdin());
+        assertTrue(settings.isEnvironmentExposed());
+        assertTrue(settings.isInteractiveTemplate());
+        assertTrue(settings.isVerbose());
+    }
+
+    private SettingsBuilder allSettingsBuilder() {
+        return Settings.builder()
+                .isEnvironmentExposed(true)
+                .isReadFromStdin(true)
+                .setArgs(ANY_ARGS)
+                .setConfiguration(ANY_CONFIGURATION)
+                .setInclude(ANY_INCLUDE)
+                .setInputEncoding(ANY_INPUT_ENCODING)
+                .setInteractiveTemplate(ANY_INTERACTIVE_TEMPLATE)
+                .setLocale(ANY_LOCALE)
+                .setOutputEncoding(ANY_OUTPUT_ENCODING)
+                .setOutputFile(ANY_OUTPUT_FILE)
+                .setParameters(ANY_USER_PARAMETERS)
+                .setSources(ANY_SOURCES)
+                .setSystemProperties(ANY_SYSTEM_PROPERTIES)
+                .setTemplateName(ANY_TEMPLATE_NAME)
+                .setWriter(new StringWriter())
+                .setVerbose(true);
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplierTest.java
new file mode 100644
index 0000000..79c9ea4
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplierTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class TemplateDirectorySupplierTest {
+
+    // Depending on the local configuration the "~/.freemarker-cli" directory might be found.
+    private final int nrOfDefaultTemplateDirectories = templateDirectories(null).size();
+
+    @Test
+    public void shouldRemoveDuplicateTemplateDirectorie() throws IOException {
+        final List<File> directories = templateDirectories(".");
+
+        assertEquals(nrOfDefaultTemplateDirectories, directories.size());
+    }
+
+    @Test
+    public void shouldAddTemplateDirectory() throws IOException {
+        assertEquals(nrOfDefaultTemplateDirectories + 1, templateDirectories("templates").size());
+        assertEquals(nrOfDefaultTemplateDirectories + 1, templateDirectories("./templates").size());
+    }
+
+    @Test
+    public void shouldSkippedNonExistingTemplateDirectorie() throws IOException {
+        final List<File> directories = templateDirectories("does-not-exist");
+
+        assertEquals(nrOfDefaultTemplateDirectories, directories.size());
+    }
+
+    private List<File> templateDirectories(String directory) {
+        return new TemplateDirectorySupplier(directory).get();
+    }
+}
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/TemplateLoaderSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/TemplateLoaderSupplierTest.java
new file mode 100644
index 0000000..8c77f74
--- /dev/null
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/TemplateLoaderSupplierTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.cli.config;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+import static java.util.Collections.emptyList;
+import static org.junit.Assert.assertNotNull;
+
+public class TemplateLoaderSupplierTest {
+
+    @Test
+    public void shouldHandleEmptyDirectoryList() {
+        assertNotNull(templateLoaderSupplier(emptyList()));
+    }
+
+    private TemplateLoaderSupplier templateLoaderSupplier(List<File> templateDirectories) {
+        return new TemplateLoaderSupplier(templateDirectories);
+    }
+}
diff --git a/freemarker-generator-cli/src/test/templates/echo.ftl b/freemarker-generator-cli/src/test/templates/echo.ftl
new file mode 100644
index 0000000..3499bb0
--- /dev/null
+++ b/freemarker-generator-cli/src/test/templates/echo.ftl
@@ -0,0 +1,22 @@
+<#ftl output_format="plainText" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#list Documents.list as document>
+${document.name}, ${document.location}
+=============================================================================
+${document.text}
+</#list>
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/test/templates/environment.ftl b/freemarker-generator-cli/src/test/templates/environment.ftl
new file mode 100644
index 0000000..96d10b1
--- /dev/null
+++ b/freemarker-generator-cli/src/test/templates/environment.ftl
@@ -0,0 +1,23 @@
+<#ftl output_format="plainText" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+Environment variables are directly exposed when using the "-E" option
+
+HOME: ${HOME!""}
+USER: ${USER!""}
+PWD: ${PWD!""}
+PATH: ${PATH!""}
diff --git a/freemarker-generator-cli/src/test/templates/locale.ftl b/freemarker-generator-cli/src/test/templates/locale.ftl
new file mode 100644
index 0000000..d33edf4
--- /dev/null
+++ b/freemarker-generator-cli/src/test/templates/locale.ftl
@@ -0,0 +1,26 @@
+<#ftl output_format="plainText" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+Manual Test
+---------------------------------------------------------------------------
+<#assign smallNumber = 3.1415927>
+<#assign largeNumber = 99999.99>
+
+Small Number :  ${smallNumber}
+Large Number :  ${largeNumber}
+Date         :  ${.now?date}
+Time         :  ${.now?time}
diff --git a/freemarker-generator-cli/src/test/templates/manual.ftl b/freemarker-generator-cli/src/test/templates/manual.ftl
new file mode 100644
index 0000000..d33edf4
--- /dev/null
+++ b/freemarker-generator-cli/src/test/templates/manual.ftl
@@ -0,0 +1,26 @@
+<#ftl output_format="plainText" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+Manual Test
+---------------------------------------------------------------------------
+<#assign smallNumber = 3.1415927>
+<#assign largeNumber = 99999.99>
+
+Small Number :  ${smallNumber}
+Large Number :  ${largeNumber}
+Date         :  ${.now?date}
+Time         :  ${.now?time}
diff --git a/freemarker-generator-cli/src/test/templates/security/api.ftl b/freemarker-generator-cli/src/test/templates/security/api.ftl
new file mode 100644
index 0000000..5208784
--- /dev/null
+++ b/freemarker-generator-cli/src/test/templates/security/api.ftl
@@ -0,0 +1,17 @@
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign uri=SystemTool?api.class.getResource("/").toURI()>
diff --git a/freemarker-generator-cli/src/test/templates/security/new.ftl b/freemarker-generator-cli/src/test/templates/security/new.ftl
new file mode 100644
index 0000000..b7ddf2a
--- /dev/null
+++ b/freemarker-generator-cli/src/test/templates/security/new.ftl
@@ -0,0 +1,17 @@
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("date") }
diff --git a/freemarker-generator-cli/src/test/templates/tools/csv.ftl b/freemarker-generator-cli/src/test/templates/tools/csv.ftl
new file mode 100644
index 0000000..93b53f8
--- /dev/null
+++ b/freemarker-generator-cli/src/test/templates/tools/csv.ftl
@@ -0,0 +1,46 @@
+<#ftl output_format="plainText">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign records = CSVTool.parse(Documents.get(0), CSVFormat.DEFAULT.withHeader()).records>
+
+CSVTool.toMap(name)
+=============================================================================
+<#assign map = CSVTool.toMap(records, "contract_id")>
+<#list map as key, record>
+${key} ==> ${record.get("customer_company_name")}
+</#list>
+
+CSVTool.toMap(index)
+=============================================================================
+<#assign map = CSVTool.toMap(records, 0)>
+<#list map as key, record>
+${key} ==> ${record.get("customer_company_name")}
+</#list>
+
+CSVTool.toMultiMap(name)
+=============================================================================
+<#assign map = CSVTool.toMultiMap(records, "contract_id")>
+<#list map as key, records>
+${key} ==> Found ${records?size} records
+</#list>
+
+CSVTool.toMultiMap(index)
+=============================================================================
+<#assign map = CSVTool.toMultiMap(records, 0)>
+<#list map as key, records>
+${key} ==> Found ${records?size} records
+</#list>
diff --git a/freemarker-generator-cli/templates/accesslog/combined-access.ftl b/freemarker-generator-cli/templates/accesslog/combined-access.ftl
new file mode 100644
index 0000000..fbcb71e
--- /dev/null
+++ b/freemarker-generator-cli/templates/accesslog/combined-access.ftl
@@ -0,0 +1,32 @@
+<#ftl output_format="plainText" strip_whitespace=true>
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")>
+<#assign document = Documents.get(0)>
+<#assign lines = document.getLineIterator()>
+
+<#compress>
+    TIMESTAMP;VERB;REQUEST;HTTPVERSION
+    <#list lines as line>
+        <#assign parts = grok.match(line)>
+        <#assign timestamp = parts["timestamp"]>
+        <#assign verb = parts["verb"]>
+        <#assign request = parts["request"]>
+        <#assign httpversion = parts["httpversion"]>
+        ${timestamp};${verb};${request};${httpversion}
+    </#list>
+</#compress>
\ No newline at end of file
diff --git a/freemarker-generator-cli/templates/cat.ftl b/freemarker-generator-cli/templates/cat.ftl
new file mode 100644
index 0000000..77fd4c2
--- /dev/null
+++ b/freemarker-generator-cli/templates/cat.ftl
@@ -0,0 +1,23 @@
+<#ftl output_format="plainText" strip_whitespace=true>
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign lines = Documents.get(0).getLineIterator()>
+<#compress>
+    <#list lines as line>
+        ${line}
+    </#list>
+</#compress>
\ No newline at end of file
diff --git a/freemarker-generator-cli/templates/csv/csv/gatling-user-credentials.ftl b/freemarker-generator-cli/templates/csv/csv/gatling-user-credentials.ftl
new file mode 100644
index 0000000..3cfe9e8
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/csv/gatling-user-credentials.ftl
@@ -0,0 +1,30 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter(';')>
+<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvRecords = csvParser.records>
+
+<#compress>
+disposer,user,password,token,device,name,description
+<#list csvRecords as record>
+    <#assign user = record.get(0)>
+    <#assign token = record.get(1)>
+    ${user},${user},,${token},,${user},performance test user ${user}
+</#list>
+</#compress>
diff --git a/freemarker-generator-cli/templates/csv/fo/transactions.ftl b/freemarker-generator-cli/templates/csv/fo/transactions.ftl
new file mode 100644
index 0000000..4715484
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/fo/transactions.ftl
@@ -0,0 +1,97 @@
+<#ftl output_format="XML" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign name = document.name>
+<#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()>
+<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderMap()?keys>
+<#assign csvRecords = csvParser.records>
+<#--------------------------------------------------------------------------->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+    <fo:layout-master-set>
+        <fo:simple-page-master master-name="first"
+                               page-height="21cm"
+                               page-width="29.7cm"
+                               margin-top="1cm"
+                               margin-bottom="1cm"
+                               margin-left="1cm"
+                               margin-right="1cm">
+            <fo:region-body margin-top="1cm"/>
+            <fo:region-before extent="1cm"/>
+            <fo:region-after extent="-1.2cm"/>
+        </fo:simple-page-master>
+    </fo:layout-master-set>
+    <fo:page-sequence master-reference="first">
+        <fo:static-content flow-name="xsl-region-before">
+            <fo:block line-height="10pt" font-size="8pt" text-align="left">Transaction Export - ${.now}</fo:block>
+        </fo:static-content>
+        <fo:static-content flow-name="xsl-region-after">
+            <fo:block line-height="6pt" font-size="6pt" text-align="end">Page <fo:page-number/></fo:block>
+        </fo:static-content>
+        <fo:flow flow-name="xsl-region-body">
+            <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+                <fo:table-column column-width="9%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="7%"/>
+                <@writeTableHeader headers=csvHeaders/>
+                <@writeTableBody columns=csvRecords/>
+            </fo:table>
+        </fo:flow>
+    </fo:page-sequence>
+</fo:root>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableHeader headers>
+    <fo:table-header>
+        <fo:table-row>
+            <#list headers as header>
+                <fo:table-cell border-style="solid" border-width="0.1pt" padding-left="1.0px" padding-right="1.0px">
+                    <fo:block font-size="6pt" font-weight="bold">${header}</fo:block>
+                </fo:table-cell>
+            </#list>
+        </fo:table-row>
+    </fo:table-header>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableBody columns>
+    <fo:table-body>
+        <#list columns as column>
+            <fo:table-row>
+                <#list column.iterator() as field>
+                    <fo:table-cell border-style="solid" border-width="0.1pt" padding-left="1.0px" padding-right="1.0px">
+                        <fo:block font-size="6pt">${field}</fo:block>
+                    </fo:table-cell>
+                </#list>
+            </fo:table-row>
+        </#list>
+    </fo:table-body>
+</#macro>
diff --git a/freemarker-generator-cli/templates/csv/fo/transform.ftl b/freemarker-generator-cli/templates/csv/fo/transform.ftl
new file mode 100644
index 0000000..38594cd
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/fo/transform.ftl
@@ -0,0 +1,76 @@
+<#ftl output_format="XML" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign csvFormatName = SystemTool.parameters["csv.format"]!"DEFAULT">
+<#assign cvsFormat = CSVTool.formats[csvFormatName].withHeader()>
+<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderMap()?keys>
+<#assign csvRecords = csvParser.records>
+<#--------------------------------------------------------------------------->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+    <fo:layout-master-set>
+        <fo:simple-page-master master-name="first"
+                               page-height="21cm"
+                               page-width="29.7cm"
+                               margin-top="1cm"
+                               margin-bottom="1cm"
+                               margin-left="1cm"
+                               margin-right="1cm">
+            <fo:region-body margin-top="1cm"/>
+            <fo:region-before extent="1cm"/>
+            <fo:region-after extent="1cm"/>
+        </fo:simple-page-master>
+    </fo:layout-master-set>
+    <fo:page-sequence master-reference="first">
+        <fo:flow flow-name="xsl-region-body">
+            <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+                <@writeTableHeader headers=csvHeaders/>
+                <@writeTableBody columns=csvRecords/>
+            </fo:table>
+        </fo:flow>
+    </fo:page-sequence>
+</fo:root>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableHeader headers>
+    <fo:table-header>
+        <fo:table-row>
+            <#list headers as header>
+                <fo:table-cell>
+                    <fo:block font-weight="bold">${header}</fo:block>
+                </fo:table-cell>
+            </#list>
+        </fo:table-row>
+    </fo:table-header>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableBody columns>
+    <fo:table-body>
+        <#list columns as column>
+            <fo:table-row>
+                <#list column.iterator() as field>
+                    <fo:table-cell>
+                        <fo:block>${field}</fo:block>
+                    </fo:table-cell>
+                </#list>
+            </fo:table-row>
+        </#list>
+    </fo:table-body>
+</#macro>
diff --git a/freemarker-generator-cli/templates/csv/html/transactions.ftl b/freemarker-generator-cli/templates/csv/html/transactions.ftl
new file mode 100644
index 0000000..b31d6c0
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/html/transactions.ftl
@@ -0,0 +1,58 @@
+<#ftl output_format="HTML" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign name = document.name>
+<#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter('\t').withHeader()>
+<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderMap()?keys>
+<#assign csvRecords = csvParser.records>
+<#--------------------------------------------------------------------------->
+
+<!DOCTYPE html>
+<html>
+<head>
+    <title>${name}</title>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
+</head>
+<body>
+<table class="table table-striped">
+    <@writeHeaders headers=csvHeaders/>
+    <@writeColums columns=csvRecords/>
+</table>
+</body>
+</html>
+<#--------------------------------------------------------------------------->
+<#macro writeHeaders headers>
+    <tr>
+        <#list headers as header>
+            <th>${header}</th>
+        </#list>
+    </tr>
+</#macro>
+<#--------------------------------------------------------------------------->
+<#macro writeColums columns>
+    <#list columns as column>
+        <tr>
+            <#list column.iterator() as field>
+                <td>${field}</td>
+            </#list>
+        </tr>
+    </#list>
+</#macro>
diff --git a/freemarker-generator-cli/templates/csv/html/transform.ftl b/freemarker-generator-cli/templates/csv/html/transform.ftl
new file mode 100644
index 0000000..54a805e
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/html/transform.ftl
@@ -0,0 +1,56 @@
+<#ftl output_format="HTML" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign name = document.name>
+<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
+<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderNames()>
+<#--------------------------------------------------------------------------->
+<!DOCTYPE html>
+<html>
+<head>
+    <title>${name}</title>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
+</head>
+<body>
+<table class="table table-striped">
+    <@writeHeaders csvParser.getHeaderNames()/>
+    <#list csvParser.iterator() as record>
+        <@writeColumns record/>
+    </#list>
+</table>
+</body>
+</html>
+<#--------------------------------------------------------------------------->
+<#macro writeHeaders headers>
+    <tr>
+        <#list headers as header>
+            <th>${header}</th>
+        </#list>
+    </tr>
+</#macro>
+<#--------------------------------------------------------------------------->
+<#macro writeColumns record>
+    <tr>
+        <#list record.iterator() as field>
+            <th>${field}</th>
+        </#list>
+    </tr>
+</#macro>
\ No newline at end of file
diff --git a/freemarker-generator-cli/templates/csv/md/filter.ftl b/freemarker-generator-cli/templates/csv/md/filter.ftl
new file mode 100644
index 0000000..3967e0c
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/md/filter.ftl
@@ -0,0 +1,55 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign parser = parser(document)>
+<#assign headers = parser.getHeaderNames()>
+<#assign column = SystemTool.getParameter("column")>
+<#assign values = SystemTool.getParameter("values")?split(",")>
+
+<#compress>
+    <@writePageHeader document/>
+    <#-- Process each line without materializing the whole file in memory -->
+    <#list parser.iterator() as record>
+        <#if filter(record)>
+            <@writeCsvRecord headers record/>
+        </#if>
+    </#list>
+</#compress>
+
+<#function parser document>
+    <#assign format = CSVTool.formats[SystemTool.getParameter("format", "DEFAULT")]>
+    <#assign delimiter = CSVTool.toDelimiter(SystemTool.getParameter("delimiter", format.getDelimiter()))>
+    <#return CSVTool.parse(document, format.withFirstRecordAsHeader().withDelimiter(delimiter))>
+</#function>
+
+<#function filter record>
+    <#return values?seq_contains(record.get(column))>
+</#function>
+
+<#macro writePageHeader document>
+    # ${document.name}
+</#macro>
+
+<#macro writeCsvRecord headers record>
+    ## Line ${record.getRecordNumber()}
+    | Column    | Value                       |
+    | --------- | --------------------------- |
+    <#list headers as header>
+    | ${header} | ${record.get(header)}       |
+    </#list>
+</#macro>
diff --git a/freemarker-generator-cli/templates/csv/md/transform.ftl b/freemarker-generator-cli/templates/csv/md/transform.ftl
new file mode 100644
index 0000000..efcf276
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/md/transform.ftl
@@ -0,0 +1,37 @@
+<#ftl output_format="plainText">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
+<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderMap()?keys>
+<#assign csvRecords = csvParser.records>
+<#--------------------------------------------------------------------------->
+<#compress>
+<@writeHeaders headers=csvHeaders/>
+<@writeColums columns=csvRecords/>
+</#compress>
+<#--------------------------------------------------------------------------->
+<#macro writeHeaders headers>
+| ${csvHeaders?join(" | ", "")} |
+    <#list csvHeaders as csvHeader>| --------</#list>|
+</#macro>
+<#--------------------------------------------------------------------------->
+<#macro writeColums columns>
+    <#list columns as column>
+    | ${column.iterator()?join(" | ", "")} |
+    </#list>
+</#macro>
diff --git a/freemarker-generator-cli/templates/csv/shell/curl.ftl b/freemarker-generator-cli/templates/csv/shell/curl.ftl
new file mode 100644
index 0000000..8df601f
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/shell/curl.ftl
@@ -0,0 +1,32 @@
+<#ftl output_format="plainText">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
+<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign records = csvParser.records>
+<#assign csvMap = CSVTool.toMap(records, "disposer")>
+<#--------------------------------------------------------------------------->
+#!/bin/sh
+
+<#noparse>
+MY_BASE_URL=${MY_BASE_URL:=https://postman-echo.com}
+</#noparse>
+ 
+echo "time,user,status,duration,size"
+<#list records as record>
+date "+%FT%H:%M:%S" | tr -d '\n'; curl --write-out ',${record.disposer},%{http_code},%{time_total},%{size_download}\n' --silent --show-error --output /dev/null "${r"${MY_BASE_URL}"}/get"
+</#list>
diff --git a/freemarker-generator-cli/templates/csv/transform.ftl b/freemarker-generator-cli/templates/csv/transform.ftl
new file mode 100644
index 0000000..0380abb
--- /dev/null
+++ b/freemarker-generator-cli/templates/csv/transform.ftl
@@ -0,0 +1,39 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign csvParser = createCsvParser(Documents.get(0))>
+<#assign csvPrinter = createCsvPrinter()>
+<#-- Print each line without materializing the CSV in memory -->
+<#compress>
+    <#list csvParser.iterator() as record>
+        ${csvPrinter.printRecord(record)}
+    </#list>
+</#compress>
+
+<#function createCsvParser document>
+    <#assign initialCvsInFormat = CSVTool.formats[SystemTool.getParameter("csv.in.format", "DEFAULT")]>
+    <#assign csvInDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.in.delimiter", initialCvsInFormat.getDelimiter()))>
+    <#assign cvsInFormat = initialCvsInFormat.withDelimiter(csvInDelimiter)>
+    <#return CSVTool.parse(document, cvsInFormat)>
+</#function>
+
+<#function createCsvPrinter>
+    <#assign initialCvsOutFormat = CSVTool.formats[SystemTool.getParameter("csv.out.format", "DEFAULT")]>
+    <#assign csvOutDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.out.delimiter", initialCvsOutFormat.getDelimiter()))>
+    <#assign cvsOutFormat = initialCvsOutFormat.withDelimiter(csvOutDelimiter)>
+    <#return CSVTool.printer(cvsOutFormat, SystemTool.writer)>
+</#function>
\ No newline at end of file
diff --git a/freemarker-generator-cli/templates/demo.ftl b/freemarker-generator-cli/templates/demo.ftl
new file mode 100644
index 0000000..b3cad69
--- /dev/null
+++ b/freemarker-generator-cli/templates/demo.ftl
@@ -0,0 +1,143 @@
+<#ftl output_format="plainText">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+1) FreeMarker Special Variables
+---------------------------------------------------------------------------
+FreeMarker version     : ${.version}
+Template name          : ${.current_template_name}
+Language               : ${.lang}
+Locale                 : ${.locale}
+Timestamp              : ${.now}
+Output encoding        : ${.output_encoding!"not set"}
+Output format          : ${.output_format}
+
+2) Invoke a constructor of a Java class
+---------------------------------------------------------------------------
+<#assign date = FreeMarkerTool.objectConstructor("java.util.Date", 1000 * 3600 * 24)>
+new java.utilDate(1000 * 3600 * 24): ${date?datetime}
+
+3) Invoke a static method of an non-constructor class
+---------------------------------------------------------------------------
+Random UUID              : ${FreeMarkerTool.statics["java.util.UUID"].randomUUID()}
+System.currentTimeMillis : ${FreeMarkerTool.statics["java.lang.System"].currentTimeMillis()}
+
+4) Access an Enumeration
+---------------------------------------------------------------------------
+java.math.RoundingMode#UP: ${FreeMarkerTool.enums["java.math.RoundingMode"].UP}
+
+5) Loop Over The Values Of An Enumeration
+---------------------------------------------------------------------------
+<#list FreeMarkerTool.enums["java.math.RoundingMode"]?values as roundingMode>
+- java.math.RoundingMode.${roundingMode}<#lt>
+</#list>
+
+6) Display list of input files
+---------------------------------------------------------------------------
+List all files:
+<#list Documents.list as document>
+- Document: name=${document.name} location=${document.location} length=${document.length} encoding=${document.encoding!""}
+</#list>
+
+7) SystemTool
+---------------------------------------------------------------------------
+Host name       : ${SystemTool.getHostName()}
+Command line    : ${SystemTool.getCommandLineArgs()?join(", ")}
+System property : ${SystemTool.getSystemProperty("user.name", "N.A.")}
+Timestamp       : ${SystemTool.currentTimeMillis?c}
+Environment var : ${SystemTool.envs["USER"]!"N.A."}
+
+8) Access System Properties
+---------------------------------------------------------------------------
+app.dir      : ${SystemTool.systemProperties["app.dir"]!""}
+app.home     : ${SystemTool.systemProperties["app.home"]!""}
+app.pid      : ${SystemTool.systemProperties["app.pid"]!""}
+basedir      : ${SystemTool.systemProperties["basedir"]!""}
+java.version : ${SystemTool.systemProperties["java.version"]!""}
+user.name    : ${SystemTool.systemProperties["user.name"]!""}
+user.dir     : ${SystemTool.systemProperties["user.dir"]!""}
+user.home    : ${SystemTool.systemProperties["user.home"]!""}
+
+9) List Environment Variables
+---------------------------------------------------------------------------
+<#list SystemTool.envs as name,value>
+- ${name} ==> ${value}<#lt>
+</#list>
+
+10) List System Properties
+---------------------------------------------------------------------------
+<#list SystemTool.systemProperties as name,value>
+- ${name} ==> ${value}<#lt>
+</#list>
+
+11) Access Documents
+---------------------------------------------------------------------------
+Get the number of documents:
+- ${Documents.size()}
+<#if !Documents.isEmpty()>
+Get the first document
+- ${Documents.get(0)!"NA"}
+</#if>
+List all files containing "README" in the name
+<#list Documents.find("*README*") as document>
+- ${document.name}
+</#list>
+List all files having "md" extension
+<#list Documents.find("*.md") as document>
+- ${document.name}
+</#list>
+Get all documents
+<#list Documents.list as document>
+- ${document.name} => ${document.location}
+</#list>
+
+12) FreeMarker CLI Tools
+---------------------------------------------------------------------------
+<#list .data_model?keys?sort as key>
+<#if key?ends_with("Tool")>
+- ${key?right_pad(20)} : ${.data_model[key]}
+</#if>
+</#list>
+
+13) Document Data Model
+---------------------------------------------------------------------------
+<#list .data_model?keys?sort as key>
+- ${key}<#lt>
+</#list>
+
+14) Create a UUID
+---------------------------------------------------------------------------
+UUIDTool Random UUID  : ${UUIDTool.randomUUID()}
+UUIDTool Named UUID   : ${UUIDTool.namedUUID("value and salt")}
+
+15) Printing Special Characters
+---------------------------------------------------------------------------
+German Special Characters: äöüßÄÖÜ
+
+16) Locale-specific output
+---------------------------------------------------------------------------
+<#setting number_format=",##0.00">
+<#assign smallNumber = 1.234>
+<#assign largeNumber = 12345678.9>
+Small Number :  ${smallNumber}
+Large Number :  ${largeNumber}
+Date         :  ${.now?date}
+Time         :  ${.now?time}
+
+17) Execute a program
+---------------------------------------------------------------------------
+> date
+${ExecTool.execute("date")}
\ No newline at end of file
diff --git a/freemarker-generator-cli/templates/excel/csv/custom.ftl b/freemarker-generator-cli/templates/excel/csv/custom.ftl
new file mode 100644
index 0000000..9235460
--- /dev/null
+++ b/freemarker-generator-cli/templates/excel/csv/custom.ftl
@@ -0,0 +1,56 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign format = SystemTool.parameters["csv.format"]!"DEFAULT">
+<#assign salt = SystemTool.parameters["salt"]!"salt">
+<#-- Parse the first document & sheet of the Excel document -->
+<#assign workbook = ExcelTool.parse(Documents.get(0))>
+<#assign sheet = ExcelTool.getSheets(workbook)[0]>
+<#assign records = ExcelTool.toTable(sheet)>
+<#-- Setup CSVPrinter  -->
+<#assign cvsFormat = CSVTool.formats[format]>
+<#assign csvPrinter = CSVTool.printer(cvsFormat, SystemTool.writer)>
+<#--
+    Transform an arbitrary Excel file and add addition columns using Commons CSV
+    We are using an instance of CSVPrinter directly have proper quoting of the output
+    which in turn uses the underlying java.io.Writer.
+-->
+<#compress>
+    <#list records as record>
+        <#if record?is_first>
+        <#-- Updated header line -->
+            <#assign line = "Line">
+            <#assign uuid = "UUID">
+            <#assign quoted = "Quoted Text">
+        <#else>
+        <#-- Updated rows -->
+            <#assign line = record?counter-1>
+            <#assign uuid = uuidFromValueAndSalt(text, salt)>
+            <#assign quoted = ",;">
+        </#if>
+        <#assign text = record[1]>
+        <#assign date = record[2]>
+        ${csvPrinter.printRecord(line, text, date, uuid, quoted)}
+    </#list>
+</#compress>
+<#--------------------------------------------------------------------------->
+<#function uuidFromValueAndSalt value salt>
+    <#assign uuidSource = value + salt>
+    <#assign buffer = FreeMarkerTool.statics["java.nio.charset.Charset"].forName("UTF-8").encode(uuidSource).rewind()>
+    <#assign bytes = buffer.array()[0..<buffer.limit()]>
+    <#return FreeMarkerTool.statics["java.util.UUID"].nameUUIDFromBytes(bytes)>
+</#function>
\ No newline at end of file
diff --git a/freemarker-generator-cli/templates/excel/csv/transform.ftl b/freemarker-generator-cli/templates/excel/csv/transform.ftl
new file mode 100644
index 0000000..a1e2497
--- /dev/null
+++ b/freemarker-generator-cli/templates/excel/csv/transform.ftl
@@ -0,0 +1,31 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign format = SystemTool.parameters["csv.format"]!"DEFAULT">
+<#-- Parse the first document & sheet of the Excel document -->
+<#assign workbook = ExcelTool.parse(Documents.get(0))>
+<#assign sheet = ExcelTool.getSheets(workbook)[0]>
+<#assign records = ExcelTool.toTable(sheet)>
+<#-- Setup CSVPrinter  -->
+<#assign cvsFormat = CSVTool.formats[format]>
+<#assign csvPrinter = CSVTool.printer(cvsFormat, SystemTool.writer)>
+<#-- Print each line of the Excel as CSV record -->
+<#compress>
+    <#list records as record>
+        ${csvPrinter.printRecord(record)}
+    </#list>
+</#compress>
diff --git a/freemarker-generator-cli/templates/excel/html/transform.ftl b/freemarker-generator-cli/templates/excel/html/transform.ftl
new file mode 100644
index 0000000..5fa4ad9
--- /dev/null
+++ b/freemarker-generator-cli/templates/excel/html/transform.ftl
@@ -0,0 +1,83 @@
+<#ftl output_format="HTML" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign documentName = document.name>
+<#assign workbook = ExcelTool.parse(document)>
+<#assign date = .now?iso_utc>
+<#--------------------------------------------------------------------------->
+<!DOCTYPE html>
+<html>
+<head>
+    <title>${documentName}</title>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
+</head>
+<body>
+<div class="container-fluid">
+    <h1>Excel Test
+        <small>${documentName}, ${date}</small>
+    </h1>
+    <@writeSheets workbook/>
+</div>
+</body>
+</html>
+
+<#--------------------------------------------------------------------------->
+<#-- writeSheets                                                           -->
+<#--------------------------------------------------------------------------->
+<#macro writeSheets workbook>
+    <#assign sheets = ExcelTool.getSheets(workbook)>
+    <#list sheets as sheet>
+        <@writeSheet sheet/>
+    </#list>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeSheet                                                            -->
+<#--------------------------------------------------------------------------->
+<#macro writeSheet sheet>
+    <#assign rows = ExcelTool.toTable(sheet)>
+    <h2>${sheet.getSheetName()}</h2>
+    <@writeRows rows/>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeRows                                                             -->
+<#--------------------------------------------------------------------------->
+<#macro writeRows rows>
+    <table class="table table-striped">
+        <#list rows as row>
+            <#if row?is_first>
+                <tr>
+                    <th>#</th>
+                    <#list row as column>
+                        <th>${column}</th>
+                    </#list>
+                </tr>
+            <#else>
+                <tr>
+                    <td>${row?index}</td>
+                    <#list row as column>
+                        <td>${column}</td>
+                    </#list>
+                </tr>
+            </#if>
+        </#list>
+    </table>
+</#macro>
diff --git a/freemarker-generator-cli/templates/excel/md/transform.ftl b/freemarker-generator-cli/templates/excel/md/transform.ftl
new file mode 100644
index 0000000..6ce112e
--- /dev/null
+++ b/freemarker-generator-cli/templates/excel/md/transform.ftl
@@ -0,0 +1,75 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign documentName = document.name>
+<#assign workbook = ExcelTool.parse(document)>
+<#assign date = .now?iso_utc>
+
+<#compress>
+    # ${documentName}
+    <@writeSheets workbook/>
+</#compress>
+${'\n'}
+
+<#--------------------------------------------------------------------------->
+<#-- writeSheets                                                           -->
+<#--------------------------------------------------------------------------->
+<#macro writeSheets workbook>
+    <#assign sheets = ExcelTool.getSheets(workbook)>
+    <#list sheets as sheet>
+        <@writeSheet sheet/>
+    </#list>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeSheet                                                            -->
+<#--------------------------------------------------------------------------->
+<#macro writeSheet sheet>
+    <#assign rows = ExcelTool.toTable(sheet)>
+    ## ${sheet.getSheetName()}
+    ${'\n'}
+    <@writeRows rows/>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeRows                                                             -->
+<#--------------------------------------------------------------------------->
+<#macro writeRows rows>
+    <#list rows as row>
+        <#if row?is_first>
+            <@writeHeaderRow row/>
+        <#else>
+            <@writeDataRow row/>
+        </#if>
+    </#list>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeHeaderRow                                                        -->
+<#--------------------------------------------------------------------------->
+<#macro writeHeaderRow headers>
+    | ${headers?join(" | ", "", " |")}
+    <#list headers as header>| -------- </#list>|
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#-- writeDataRow                                                          -->
+<#--------------------------------------------------------------------------->
+<#macro writeDataRow columns>
+    | ${columns?join(" | ", "", " |")}
+</#macro>
diff --git a/freemarker-generator-cli/templates/html/csv/dependencies.ftl b/freemarker-generator-cli/templates/html/csv/dependencies.ftl
new file mode 100644
index 0000000..0eaad6c
--- /dev/null
+++ b/freemarker-generator-cli/templates/html/csv/dependencies.ftl
@@ -0,0 +1,50 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign document = Documents.get(0)>
+<#assign documentName = document.name>
+<#assign html = JsoupTool.parse(document)>
+
+<#compress>
+    <@writeHeader/>
+    <@writeDependencies "Project_Dependencies_compile"/>
+    <@writeDependencies "Project_Transitive_Dependencies_compile"/>
+    <@writeDependencies "Project_Transitive_Dependencies_runtime"/>
+    <@writeDependencies "Project_Transitive_Dependencies_provided"/>
+</#compress>
+
+<#macro writeHeader>
+    GroupId,ArtifactId,Version,Type,Licenses
+</#macro>
+
+<#macro writeDependencies section>
+    <#assign selection = html.select("a[name=${section}]")>
+    <#if selection?has_content>
+        <#assign table = selection[0].nextElementSibling().child(2).child(0)>
+        <#assign rows = table.children()>
+        <#list rows as row>
+            <#if !row?is_first>
+                <#assign groupId = row.child(0).text()>
+                <#assign artificatId = row.child(1).text()>
+                <#assign version = row.child(2).text()>
+                <#assign type = row.child(3).text()>
+                <#assign licences = row.child(4).text()?replace(",", "")>
+                ${groupId},${artificatId},${version},${type},${licences}
+            </#if>
+        </#list>
+    </#if>
+</#macro>
diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl
new file mode 100644
index 0000000..9f2fbe8
--- /dev/null
+++ b/freemarker-generator-cli/templates/info.ftl
@@ -0,0 +1,67 @@
+<#ftl output_format="plainText" strip_whitespace=true>
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+FreeMarker CLI Information
+---------------------------------------------------------------------------
+FreeMarker version     : ${.version}
+Template name          : ${.current_template_name}
+Language               : ${.lang}
+Locale                 : ${.locale}
+Timestamp              : ${.now}
+Output encoding        : ${.output_encoding}
+Output format          : ${.output_format}
+
+FreeMarker CLI Template Directories
+---------------------------------------------------------------------------
+<#list SystemTool.getTemplateDirectories() as directory>
+[${directory?counter}] ${directory}
+</#list>
+
+FreeMarker CLI Tools
+---------------------------------------------------------------------------
+<#list .data_model?keys?sort as key>
+<#if key?ends_with("Tool")>
+- ${key?right_pad(20)} : ${.data_model[key]}
+</#if>
+</#list>
+
+FreeMarker CLI Documents
+---------------------------------------------------------------------------
+<#list Documents.list as document>
+[${document?counter}] ${document.name}, ${document.location}, ${document.length} Bytes
+</#list>
+
+User Supplied Parameters
+---------------------------------------------------------------------------
+<#list SystemTool.parameters as name,value>
+- ${name} ==> ${value}
+</#list>
+
+User Supplied System Properties
+---------------------------------------------------------------------------
+<#list SystemTool.userSystemProperties as name,value>
+- ${name} ==> ${value}
+</#list>
+
+SystemTool
+---------------------------------------------------------------------------
+Command line         : ${SystemTool.getCommandLineArgs()?join(", ")}
+Host Name            : ${SystemTool.getHostName()}
+Java Home            : ${SystemTool.getEnv("JAVA_HOME", "N.A.")}
+User Name            : ${SystemTool.getSystemProperty("user.name", "N.A.")}
+Timestamp            : ${SystemTool.currentTimeMillis}
+Writer               : ${SystemTool.writer.class.name}
diff --git a/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl b/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
new file mode 100644
index 0000000..7e34ac5
--- /dev/null
+++ b/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
@@ -0,0 +1,48 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign basePath = json.read("$.basePath")>
+<#assign paths = json.read("$.paths")>
+
+<#compress>
+    ENDPOINT;METHOD;CONSUMES;PRODUCES;SUMMARY;DESCRIPTION
+    <#list paths as endpoint,metadata>
+        <#assign relative_url = basePath + endpoint>
+        <#assign methods = metadata?keys>
+        <#list methods as method>
+            <#assign summary = sanitize(paths[endpoint][method]["summary"]!"")>
+            <#assign description = sanitize(paths[endpoint][method]["description"]!"")>
+            <#assign consumes = join(paths[endpoint][method]["consumes"]![])>
+            <#assign produces = join(paths[endpoint][method]["produces"]![])>
+            ${relative_url};${method?upper_case};${consumes};${produces};${summary};${description}
+        </#list>
+    </#list>
+</#compress>
+${'\n'}
+
+<#function sanitize str>
+    <#return (((str?replace(";", ","))?replace("(\\n)+", "",'r')))?truncate(250)>
+</#function>
+
+<#function join list>
+    <#if list?has_content>
+        <#return list?join(", ")>
+    <#else>
+        <#return "">
+    </#if>
+</#function>
diff --git a/freemarker-generator-cli/templates/json/md/github-users.ftl b/freemarker-generator-cli/templates/json/md/github-users.ftl
new file mode 100644
index 0000000..581d1ca
--- /dev/null
+++ b/freemarker-generator-cli/templates/json/md/github-users.ftl
@@ -0,0 +1,35 @@
+<#ftl output_format="plainText" >
+<#--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign users = json.read("$[*]")>
+<#--------------------------------------------------------------------------->
+# GitHub Users
+
+Report generated at ${.now?iso_utc}
+
+<#compress>
+<#list users as user>
+<#assign userAvatarUrl = user.avatar_url>
+<#assign userHomeUrl = user.html_url>
+# ${user.login}
+
+| User                                                    | Homepage                                      |
+|:--------------------------------------------------------|:----------------------------------------------|
+| <img src="${user.avatar_url}" width="48" height="48"/> | [${userHomeUrl}](${userHomeUrl})               |
+</#list>
+</#compress>
\ No newline at end of file
diff --git a/freemarker-generator-cli/templates/properties/csv/locker-test-users.ftl b/freemarker-generator-cli/templates/properties/csv/locker-test-users.ftl
new file mode 100644
index 0000000..4328182
--- /dev/null
+++ b/freemarker-generator-cli/templates/properties/csv/locker-test-users.ftl
@@ -0,0 +1,62 @@
+<#ftl output_format="plainText" strip_text="true">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#compress>
+    TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION
+    <#list Documents.list as document>
+        <#assign properties = PropertiesTool.parse(document)>
+        <#assign environments = properties["ENVIRONMENTS"]!"">
+        <#assign tenant = extractTenant(environments)>
+        <#assign site = extractSite(environments)>
+        <#assign userId = properties["USER_ID"]!"">
+        <#assign disposerId = properties["USER_ID"]!"">
+        <#assign password = properties["PASSWORD"]!"">
+        <#assign smsOtp = properties["SMS_OTP"]!"">
+        <#assign name = properties["NAME"]!"">
+        <#assign description = properties["DESCRIPTION"]!"">
+        ${tenant},${site},${userId},${disposerId},${password},${smsOtp},${name},${description}
+    </#list>
+</#compress>
+${'\n'}
+
+<#function extractSite environments>
+    <#if (environments)?contains("_DEV")>
+        <#return "dev">
+    <#elseif (environments)?contains("_FAT")>
+        <#return "fat">
+    <#elseif (environments)?contains("_ST")>
+        <#return "st">
+    <#elseif (environments)?contains("_PROD")>
+        <#return "prod">
+    <#elseif (environments)?contains("_UAT")>
+        <#return "uat">
+    <#else>
+        <#return "???">
+    </#if>
+</#function>
+
+<#function extractTenant environments>
+    <#if (environments)?contains("TENANT_A")>
+        <#return "TENANT_A">
+    <#elseif (environments)?contains("TENANT_B")>
+        <#return "TENANT_B">
+    <#elseif (environments)?contains("TENANT_C")>
+        <#return "TENANT_C">
+    <#else>
+        <#return "???">
+    </#if>
+</#function>
diff --git a/freemarker-generator-cli/templates/tsv/fo/transactions.ftl b/freemarker-generator-cli/templates/tsv/fo/transactions.ftl
new file mode 100644
index 0000000..2485e48
--- /dev/null
+++ b/freemarker-generator-cli/templates/tsv/fo/transactions.ftl
@@ -0,0 +1,91 @@
+<#ftl output_format="XML" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign cvsFormat = CSVTool.formats["TDF"].withHeader()>
+<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvHeaders = csvParser.getHeaderMap()?keys>
+<#assign csvRecords = csvParser.records>
+<#--------------------------------------------------------------------------->
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+    <fo:layout-master-set>
+        <fo:simple-page-master master-name="first"
+                               page-height="21cm"
+                               page-width="29.7cm"
+                               margin-top="1cm"
+                               margin-bottom="1cm"
+                               margin-left="1cm"
+                               margin-right="1cm">
+            <fo:region-body margin-top="1cm"/>
+            <fo:region-before extent="1cm"/>
+            <fo:region-after extent="-1.2cm"/>
+        </fo:simple-page-master>
+    </fo:layout-master-set>
+    <fo:page-sequence master-reference="first">
+        <fo:static-content flow-name="xsl-region-before">
+            <fo:block line-height="10pt" font-size="8pt" text-align="left">Transaction Export - ${.now}</fo:block>
+        </fo:static-content>
+        <fo:static-content flow-name="xsl-region-after">
+            <fo:block line-height="6pt" font-size="6pt" text-align="end">Page <fo:page-number/></fo:block>
+        </fo:static-content>
+        <fo:flow flow-name="xsl-region-body">
+            <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+                <fo:table-column column-width="8%"/>
+                <fo:table-column column-width="10%"/>
+                <fo:table-column column-width="12%"/>
+                <fo:table-column column-width="8%"/>
+                <fo:table-column column-width="7%"/>
+                <fo:table-column column-width="5%"/>
+                <fo:table-column column-width="5%"/>
+                <fo:table-column column-width="5%"/>
+                <fo:table-column column-width="35%"/>
+                <fo:table-column column-width="5%"/>
+                <@writeTableHeader headers=csvHeaders/>
+                <@writeTableBody columns=csvRecords/>
+            </fo:table>
+        </fo:flow>
+    </fo:page-sequence>
+</fo:root>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableHeader headers>
+    <fo:table-header>
+        <fo:table-row>
+            <#list headers as header>
+                <fo:table-cell border-style="solid" border-width="0.1pt" padding-left="1.0px" padding-right="1.0px">
+                    <fo:block font-size="6pt" font-weight="bold">${header}</fo:block>
+                </fo:table-cell>
+            </#list>
+        </fo:table-row>
+    </fo:table-header>
+</#macro>
+
+<#--------------------------------------------------------------------------->
+<#macro writeTableBody columns>
+    <fo:table-body>
+        <#list columns as column>
+            <fo:table-row>
+                <#list column.iterator() as field>
+                    <fo:table-cell border-style="solid" border-width="0.1pt" padding-left="1.0px" padding-right="1.0px">
+                        <fo:block font-size="6pt">${field}</fo:block>
+                    </fo:table-cell>
+                </#list>
+            </fo:table-row>
+        </#list>
+    </fo:table-body>
+</#macro>
diff --git a/freemarker-generator-cli/templates/xml/txt/recipients.ftl b/freemarker-generator-cli/templates/xml/txt/recipients.ftl
new file mode 100644
index 0000000..434d7ea
--- /dev/null
+++ b/freemarker-generator-cli/templates/xml/txt/recipients.ftl
@@ -0,0 +1,36 @@
+<#ftl output_format="plainText" >
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign xml = XmlTool.parse(Documents.get(0))>
+<#list xml.recipients.person as recipient>
+To: ${recipient.name}
+${recipient.address}
+
+Dear ${recipient.name},
+
+Thank you for your interest in our products. We will be sending you a catalog shortly.
+To take advantage of our free gift offer, please fill in the survey attached to this
+letter and return it to the address on the reverse. Only one participant is allowed for
+each household.
+
+Sincere salutations,
+
+
+D. H.
+
+---------------------------------------------------------------------------------------
+</#list>
diff --git a/freemarker-generator-cli/templates/yaml/txt/transform.ftl b/freemarker-generator-cli/templates/yaml/txt/transform.ftl
new file mode 100644
index 0000000..00911bc
--- /dev/null
+++ b/freemarker-generator-cli/templates/yaml/txt/transform.ftl
@@ -0,0 +1,46 @@
+<#ftl output_format="plainText">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign map = YamlTool.parse(Documents.get(0))>
+<#--------------------------------------------------------------------------->
+<#compress>
+<@print map 1/>
+</#compress>
+
+<#macro print object level>
+    <#if object?is_sequence>
+        <#list object as value>
+            <@print value level/>
+        </#list>
+    <#elseif object?is_hash>
+        <#list object as key, value>
+            ${level} ${key} : <@printValue value level/>
+        </#list>
+    </#if>
+</#macro>
+
+<#macro printValue value level>
+        <#if value?is_sequence>
+            ${'\n'}<@print value level+1/>
+        <#elseif value?is_hash>
+            ${'\n'}<@print value level+1/>
+        <#elseif value?is_number>
+            ${value?c}
+        <#else>
+            ${value}
+        </#if>
+</#macro>
diff --git a/freemarker-generator-maven-plugin-sample/LICENSE b/freemarker-generator-maven-plugin-sample/LICENSE
new file mode 100644
index 0000000..1121eba
--- /dev/null
+++ b/freemarker-generator-maven-plugin-sample/LICENSE
@@ -0,0 +1,223 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================
+
+The source code contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
+
+  src/main/misc/overloadedNumberRules/prices.ods
+  src/manual/en_US/docgen-originals/figures/overview.odg
+  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
+  src/manual/en_US/favicon.png
+  src/manual/en_US/figures/model2sketch.png
+  src/manual/en_US/figures/overview.png
+  src/manual/en_US/figures/tree.png
+  src/manual/en_US/logo.png
+  src/manual/zh_CN/favicon.png
+  src/manual/zh_CN/figures/model2sketch.png
+  src/manual/zh_CN/figures/overview.png
+  src/manual/zh_CN/figures/tree.png
+  src/manual/zh_CN/logo.png
diff --git a/freemarker-generator-maven-plugin-sample/NOTICE b/freemarker-generator-maven-plugin-sample/NOTICE
new file mode 100644
index 0000000..c27f50e
--- /dev/null
+++ b/freemarker-generator-maven-plugin-sample/NOTICE
@@ -0,0 +1,5 @@
+Apache FreeMarker Site
+Copyright 2020 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/freemarker-generator-maven-plugin-sample/README.md b/freemarker-generator-maven-plugin-sample/README.md
new file mode 100644
index 0000000..4669e07
--- /dev/null
+++ b/freemarker-generator-maven-plugin-sample/README.md
@@ -0,0 +1,13 @@
+Apache FreeMarker Generator Maven Plugin Sample
+=============================================================================
+
+This project allows to play around with `freemarker-generator-maven-plugin` quickly. 
+
+Let's create a Java class and text file using the `freemarker-generator-maven-plugin`, compile and package it (so you know that the generated code is compiling)
+
+```text
+> mvn clean package
+> cat target/generated-sources/freemarker/generator/org/apache/freemarker/generator/maven/sample/HelloWorld.java 
+> cat target/generated-sources/freemarker/generator/test.txt
+```
+
diff --git a/freemarker-generator-maven-plugin-sample/pom.xml b/freemarker-generator-maven-plugin-sample/pom.xml
new file mode 100644
index 0000000..cbd84a1
--- /dev/null
+++ b/freemarker-generator-maven-plugin-sample/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.freemarker.generator</groupId>
+        <artifactId>freemarker-generator</artifactId>
+        <version>0.1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>freemarker-generator-maven-plugin-sample</artifactId>
+    <name>Apache FreeMarker Generator: Maven Plugin Sample</name>
+    <description>Sample project for Apache FreeMarker Generator Plugin</description>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.freemarker.generator</groupId>
+                <artifactId>freemarker-generator-maven-plugin</artifactId>
+                <version>${project.version}</version>
+                <configuration>
+                    <!-- Required. Specifies the compatibility version for template processing -->
+                    <freeMarkerVersion>${freemarker.version}</freeMarkerVersion>
+                </configuration>
+                <executions>
+                    <!-- 
+                        If you want to generate files during other phases, just add more execution
+                        tags and specify appropriate phase, sourceDirectory and outputDirectory values.
+                    -->
+                    <execution>
+                        <id>freemarker-generator</id>
+                        <!-- Optional, defaults to generate-sources -->
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <!-- Required, must be generate -->
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <!-- Optional, defaults to src/main/freemarker/generator -->
+                            <sourceDirectory>src/main/freemarker/generator</sourceDirectory>
+                            <!-- Optional, defaults to src/main/freemarker/generator/templatee -->
+                            <templateDirectory>src/main/freemarker/generator/template</templateDirectory>
+                            <!-- Optional, defaults to src/main/freemarker/generator/generatorr -->
+                            <generatorDirectory>src/main/freemarker/generator/generator</generatorDirectory>
+                            <!-- Optional, defaults to target/generated-sources/freemarker/generator -->
+                            <outputDirectory>target/generated-sources/freemarker/generator</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>*.md</exclude>
+                        <excludde>**/*.json</excludde>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </reporting>
+</project>
\ No newline at end of file
diff --git a/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/generator/org/apache/freemarker/generator/maven/sample/HelloWorld.java.json b/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/generator/org/apache/freemarker/generator/maven/sample/HelloWorld.java.json
new file mode 100644
index 0000000..088b6b5
--- /dev/null
+++ b/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/generator/org/apache/freemarker/generator/maven/sample/HelloWorld.java.json
@@ -0,0 +1,6 @@
+{
+  "templateName": "HelloWorld.java.ftl",
+  "dataModel": {
+    "name": "Apache FreeMarker Maven Plugin"
+  }
+}
\ No newline at end of file
diff --git a/src/test/data/generating-file-visitor/data/mydir/success-test.txt.json b/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/generator/test.txt.json
similarity index 100%
copy from src/test/data/generating-file-visitor/data/mydir/success-test.txt.json
copy to freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/generator/test.txt.json
diff --git a/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/template/HelloWorld.java.ftl b/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/template/HelloWorld.java.ftl
new file mode 100644
index 0000000..9f7f41a
--- /dev/null
+++ b/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/template/HelloWorld.java.ftl
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package ${session.currentProject.model.groupId}.maven.sample;
+
+/**
+ * Generated by Apache FreeMarker ${pomProperties["freemarker.version"]}.
+ */
+public class HelloWorld 
+{
+	public static void main (String[] args)
+	{
+	    System.out.println("Hello ${name}!");
+	}
+}
\ No newline at end of file
diff --git a/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/template/test.ftl b/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/template/test.ftl
new file mode 100644
index 0000000..ebb20b3
--- /dev/null
+++ b/freemarker-generator-maven-plugin-sample/src/main/freemarker/generator/template/test.ftl
@@ -0,0 +1,43 @@
+<#ftl output_format="plainText">
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<#assign model=session.currentProject.model>
+<#assign properties=session.currentProject.properties>
+<#assign dependencies=session.currentProject.dependencies>
+Accessing Generator Data
+-----------------------------------------------------------------------------
+This is a test freemarker template. Test json data: '${testVar}'
+
+Maven Project Properties
+-----------------------------------------------------------------------------
+<#list properties as key,value>
+- ${key?right_pad(38)} ==> ${value}<#lt>
+</#list>
+
+Maven Project Model
+-----------------------------------------------------------------------------
+- ArtifactId                             ==> ${model.artifactId}
+- GroupId                                ==> ${model.groupId}
+- Version                                ==> ${model.version}
+- Name                                   ==> ${model.name}
+- Description                            ==> ${model.description!""}
+
+Maven Project Dependencies
+-----------------------------------------------------------------------------
+<#list dependencies as dependency>
+- ${dependency.groupId}:${dependency.artifactId}:${dependency.version}:${dependency.optional?string('yes', 'no')}
+</#list>
\ No newline at end of file
diff --git a/freemarker-generator-maven-plugin/LICENSE b/freemarker-generator-maven-plugin/LICENSE
new file mode 100644
index 0000000..1121eba
--- /dev/null
+++ b/freemarker-generator-maven-plugin/LICENSE
@@ -0,0 +1,223 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================
+
+The source code contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
+
+  src/main/misc/overloadedNumberRules/prices.ods
+  src/manual/en_US/docgen-originals/figures/overview.odg
+  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
+  src/manual/en_US/favicon.png
+  src/manual/en_US/figures/model2sketch.png
+  src/manual/en_US/figures/overview.png
+  src/manual/en_US/figures/tree.png
+  src/manual/en_US/logo.png
+  src/manual/zh_CN/favicon.png
+  src/manual/zh_CN/figures/model2sketch.png
+  src/manual/zh_CN/figures/overview.png
+  src/manual/zh_CN/figures/tree.png
+  src/manual/zh_CN/logo.png
diff --git a/freemarker-generator-maven-plugin/NOTICE b/freemarker-generator-maven-plugin/NOTICE
new file mode 100644
index 0000000..c27f50e
--- /dev/null
+++ b/freemarker-generator-maven-plugin/NOTICE
@@ -0,0 +1,5 @@
+Apache FreeMarker Site
+Copyright 2020 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/freemarker-generator-maven-plugin/README.md b/freemarker-generator-maven-plugin/README.md
new file mode 100644
index 0000000..f6e186d
--- /dev/null
+++ b/freemarker-generator-maven-plugin/README.md
@@ -0,0 +1,149 @@
+Apache FreeMarker Generator Maven Plugin
+=============================================================================
+
+# Table of contents
+
+- [Background](#background)
+- [Install](#install)
+- [Usage](#usage)
+  - [FreeMarker Template Files](#freemarker-template-files)
+  - [JSON Generator Files](#json-generator-files)
+  - [Using POM Properties During Generation](#using-pom-properties-during-generation)
+  - [FreeMarker Configuration](#freemarker-configuration)
+  - [Incremental Builds](#incremental-builds)
+- [Code Coverage](#code-coverage)
+
+# Background
+This plugin generates source files from FreeMarker templates with a flexible process that includes the ability to:
+
+- Generate multiple source files from a single template,
+- Generate source files during multiple steps in the build process such as testing, and
+- Specify distinct locations for the templates and data models for different stages of the build. 
+
+# Install
+
+## pom.xml
+
+Add the following snippet within the `<plugins>` tag of your pom.xml:
+
+```xml
+<build>
+    <plugins>
+        <plugin>
+            <groupId>org.apache.freemarker.generator</groupId>
+            <artifactId>freemarker-generator-maven-plugin</artifactId>
+            <version>${project.version}</version>
+            <configuration>
+                <!-- Required. Specifies the compatibility version for template processing -->
+                <freeMarkerVersion>${freemarker.version}</freeMarkerVersion>
+            </configuration>
+            <executions>
+                <!-- 
+                    If you want to generate files during other phases, just add more execution
+                    tags and specify appropriate phase, sourceDirectory and outputDirectory values.
+                -->
+                <execution>
+                    <id>freemarker-generator</id>
+                    <!-- Optional, defaults to generate-sources -->
+                    <phase>generate-sources</phase>
+                    <goals>
+                        <!-- Required, must be generate -->
+                        <goal>generate</goal>
+                    </goals>
+                    <configuration>
+                        <!-- Optional, defaults to src/main/freemarker/generator -->
+                        <sourceDirectory>src/main/freemarker/generator</sourceDirectory>
+                        <!-- Optional, defaults to src/main/freemarker/generator/templatee -->
+                        <templateDirectory>src/main/freemarker/generator/template</templateDirectory>
+                        <!-- Optional, defaults to src/main/freemarker/generator/generatorr -->
+                        <generatorDirectory>src/main/freemarker/generator/generator</generatorDirectory>
+                        <!-- Optional, defaults to target/generated-sources/freemarker/generator -->
+                        <outputDirectory>target/generated-sources/freemarker/generator</outputDirectory>
+                    </configuration>
+                </execution>
+            </executions>
+        </plugin>
+    </plugins>
+</build>
+```
+
+# Usage
+
+## FreeMarker Template Files
+FreeMarker template files must reside in the `templateDirectory`. For the default configuration,
+this is: `src/main/freemarker/generator/template`.
+
+By convention, file names for FreeMarker template files use the .ftl extension. For details on the FreeMarker
+template syntax, see: [Getting Started](https://freemarker.apache.org/docs/dgui_quickstart.html) and
+[Template Language Reference](https://freemarker.apache.org/docs/ref.html).
+
+## JSON Generator Files
+The JSON generator files must reside in the `generatorDirectory`. For the default
+configuration, this is: `src/main/freemarker/generator/generator`.
+
+For each JSON generator file, freemarker-maven-plugin will generate a file under the outputDirectory.
+The name of the generated file will be based on the name of the JSON data file. For example,
+the following JSON file: 
+```
+    <sourceDirectory>/data/my/package/MyClass.java.json
+```
+will result in the following file being generated:
+```
+    <outputDirectory>/my/package/MyClass.java
+```
+
+This plugin parses the JSON generator file's `dataModel` field into a `Map<String, Object>` instance (hereafter, referred
+to as the data model). If the dataModel field is empty, an empty map will be created.
+
+Here are some additional details you need to know.
+
+  - This plugin *requires* one top-level field in the JSON data file: `templateName`. This field is used to locate the template file under `<sourceDirectory>/template` that is used to generate the file. This plugin provides the data model to FreeMarker as the data model to process the template identified by `templateName`.
+  - The parser allows for comments.
+  - This plugin currently assumes that the JSON data file encoded using UTF-8.
+
+Here is an example JSON data file:
+```json
+{
+  // An end-of-line comment.
+  # Another end-of-line comment
+  "templateName": "my-template.ftl", #Required
+  "dataModel": { #Optional
+      /* A multi-line
+         comment */
+      "myString": "a string",
+      "myNumber": 1,
+      "myListOfStrings": ["s1", "s2"],
+      "myListOfNumbers": [1, 2],
+      "myMap": {
+        "key1": "value1",
+        "key2": 2
+      }
+  }
+}
+```
+
+## Using POM Properties During Generation
+After parsing the JSON file, the plugin will add
+a `pomProperties` entry into the data model, which is a map itself, that contains the properties defined in the pom. Thus, your template can reference the pom property `my_property` using `${pomProperties.my_property}`. If you have a period or dash in the property name, use `${pomProperties["my.property"]}`.
+
+## FreeMarker Configuration
+
+Typically, users of this plugin do not need to mess with the FreeMarker configuration. This plugin explicitly sets two FreeMarker configurations:
+
+ 1. the default encoding is set to UTF-8
+ 2. the template loader is set to be a FileTemplateLoader that reads from `templateDirectory`.
+ 
+If you need to override these configs or set your own, you can put them in a 
+`<sourceDirectory>/freemarker.properties` file. If that file exists, this plugin will read it into a java Properties instance and pass it to freemarker.core.Configurable.setSettings() to establish the FreeMarker configuration. See this [javadoc](https://freemarker.apache.org/docs/api/freemarker/template/Configuration.html#setSetting-java.lang.String-java.lang.String-) for configuration details.
+
+
+## Incremental Builds
+This plugin supports incremental builds; it only generates sources if the generator file, template file, or pom file have timestamps newer than any existing output file.  To force a rebuild if these conditions are not met (for example, if you pass in a model parameter on the command line), first run `mvn clean`.
+
+# Code Coverage
+
+By default, the code coverage report is not generated. It is generated by screwdriver jobs. You can generate code coverage on your dev machine with the following maven command:
+```bash
+mvn clean initialize -Dclover-phase=initialize 
+``` 
+Bring up the coverage report by pointing your browser to target/site/clover/dashboard.html under the root directory of the local repository.
diff --git a/freemarker-generator-maven-plugin/pom.xml b/freemarker-generator-maven-plugin/pom.xml
new file mode 100644
index 0000000..2d19093
--- /dev/null
+++ b/freemarker-generator-maven-plugin/pom.xml
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.freemarker.generator</groupId>
+        <artifactId>freemarker-generator</artifactId>
+        <version>0.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>freemarker-generator-maven-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+
+    <name>Apache FreeMarker Generator: Maven Plugin</name>
+    <description>Maven plugin for Apache FreeMarker</description>
+
+    <properties>
+        <maven-core.version>3.5.2</maven-core.version>
+        <maven-plugin-api.version>3.5.2</maven-plugin-api.version>
+        <maven-plugin-annotations.version>3.5</maven-plugin-annotations.version>
+        <fastutil.version>8.1.0</fastutil.version>
+        <gson.version>2.8.6</gson.version>
+        <jmockit.version>1.32</jmockit.version>
+        <org.testng.version>6.8</org.testng.version>
+        <assertj-core.version>3.8.0</assertj-core.version>
+        <clover-target-percentage>100</clover-target-percentage>
+        <clover-phase>pre-site</clover-phase>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-core</artifactId>
+            <version>${maven-core.version}</version>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.codehaus.plexus</groupId>
+                    <artifactId>plexus-utils</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>${maven-plugin-api.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.plugin-tools</groupId>
+            <artifactId>maven-plugin-annotations</artifactId>
+            <version>${maven-plugin-annotations.version}</version>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.maven</groupId>
+                    <artifactId>maven-artifact</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.sisu</groupId>
+            <artifactId>org.eclipse.sisu.plexus</artifactId>
+            <version>0.3.3</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.codehaus.plexus</groupId>
+                    <artifactId>plexus-utils</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.jmockit</groupId>
+            <artifactId>jmockit</artifactId>
+            <version>${jmockit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>${org.testng.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-site-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <configuration>
+                    <goalPrefix>freemarker-generator</goalPrefix>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>default-descriptor</id>
+                        <goals>
+                            <goal>descriptor</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.openclover</groupId>
+                <artifactId>clover-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>clover</id>
+                        <phase>${clover-phase}</phase>
+                        <goals>
+                            <goal>instrument-test</goal>
+                            <goal>clover</goal>
+                            <goal>check</goal>
+                        </goals>
+                        <configuration>
+                            <targetPercentage>${clover-target-percentage}</targetPercentage>
+                            <generateHtml>true</generateHtml>
+                            <generateXml>true</generateXml>
+                            <jdk>${maven.compiler.source}</jdk>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>*.md</exclude>
+                        <excludde>**/*.json</excludde>
+                        <excludde>src/test/data/generating-file-visitor/data/mydir/bad-extension-test.txt</excludde>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </reporting>
+</project>
diff --git a/src/main/java/org/apache/freemarker/generator/FactoryUtil.java b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/FactoryUtil.java
similarity index 67%
rename from src/main/java/org/apache/freemarker/generator/FactoryUtil.java
rename to freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/FactoryUtil.java
index 359dd3f..a255d3f 100644
--- a/src/main/java/org/apache/freemarker/generator/FactoryUtil.java
+++ b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/FactoryUtil.java
@@ -17,34 +17,34 @@
  * under the License.
  */
 
-package org.apache.freemarker.generator;
+package org.apache.freemarker.generator.maven;
+
+import freemarker.template.Configuration;
+import freemarker.template.Version;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 
-import freemarker.template.Configuration;
-import freemarker.template.Version;
-
 /**
  * Simple utility class to call various constructors.
  * Needed because some jmockit features don't work well with constructors.
  */
 public class FactoryUtil {
 
-  public static Configuration createConfiguration(String freeMarkerVersion) {
-    return new Configuration(new Version(freeMarkerVersion));
-  }
+    public static Configuration createConfiguration(String freeMarkerVersion) {
+        return new Configuration(new Version(freeMarkerVersion));
+    }
 
-  public static File createFile(File parent, String child) {
-    return new File(parent, child);
-  }
+    public static File createFile(File parent, String child) {
+        return new File(parent, child);
+    }
 
-  public static FileInputStream createFileInputStream(File file) throws FileNotFoundException {
-    return new FileInputStream(file);
-  }
-  
-  public static File createFile(String name) {
-    return new File(name);
-  }
+    public static FileInputStream createFileInputStream(File file) throws FileNotFoundException {
+        return new FileInputStream(file);
+    }
+
+    public static File createFile(String name) {
+        return new File(name);
+    }
 }
diff --git a/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/FreeMarkerMojo.java b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/FreeMarkerMojo.java
new file mode 100644
index 0000000..4add19b
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/FreeMarkerMojo.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import freemarker.cache.FileTemplateLoader;
+import freemarker.template.Configuration;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecution;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+import java.io.File;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+@Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
+public class FreeMarkerMojo extends AbstractMojo {
+
+    /** FreeMarker version string used to build FreeMarker Configuration instance. */
+    @Parameter
+    private String freeMarkerVersion;
+
+    @Parameter(defaultValue = "src/main/freemarker/generator")
+    private File sourceDirectory;
+
+    @Parameter(defaultValue = "src/main/freemarker/generator/template")
+    private File templateDirectory;
+
+    @Parameter(defaultValue = "src/main/freemarker/generator/generator")
+    private File generatorDirectory;
+
+    @Parameter(defaultValue = "target/generated-sources/freemarker/generator")
+    private File outputDirectory;
+
+    @Parameter(defaultValue = "${session}", readonly = true)
+    private MavenSession session;
+
+    @Parameter(defaultValue = "${mojoExecution}", readonly = true)
+    private MojoExecution mojo;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+
+        if (freeMarkerVersion == null || freeMarkerVersion.isEmpty()) {
+            throw new MojoExecutionException("freeMarkerVersion is required");
+        }
+
+        if (!generatorDirectory.isDirectory()) {
+            throw new MojoExecutionException("Required directory does not exist: " + generatorDirectory);
+        }
+
+        final Configuration config = FactoryUtil.createConfiguration(freeMarkerVersion);
+
+        config.setDefaultEncoding("UTF-8");
+
+        if (!templateDirectory.isDirectory()) {
+            throw new MojoExecutionException("Required directory does not exist: " + templateDirectory);
+        }
+        try {
+            config.setTemplateLoader(new FileTemplateLoader(templateDirectory));
+        } catch (Throwable t) {
+            getLog().error("Could not establish file template loader for directory: " + templateDirectory, t);
+            throw new MojoExecutionException("Could not establish file template loader for directory: " + templateDirectory);
+        }
+
+        final File freeMarkerProps = FactoryUtil.createFile(sourceDirectory, "freemarker.properties");
+        if (freeMarkerProps.isFile()) {
+            final Properties configProperties = new Properties();
+            try (InputStream is = FactoryUtil.createFileInputStream(freeMarkerProps)) {
+                configProperties.load(is);
+            } catch (Throwable t) {
+                getLog().error("Failed to load " + freeMarkerProps, t);
+                throw new MojoExecutionException("Failed to load " + freeMarkerProps);
+            }
+            try {
+                config.setSettings(configProperties);
+            } catch (Throwable t) {
+                getLog().error("Invalid setting(s) in " + freeMarkerProps, t);
+                throw new MojoExecutionException("Invalid setting(s) in " + freeMarkerProps);
+            }
+        }
+
+        if ("generate-sources".equals(mojo.getLifecyclePhase())) {
+            session.getCurrentProject().addCompileSourceRoot(outputDirectory.toString());
+        } else if ("generate-test-sources".equals(mojo.getLifecyclePhase())) {
+            session.getCurrentProject().addTestCompileSourceRoot(outputDirectory.toString());
+        }
+
+        final Map<String, OutputGeneratorPropertiesProvider> extensionToBuilders = new HashMap<>(1);
+        extensionToBuilders.put(".json", JsonPropertiesProvider.create(generatorDirectory, templateDirectory, outputDirectory));
+
+        final GeneratingFileVisitor fileVisitor = GeneratingFileVisitor.create(config, session, extensionToBuilders);
+        try {
+            Files.walkFileTree(generatorDirectory.toPath(), fileVisitor);
+        } catch (Throwable t) {
+            getLog().error("Failed to process files in generator dir: " + generatorDirectory, t);
+            throw new MojoExecutionException("Failed to process files in generator dir: " + generatorDirectory);
+        }
+    }
+}
diff --git a/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/GeneratingFileVisitor.java b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/GeneratingFileVisitor.java
new file mode 100644
index 0000000..4ca3ce2
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/GeneratingFileVisitor.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import freemarker.template.Configuration;
+import org.apache.maven.execution.MavenSession;
+
+import java.nio.file.FileVisitResult;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Map;
+
+/**
+ * FileVisitor designed to process json data files. The json file parsed into
+ * a map and given to FreeMarker to
+ */
+public class GeneratingFileVisitor extends SimpleFileVisitor<Path> {
+
+    private final Configuration config;
+    private final MavenSession session;
+    private final long pomLastModifiedTimestamp;
+    private final Map<String, OutputGeneratorPropertiesProvider> extensionToBuilder;
+
+    private GeneratingFileVisitor(Configuration config, MavenSession session, Map<String, OutputGeneratorPropertiesProvider> extensionToBuilder) {
+        this.config = config;
+        this.session = session;
+        this.extensionToBuilder = extensionToBuilder;
+        this.pomLastModifiedTimestamp = session.getAllProjects().stream()
+                .map(project -> project.getFile().lastModified())
+                .reduce(Long::max)
+                .orElse(0L);
+    }
+
+    /**
+     * Factory method that calls constructor, added to facilitate testing with jmockit.
+     */
+    public static GeneratingFileVisitor create(Configuration config, MavenSession session, Map<String, OutputGeneratorPropertiesProvider> extensionToBuilder) {
+        return new GeneratingFileVisitor(config, session, extensionToBuilder);
+    }
+
+    @Override
+    public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) {
+        if (attrs.isRegularFile()) {
+            final OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder()
+                    .addGeneratorLocation(path)
+                    .addPomLastModifiedTimestamp(pomLastModifiedTimestamp);
+            final String fileName = path.getFileName().toString();
+            final String extenstion = fileName.substring(fileName.lastIndexOf('.'));
+            final OutputGeneratorPropertiesProvider pathProcessor = extensionToBuilder.get(extenstion);
+            if (pathProcessor == null) {
+                throw new RuntimeException("Unknown file extension: " + path);
+            }
+            pathProcessor.providePropertiesFromFile(path, builder);
+            builder.addToDataModel("session", session);
+            builder.addToDataModel("pomProperties", session.getCurrentProject().getProperties());
+            builder.create().generate(config);
+        }
+        return FileVisitResult.CONTINUE;
+    }
+}
diff --git a/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/JsonPropertiesProvider.java b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/JsonPropertiesProvider.java
new file mode 100644
index 0000000..f2e2cc4
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/JsonPropertiesProvider.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Type;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+public class JsonPropertiesProvider implements OutputGeneratorPropertiesProvider {
+    private final Gson gson;
+    private final Type stringObjectMap;
+    private final File dataDir;
+    private final File templateDir;
+    private final File outputDir;
+
+    private JsonPropertiesProvider(File dataDir, File templateDir, File outputDir) {
+        this.dataDir = dataDir;
+        this.templateDir = templateDir;
+        this.outputDir = outputDir;
+        this.gson = new GsonBuilder().setLenient().create();
+        this.stringObjectMap = new TypeToken<Map<String, Object>>() {}.getType();
+    }
+
+    public static JsonPropertiesProvider create(File dataDir, File templateDir, File outputDir) {
+        return new JsonPropertiesProvider(dataDir, templateDir, outputDir);
+    }
+
+    @Override
+    public void providePropertiesFromFile(Path path, OutputGenerator.OutputGeneratorBuilder builder) {
+        final File jsonDataFile = path.toFile();
+        final Map<String, Object> data = parseJson(jsonDataFile);
+
+        Object obj = data.get("dataModel");
+        if (obj != null) {
+            builder.addDataModel((Map<String, Object>) obj);
+        } else {
+            builder.addDataModel(new HashMap<>());
+        }
+
+        obj = data.get("templateName");
+        if (obj == null) {
+            throw new RuntimeException("Require json data property not found: templateName");
+        }
+        builder.addTemplateLocation(templateDir.toPath().resolve(obj.toString()));
+
+        final String dataDirName = dataDir.getAbsolutePath();
+        final String jsonFileName = jsonDataFile.getAbsolutePath();
+        if (!jsonFileName.startsWith(dataDirName)) {
+            throw new IllegalStateException("visitFile() given file not in sourceDirectory: " + jsonDataFile);
+        }
+
+        String outputFileName = jsonFileName.substring(dataDirName.length() + 1);
+        outputFileName = outputFileName.substring(0, outputFileName.length() - 5);
+        final Path outputPath = outputDir.toPath();
+        final Path resolved = outputPath.resolve(outputFileName);
+        builder.addOutputLocation(resolved);
+    }
+
+    private Map<String, Object> parseJson(File jsonDataFile) {
+        try (JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(jsonDataFile), UTF_8))) {
+            return gson.fromJson(reader, stringObjectMap);
+        } catch (Throwable t) {
+            throw new RuntimeException("Could not parse json data file: " + jsonDataFile, t);
+        }
+    }
+}
diff --git a/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/OutputGenerator.java b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/OutputGenerator.java
new file mode 100644
index 0000000..2ac3b4f
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/OutputGenerator.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Knows how to generate an output file given five things:
+ * <ul>
+ * <li>The latest update time of the <b>pom file(s)</b> for the project</li>
+ * <li>The location of the <b>generator file</b></li>
+ * <li>The location of the <b>template file</b></li>
+ * <li>The location of the <b>output file</b></li>
+ * <li>A <b>data model<b> used to fill out the template.</li>
+ * </ul>
+ * <p>Given these five pieces of information, the generator will generate a new output file, but only if any existing
+ * generated file is not newer than the inputs (pom, generator, and template).</p>
+ */
+class OutputGenerator {
+    public final long pomModifiedTimestamp;
+    public final Path generatorLocation;
+    public final Path templateLocation;
+    public final Path outputLocation;
+    public final Map<String, Object> dataModel;
+
+    private OutputGenerator(
+            long pomModifiedTimestamp,
+            Path generatorLocation,
+            Path templateLocation,
+            Path outputLocation,
+            Map<String, Object> dataModel) {
+        this.pomModifiedTimestamp = pomModifiedTimestamp;
+        this.generatorLocation = generatorLocation;
+        this.templateLocation = templateLocation;
+        this.outputLocation = outputLocation;
+        this.dataModel = dataModel;
+    }
+
+    /**
+     * Uses a fluent builder to make the code more legible in place.
+     * Also allows the output generator to be built from multiple locations in source by passing the builder.
+     *
+     * @return A new fluent builder for the OutputGenerator class.
+     */
+    public static OutputGeneratorBuilder builder() {
+        return new OutputGeneratorBuilder();
+    }
+
+    public static class OutputGeneratorBuilder {
+        private long pomModifiedTimestamp = Long.MAX_VALUE;
+        private Path generatorLocation = null;
+        private Path templateLocation = null;
+        private Path outputLocation = null;
+        private Map<String, Object> dataModel = null;
+
+        public OutputGeneratorBuilder addPomLastModifiedTimestamp(long pomModifiedTimestamp) {
+            this.pomModifiedTimestamp = pomModifiedTimestamp;
+            return this;
+        }
+
+        public OutputGeneratorBuilder addGeneratorLocation(Path generatorLocation) {
+            this.generatorLocation = generatorLocation;
+            return this;
+        }
+
+        public OutputGeneratorBuilder addTemplateLocation(Path templateLocation) {
+            this.templateLocation = templateLocation;
+            return this;
+        }
+
+        public OutputGeneratorBuilder addOutputLocation(Path outputLocation) {
+            this.outputLocation = outputLocation;
+            return this;
+        }
+
+        public OutputGeneratorBuilder addDataModel(Map<String, Object> dataModel) {
+            this.dataModel = dataModel;
+            return this;
+        }
+
+        public OutputGeneratorBuilder addToDataModel(String key, Object val) {
+            if (this.dataModel == null) {
+                this.dataModel = new HashMap<>(4);
+            }
+            this.dataModel.put(key, val);
+            return this;
+        }
+
+        /**
+         * @return A new output generator (which is immutable).
+         * @throws IllegalStateException if any of the parts of the OutputGenerator were not set.
+         */
+        public OutputGenerator create() {
+            if (pomModifiedTimestamp == Long.MAX_VALUE) {
+                throw new IllegalStateException("Must set the pomModifiedTimestamp");
+            }
+            if (generatorLocation == null) {
+                throw new IllegalStateException("Must set a non-null generatorLocation");
+            }
+            if (templateLocation == null) {
+                throw new IllegalStateException("Must set a non-null templateLocation");
+            }
+            if (outputLocation == null) {
+                throw new IllegalStateException("Must set a non-null outputLocation");
+            }
+            if (dataModel == null) {
+                throw new IllegalStateException("Must set a non-null dataModel");
+            }
+            return new OutputGenerator(pomModifiedTimestamp, generatorLocation, templateLocation, outputLocation, dataModel);
+        }
+    }
+
+    /**
+     * <p>Generates an output by applying the model to the template.</p>
+     * <p>Checks the ages of the inputs against an existing output file to early exit if there is no update.</p>
+     *
+     * @param config Used to load the template from the template name.
+     */
+    public void generate(Configuration config) {
+        //Use "createFile" for testing purposes only
+        final File outputFile = FactoryUtil.createFile(outputLocation.toFile().toString());
+        final File templateFile = templateLocation.toFile();
+        final File generatorFile = generatorLocation.toFile();
+        if (outputFile.exists()) {
+            //early exit only if the output file is newer than all files that contribute to its generation
+            if (outputFile.lastModified() > generatorFile.lastModified()
+                    && outputFile.lastModified() > templateFile.lastModified()
+                    && outputFile.lastModified() > pomModifiedTimestamp) {
+                return;
+            }
+        } else {
+            final File parentDir = outputFile.getParentFile();
+            if (parentDir.isFile()) {
+                throw new RuntimeException("Parent directory of output file is a file: " + parentDir.getAbsoluteFile());
+            }
+            parentDir.mkdirs();
+            if (!parentDir.isDirectory()) {
+                throw new RuntimeException("Could not create directory: " + parentDir.getAbsoluteFile());
+            }
+        }
+
+        final Template template;
+        try {
+            template = config.getTemplate(templateFile.getName());
+        } catch (Throwable t) {
+            throw new RuntimeException("Could not read template: " + templateFile.getName(), t);
+        }
+
+        try (FileWriter writer = new FileWriter(outputFile)) {
+            template.process(dataModel, writer);
+        } catch (Throwable t) {
+            throw new RuntimeException("Could not process template associated with data file: " + generatorLocation, t);
+        }
+    }
+}
diff --git a/src/main/java/org/apache/freemarker/generator/OutputGeneratorPropertiesProvider.java b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/OutputGeneratorPropertiesProvider.java
similarity index 61%
rename from src/main/java/org/apache/freemarker/generator/OutputGeneratorPropertiesProvider.java
rename to freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/OutputGeneratorPropertiesProvider.java
index 019373b..25b929b 100644
--- a/src/main/java/org/apache/freemarker/generator/OutputGeneratorPropertiesProvider.java
+++ b/freemarker-generator-maven-plugin/src/main/java/org/apache/freemarker/generator/maven/OutputGeneratorPropertiesProvider.java
@@ -17,16 +17,17 @@
  * under the License.
  */
 
-package org.apache.freemarker.generator;
+package org.apache.freemarker.generator.maven;
 
 import java.nio.file.Path;
 
 public interface OutputGeneratorPropertiesProvider {
-	/**
-	 * Must add three properties to the builder: the <b>templateLocation</b>, <b>outputLocation</b>, and <b>dataModel</b>
-	 * The <b>pom updated timestamp</b> and <b>generatorLocation</b> are added elsewhere.
-	 * @param path The path to the generator file, to be used to decide on the three properties above.
-	 * @param builder The builder to which to add the properties.
-	 */
-	public void providePropertiesFromFile(Path path, OutputGenerator.OutputGeneratorBuilder builder);
+    /**
+     * Must add three properties to the builder: the <b>templateLocation</b>, <b>outputLocation</b>, and <b>dataModel</b>
+     * The <b>pom updated timestamp</b> and <b>generatorLocation</b> are added elsewhere.
+     *
+     * @param path    The path to the generator file, to be used to decide on the three properties above.
+     * @param builder The builder to which to add the properties.
+     */
+    void providePropertiesFromFile(Path path, OutputGenerator.OutputGeneratorBuilder builder);
 }
diff --git a/src/test/data/freemarker-mojo/data/test.txt.json b/freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/data/test.txt.json
similarity index 100%
rename from src/test/data/freemarker-mojo/data/test.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/data/test.txt.json
diff --git a/freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/freemarker.properties b/freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/freemarker.properties
new file mode 100644
index 0000000..a7b8bc5
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/freemarker.properties
@@ -0,0 +1,20 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+# Test properties file used by FreeMarkerMojoTest to verify FreeMarkerMojo
+# passes these settings to the FreeMarker configuration.
+boolean_format: T,F
\ No newline at end of file
diff --git a/freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/template/test.ftl b/freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/template/test.ftl
new file mode 100644
index 0000000..897ba68
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/data/freemarker-mojo/template/test.ftl
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+This is a dummy test file. It is only here to make sure the directory exists.
\ No newline at end of file
diff --git a/src/test/data/generating-file-visitor/badPath/success-test.txt.json b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/badPath/success-test.txt.json
similarity index 100%
rename from src/test/data/generating-file-visitor/badPath/success-test.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/badPath/success-test.txt.json
diff --git a/src/test/data/generating-file-visitor/data/badParent/bad-parent-test.txt.json b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/badParent/bad-parent-test.txt.json
similarity index 100%
rename from src/test/data/generating-file-visitor/data/badParent/bad-parent-test.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/badParent/bad-parent-test.txt.json
diff --git a/src/test/data/generating-file-visitor/data/mydir/bad-extension-test.txt b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/bad-extension-test.txt
similarity index 100%
rename from src/test/data/generating-file-visitor/data/mydir/bad-extension-test.txt
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/bad-extension-test.txt
diff --git a/src/test/data/generating-file-visitor/data/mydir/bad-template-name.txt.json b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/bad-template-name.txt.json
similarity index 100%
rename from src/test/data/generating-file-visitor/data/mydir/bad-template-name.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/bad-template-name.txt.json
diff --git a/src/test/data/generating-file-visitor/data/mydir/missing-template-name.txt.json b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/missing-template-name.txt.json
similarity index 100%
rename from src/test/data/generating-file-visitor/data/mydir/missing-template-name.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/missing-template-name.txt.json
diff --git a/src/test/data/generating-file-visitor/data/mydir/missing-var-test.txt.json b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/missing-var-test.txt.json
similarity index 100%
rename from src/test/data/generating-file-visitor/data/mydir/missing-var-test.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/missing-var-test.txt.json
diff --git a/src/test/data/generating-file-visitor/data/mydir/success-test-2.txt.json b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/success-test-2.txt.json
similarity index 100%
rename from src/test/data/generating-file-visitor/data/mydir/success-test-2.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/success-test-2.txt.json
diff --git a/src/test/data/generating-file-visitor/data/mydir/success-test.txt.json b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/success-test.txt.json
similarity index 100%
rename from src/test/data/generating-file-visitor/data/mydir/success-test.txt.json
rename to freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/data/mydir/success-test.txt.json
diff --git a/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/template/test-pom-only.ftl b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/template/test-pom-only.ftl
new file mode 100644
index 0000000..d09f6df
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/template/test-pom-only.ftl
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+This is a test freemarker template. Test pom data: '${pomProperties.pomVar}'.
diff --git a/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/template/test.ftl b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/template/test.ftl
new file mode 100644
index 0000000..7f5c69b
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/data/generating-file-visitor/template/test.ftl
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+This is a test freemarker template. Test json data: '${testVar}'. Test pom data: '${pomProperties.pomVar}'.
\ No newline at end of file
diff --git a/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/FreeMarkerMojoTest.java b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/FreeMarkerMojoTest.java
new file mode 100644
index 0000000..f835c6a
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/FreeMarkerMojoTest.java
@@ -0,0 +1,358 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import freemarker.cache.FileTemplateLoader;
+import freemarker.cache.TemplateLoader;
+import freemarker.template.Configuration;
+import mockit.Deencapsulation;
+import mockit.Expectations;
+import mockit.Mocked;
+import mockit.Verifications;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.MojoExecution;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.project.MavenProject;
+import org.junit.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileVisitor;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.assertj.core.api.Assertions.*;
+
+public class FreeMarkerMojoTest extends Assert {
+
+    private static final File TEST_OUTPUT_DIR = new File("target/test-output/freemarker-mojo");
+    private static final String FREEMARKER_VERSION = "2.3.29";
+
+    @BeforeClass
+    public static void beforeClass() throws IOException {
+        // Clean output dir before each run.
+        if (TEST_OUTPUT_DIR.exists()) {
+            // Recursively delete output from previous run.
+            Files.walk(TEST_OUTPUT_DIR.toPath())
+                    .sorted(Comparator.reverseOrder())
+                    .map(Path::toFile)
+                    .forEach(File::delete);
+        }
+    }
+
+    @Test
+    public void executeTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked MojoExecution mojoExecution,
+            @Mocked GeneratingFileVisitor generatingFileVisitor,
+            @Mocked Files files
+    ) throws MojoExecutionException, MojoFailureException, IOException {
+
+        new Expectations(mojoExecution, generatingFileVisitor) {{
+            mojoExecution.getLifecyclePhase();
+            result = "generate-sources";
+            session.getCurrentProject();
+            result = project;
+        }};
+
+        FreeMarkerMojo mojo = new FreeMarkerMojo();
+
+        // Validate freeMarkerVersion is required.
+        assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+            mojo.execute();
+        }).withMessage("freeMarkerVersion is required");
+
+        Deencapsulation.setField(mojo, "freeMarkerVersion", "");
+        assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+            mojo.execute();
+        }).withMessage("freeMarkerVersion is required");
+
+        final File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "executeTest");
+        Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
+        Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
+        Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
+        Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
+        Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
+        Deencapsulation.setField(mojo, "mojo", mojoExecution);
+        Deencapsulation.setField(mojo, "session", session);
+
+        // Validate source directory.
+        assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+            mojo.execute();
+        }).withMessage("Required directory does not exist: target/test-output/freemarker-mojo/executeTest/data");
+
+        new File(testCaseOutputDir, "data").mkdirs();
+        assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+            mojo.execute();
+        }).withMessage("Required directory does not exist: target/test-output/freemarker-mojo/executeTest/template");
+        new File(testCaseOutputDir, "template").mkdirs();
+
+        // Validate minimum configuration.
+        mojo.execute();
+
+        new Verifications() {{
+            project.addCompileSourceRoot("target/test-output/freemarker-mojo/executeTest/generated-files");
+            times = 1;
+
+            Configuration config;
+            MavenSession capturedSession;
+            Map<String, OutputGeneratorPropertiesProvider> builders;
+
+            GeneratingFileVisitor.create(
+                    config = withCapture(),
+                    capturedSession = withCapture(),
+                    builders = withCapture());
+            times = 1;
+
+            assertEquals("UTF-8", config.getDefaultEncoding());
+            assertEquals(session, capturedSession);
+            TemplateLoader loader = config.getTemplateLoader();
+            assertTrue(loader instanceof FileTemplateLoader);
+
+            Path path;
+            FileVisitor<Path> fileVisitor;
+
+            Files.walkFileTree(path = withCapture(), fileVisitor = withCapture());
+            times = 1;
+
+            assertEquals(new File(testCaseOutputDir, "data").toPath(), path);
+            assertTrue(fileVisitor instanceof GeneratingFileVisitor);
+        }};
+    }
+
+    @Test
+    public void execute_generateTestSourceTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked MojoExecution mojoExecution,
+            @Mocked GeneratingFileVisitor generatingFileVisitor,
+            @Mocked Files files
+    ) throws MojoExecutionException, MojoFailureException, IOException {
+
+        new Expectations(mojoExecution, generatingFileVisitor) {{
+            mojoExecution.getLifecyclePhase();
+            result = "generate-test-sources";
+            session.getCurrentProject();
+            result = project;
+        }};
+
+        FreeMarkerMojo mojo = new FreeMarkerMojo();
+
+        File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "generateTestSourceTest");
+        Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
+        Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
+        Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
+        Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
+        Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
+        Deencapsulation.setField(mojo, "mojo", mojoExecution);
+        Deencapsulation.setField(mojo, "session", session);
+
+        new File(testCaseOutputDir, "data").mkdirs();
+        new File(testCaseOutputDir, "template").mkdirs();
+
+        mojo.execute();
+
+        new Verifications() {{
+            project.addTestCompileSourceRoot("target/test-output/freemarker-mojo/generateTestSourceTest/generated-files");
+            times = 1;
+        }};
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Test
+    public void execute_walkFileTreeExceptionTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked MojoExecution mojoExecution,
+            @Mocked GeneratingFileVisitor generatingFileVisitor,
+            @Mocked Files files
+    ) throws MojoExecutionException, MojoFailureException, IOException {
+
+        new Expectations(mojoExecution, generatingFileVisitor) {{
+            mojoExecution.getLifecyclePhase();
+            result = "generate-test-sources";
+            session.getCurrentProject();
+            result = project;
+            Files.walkFileTree((Path) any, (FileVisitor) any);
+            result = new RuntimeException("test exception");
+        }};
+
+        FreeMarkerMojo mojo = new FreeMarkerMojo();
+
+        File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "generateTestSourceTest");
+        Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
+        Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
+        Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
+        Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
+        Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
+        Deencapsulation.setField(mojo, "mojo", mojoExecution);
+        Deencapsulation.setField(mojo, "session", session);
+
+        new File(testCaseOutputDir, "data").mkdirs();
+        new File(testCaseOutputDir, "template").mkdirs();
+
+        assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+            mojo.execute();
+        })
+                .withMessage("Failed to process files in generator dir: target/test-output/freemarker-mojo/generateTestSourceTest/data");
+    }
+
+    @Test
+    public void execute_setTemplateLoaderExceptionTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked MojoExecution mojoExecution,
+            @Mocked FactoryUtil factoryUtil,
+            @Mocked Configuration config) {
+
+        new Expectations(config, FactoryUtil.class) {{
+            FactoryUtil.createConfiguration(FREEMARKER_VERSION);
+            result = config;
+            config.setTemplateLoader((TemplateLoader) any);
+            result = new RuntimeException("test exception");
+        }};
+
+        FreeMarkerMojo mojo = new FreeMarkerMojo();
+
+        File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "setTemplateLoaderException");
+
+        Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
+        Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
+        Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
+        Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
+        Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
+        Deencapsulation.setField(mojo, "mojo", mojoExecution);
+        Deencapsulation.setField(mojo, "session", session);
+
+        new File(testCaseOutputDir, "data").mkdirs();
+        new File(testCaseOutputDir, "template").mkdirs();
+
+        assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+            mojo.execute();
+        })
+                .withMessage("Could not establish file template loader for directory: target/test-output/freemarker-mojo/setTemplateLoaderException/template");
+    }
+
+    @Test
+    public void execute_loadFreemarkerPropertiesTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked MojoExecution mojoExecution,
+            @Mocked Configuration config) throws Exception {
+
+        FreeMarkerMojo mojo = new FreeMarkerMojo();
+
+        File sourceDirectory = new File("src/test/data/freemarker-mojo");
+        File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "loadFreemarkerProperties");
+
+        Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
+        Deencapsulation.setField(mojo, "sourceDirectory", sourceDirectory);
+        Deencapsulation.setField(mojo, "templateDirectory", new File(sourceDirectory, "template"));
+        Deencapsulation.setField(mojo, "generatorDirectory", new File(sourceDirectory, "data"));
+        Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
+        Deencapsulation.setField(mojo, "mojo", mojoExecution);
+        Deencapsulation.setField(mojo, "session", session);
+
+        mojo.execute();
+
+        new Verifications() {{
+            Properties properties;
+
+            config.setSettings(properties = withCapture());
+            times = 1;
+
+            assertEquals("T,F", properties.getProperty("boolean_format"));
+        }};
+    }
+
+    @Test
+    public void execute_loadFreemarkerPropertiesExceptionTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked MojoExecution mojoExecution,
+            @Mocked FactoryUtil factoryUtil,
+            @Mocked Configuration config) throws Exception {
+
+        new Expectations(FactoryUtil.class) {{
+            FactoryUtil.createFileInputStream((File) any);
+            result = new RuntimeException("test exception");
+        }};
+
+        FreeMarkerMojo mojo = new FreeMarkerMojo();
+
+        File sourceDirectory = new File("src/test/data/freemarker-mojo");
+        File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "loadFreemarkerPropertiesExceptionTest");
+
+        Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
+        Deencapsulation.setField(mojo, "sourceDirectory", sourceDirectory);
+        Deencapsulation.setField(mojo, "templateDirectory", new File(sourceDirectory, "template"));
+        Deencapsulation.setField(mojo, "generatorDirectory", new File(sourceDirectory, "data"));
+        Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
+        Deencapsulation.setField(mojo, "mojo", mojoExecution);
+        Deencapsulation.setField(mojo, "session", session);
+
+        System.out.println("==== before mojo execute");
+        try {
+            assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+                mojo.execute();
+            }).withMessage("Failed to load src/test/data/freemarker-mojo/freemarker.properties");
+        } catch (Throwable t) {
+            t.printStackTrace();
+        }
+    }
+
+    @Test
+    public void execute_setSettingsExceptionTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked MojoExecution mojoExecution,
+            @Mocked Configuration config) throws Exception {
+
+        new Expectations() {{
+            config.setSettings((Properties) any);
+            result = new RuntimeException("test exception");
+        }};
+
+        FreeMarkerMojo mojo = new FreeMarkerMojo();
+
+        File sourceDirectory = new File("src/test/data/freemarker-mojo");
+        File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "loadFreemarkerProperties");
+
+        Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
+        Deencapsulation.setField(mojo, "sourceDirectory", sourceDirectory);
+        Deencapsulation.setField(mojo, "templateDirectory", new File(sourceDirectory, "template"));
+        Deencapsulation.setField(mojo, "generatorDirectory", new File(sourceDirectory, "data"));
+        Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
+        Deencapsulation.setField(mojo, "mojo", mojoExecution);
+        Deencapsulation.setField(mojo, "session", session);
+
+        assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
+            mojo.execute();
+        }).withMessage("Invalid setting(s) in src/test/data/freemarker-mojo/freemarker.properties");
+    }
+
+}
diff --git a/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/GeneratingFileVisitorTest.java b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/GeneratingFileVisitorTest.java
new file mode 100644
index 0000000..d2c9803
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/GeneratingFileVisitorTest.java
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import freemarker.cache.FileTemplateLoader;
+import freemarker.template.Configuration;
+import mockit.Expectations;
+import mockit.Mocked;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.junit.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.assertj.core.api.Assertions.*;
+
+public class GeneratingFileVisitorTest extends Assert {
+
+    private static File testDir = new File("src/test/data/generating-file-visitor");
+    private static File dataDir = new File(testDir, "data");
+    private static File templateDir = new File(testDir, "template");
+    private static File outputDir = new File("target/test-output/generating-file-visitor");
+    private static Map<String, OutputGeneratorPropertiesProvider> builders = new HashMap<>();
+    private Configuration config;
+    private Properties pomProperties = new Properties();
+
+    @BeforeClass
+    public static void beforeClass() throws IOException {
+        builders.put(".json", JsonPropertiesProvider.create(dataDir, templateDir, outputDir));
+        // Clean output dir before each run.
+        File outputDir = new File("target/test-output/generating-file-visitor");
+        if (outputDir.exists()) {
+            // Recursively delete output from previous run.
+            Files.walk(outputDir.toPath())
+                    .sorted(Comparator.reverseOrder())
+                    .map(Path::toFile)
+                    .forEach(File::delete);
+        }
+    }
+
+    @BeforeMethod
+    public void before() throws IOException {
+        if (!testDir.isDirectory()) {
+            throw new RuntimeException("Can't find required test data directory. "
+                    + "If running test outside of maven, make sure working directory is the project directory. "
+                    + "Looking for: " + testDir);
+        }
+
+        config = new Configuration(Configuration.VERSION_2_3_23);
+        config.setDefaultEncoding("UTF-8");
+        config.setTemplateLoader(new FileTemplateLoader(templateDir));
+        pomProperties.put("pomVar", "pom value");
+    }
+
+    @Test
+    public void functionalHappyPathTestNoDataModel(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked File mockFile,
+            @Mocked BasicFileAttributes attrs) throws IOException {
+        List<MavenProject> projects = new ArrayList<>();
+        projects.add(project);
+        new Expectations(session, project, mockFile) {{
+            session.getCurrentProject();
+            result = project;
+            session.getAllProjects();
+            result = projects;
+            project.getProperties();
+            result = pomProperties;
+            attrs.isRegularFile();
+            result = true;
+            project.getFile();
+            result = mockFile;
+            mockFile.lastModified();
+            result = 10;
+        }};
+
+        File file = new File(dataDir, "mydir/success-test-2.txt.json");
+        GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
+        assertEquals(FileVisitResult.CONTINUE, gfv.visitFile(file.toPath(), attrs));
+
+        File outputFile = new File(outputDir, "mydir/success-test-2.txt");
+        assertTrue(outputFile.isFile());
+        List<String> lines = Files.readAllLines(outputFile.toPath(), StandardCharsets.UTF_8);
+        assertEquals(17, lines.size());
+        assertEquals("This is a test freemarker template. Test pom data: 'pom value'.", lines.get(16));
+    }
+
+    @Test
+    public void functionalHappyPathTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked File mockFile,
+            @Mocked BasicFileAttributes attrs) throws IOException {
+        List<MavenProject> projects = new ArrayList<>();
+        projects.add(project);
+        new Expectations(session, project, mockFile) {{
+            session.getCurrentProject();
+            result = project;
+            session.getAllProjects();
+            result = projects;
+            project.getProperties();
+            result = pomProperties;
+            attrs.isRegularFile();
+            result = true;
+            project.getFile();
+            result = mockFile;
+            mockFile.lastModified();
+            result = 10;
+        }};
+
+        File file = new File(dataDir, "mydir/success-test.txt.json");
+        GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
+        assertEquals(FileVisitResult.CONTINUE, gfv.visitFile(file.toPath(), attrs));
+
+        File outputFile = new File(outputDir, "mydir/success-test.txt");
+        assertTrue(outputFile.isFile());
+        List<String> lines = Files.readAllLines(outputFile.toPath(), StandardCharsets.UTF_8);
+        assertEquals(17, lines.size());
+        assertEquals("This is a test freemarker template. Test json data: 'test value'. Test pom data: 'pom value'.", lines
+                .get(16));
+    }
+
+    @Test
+    public void visitFile_badExtensionTest(
+            @Mocked MavenSession session,
+            @Mocked MavenProject project,
+            @Mocked File mockFile,
+            @Mocked BasicFileAttributes attrs) throws IOException {
+        List<MavenProject> projects = new ArrayList<>();
+        projects.add(project);
+        new Expectations(session, project, mockFile) {{
+            attrs.isRegularFile();
+            result = true;
+            session.getAllProjects();
+            result = projects;
+            project.getFile();
+            result = mockFile;
+            mockFile.lastModified();
+            result = 10;
+        }};
+        // Test file without .json suffix.
+        File file = new File(dataDir, "mydir/bad-extension-test.txt");
+        GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
+        assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
+            gfv.visitFile(file.toPath(), attrs);
+        }).withMessage("Unknown file extension: " + file.toPath());
+    }
+
+    @Test
+    public void visitFile_notRegularFileTest(@Mocked MavenSession session,
+                                             @Mocked MavenProject project,
+                                             @Mocked BasicFileAttributes attrs,
+                                             @Mocked File mockFile
+    ) {
+        List<MavenProject> projects = new ArrayList<>();
+        projects.add(project);
+        new Expectations(session, project, mockFile) {{
+            attrs.isRegularFile();
+            result = false;
+            session.getAllProjects();
+            result = projects;
+            project.getFile();
+            result = mockFile;
+            mockFile.lastModified();
+            result = 10;
+        }};
+        // FYI: if you change above result to true, test will fail trying to read the 'mydir' directory
+        // as a json file.
+        File dir = new File(dataDir, "mydir");
+        GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
+        assertEquals(FileVisitResult.CONTINUE, gfv.visitFile(dir.toPath(), attrs));
+    }
+}
diff --git a/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/JsonPropertiesProviderTest.java b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/JsonPropertiesProviderTest.java
new file mode 100644
index 0000000..88d8fc6
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/JsonPropertiesProviderTest.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import com.google.gson.Gson;
+import com.google.gson.stream.JsonReader;
+import mockit.Expectations;
+import mockit.Mocked;
+import mockit.Verifications;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.lang.reflect.Type;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.assertj.core.api.AssertionsForClassTypes.*;
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
+
+public class JsonPropertiesProviderTest {
+    private File testDir = new File("src/test/data/generating-file-visitor");
+    private File dataDir = new File(testDir, "data");
+    private File templateDir = new File(testDir, "template");
+    private File outputDir = new File("target/test-output/generating-file-visitor");
+
+    @Test
+    public void testSuccess(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
+        Path path = dataDir.toPath().resolve("mydir/success-test.txt.json");
+        Path expectedTemplateLocation = templateDir.toPath().resolve("test.ftl");
+        Path expectedOutputLocation = outputDir.toPath().resolve("mydir/success-test.txt");
+        Map<String, Object> expectedMap = new HashMap<>(4);
+        expectedMap.put("testVar", "test value");
+        JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
+        toTest.providePropertiesFromFile(path, builder);
+        new Verifications() {{
+            Path templateLocation;
+            builder.addTemplateLocation(templateLocation = withCapture());
+            Path outputLocation;
+            builder.addOutputLocation(outputLocation = withCapture());
+            Map<String, Object> actualMap;
+            builder.addDataModel(actualMap = withCapture());
+
+            assertEquals(expectedTemplateLocation, templateLocation);
+            assertEquals(expectedOutputLocation, outputLocation);
+            assertArrayEquals(expectedMap.entrySet().toArray(), actualMap.entrySet().toArray());
+        }};
+    }
+
+    @Test
+    public void testSuccessNoDataModel(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
+        Path path = dataDir.toPath().resolve("mydir/success-test-2.txt.json");
+        Path expectedTemplateLocation = templateDir.toPath().resolve("test-pom-only.ftl");
+        Path expectedOutputLocation = outputDir.toPath().resolve("mydir/success-test-2.txt");
+        Map<String, Object> expectedMap = new HashMap<>(4);
+        JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
+        toTest.providePropertiesFromFile(path, builder);
+        new Verifications() {{
+            Path templateLocation;
+            builder.addTemplateLocation(templateLocation = withCapture());
+            Path outputLocation;
+            builder.addOutputLocation(outputLocation = withCapture());
+            Map<String, Object> actualMap;
+            builder.addDataModel(actualMap = withCapture());
+
+            assertEquals(expectedTemplateLocation, templateLocation);
+            assertEquals(expectedOutputLocation, outputLocation);
+            assertArrayEquals(expectedMap.entrySet().toArray(), actualMap.entrySet().toArray());
+        }};
+    }
+
+    @Test
+    public void testParsingException(@Mocked OutputGenerator.OutputGeneratorBuilder builder, @Mocked Gson gson) {
+        Path path = dataDir.toPath().resolve("mydir/success-test.txt.json");
+        new Expectations() {{
+            gson.fromJson((JsonReader) any, (Type) any);
+            result = new RuntimeException("test exception");
+        }};
+        JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
+
+        assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
+            toTest.providePropertiesFromFile(path, builder);
+        })
+                .withMessage("Could not parse json data file: src/test/data/generating-file-visitor/data/mydir/success-test.txt.json");
+    }
+
+    @Test
+    public void testMissingTemplateName(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
+        Path path = dataDir.toPath().resolve("mydir/missing-template-name.txt.json");
+        JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
+
+        assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
+            toTest.providePropertiesFromFile(path, builder);
+        }).withMessage("Require json data property not found: templateName");
+    }
+
+    @Test
+    public void testBadPath(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
+        Path path = testDir.toPath().resolve("badPath/success-test.txt.json");
+        JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            toTest.providePropertiesFromFile(path, builder);
+        })
+                .withMessage("visitFile() given file not in sourceDirectory: src/test/data/generating-file-visitor/badPath/success-test.txt.json");
+    }
+}
diff --git a/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/OutputGeneratorTest.java b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/OutputGeneratorTest.java
new file mode 100644
index 0000000..a88592f
--- /dev/null
+++ b/freemarker-generator-maven-plugin/src/test/java/org/apache/freemarker/generator/maven/OutputGeneratorTest.java
@@ -0,0 +1,305 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.generator.maven;
+
+import freemarker.cache.FileTemplateLoader;
+import freemarker.template.Configuration;
+import mockit.Expectations;
+import mockit.Mocked;
+import org.assertj.core.api.*;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static junit.framework.Assert.assertEquals;
+import static org.assertj.core.api.AssertionsForClassTypes.*;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+
+public class OutputGeneratorTest {
+
+    private File testDir = new File("src/test/data/generating-file-visitor");
+    private File dataDir = new File(testDir, "data");
+    private File templateDir = new File(testDir, "template");
+    private File outputDir = new File("target/test-output/generating-file-visitor");
+    private Configuration config;
+    private Map<String, Object> dataModel = new HashMap<String, Object>();
+
+    @BeforeMethod
+    public void setupDataModel() {
+        dataModel.clear();
+        dataModel.put("testVar", "test value");
+        dataModel.put("pomProperties", new HashMap<String, String>());
+        ((Map<String, String>) dataModel.get("pomProperties")).put("pomVar", "pom value");
+    }
+
+    @BeforeClass
+    public static void cleanFields() throws IOException {
+        // Clean output dir before each run.
+        File outputDir = new File("target/test-output/generating-file-visitor");
+        if (outputDir.exists()) {
+            // Recursively delete output from previous run.
+            Files.walk(outputDir.toPath())
+                    .sorted(Comparator.reverseOrder())
+                    .map(Path::toFile)
+                    .forEach(File::delete);
+        }
+    }
+
+    @BeforeMethod
+    public void before() throws IOException {
+        if (!testDir.isDirectory()) {
+            throw new RuntimeException("Can't find required test data directory. "
+                    + "If running test outside of maven, make sure working directory is the project directory. "
+                    + "Looking for: " + testDir);
+        }
+
+        config = new Configuration(Configuration.VERSION_2_3_23);
+        config.setDefaultEncoding("UTF-8");
+        config.setTemplateLoader(new FileTemplateLoader(templateDir));
+    }
+
+    @Test
+    public void createTest() {
+        OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set the pomModifiedTimestamp");
+
+        builder.addPomLastModifiedTimestamp(0);
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null generatorLocation");
+
+        File file = new File(dataDir, "mydir/success-test.txt.json");
+        builder.addGeneratorLocation(file.toPath());
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null templateLocation");
+
+        File templateFile = new File(templateDir, "test.ftl");
+        builder.addTemplateLocation(templateFile.toPath());
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null outputLocation");
+
+        File outputFile = new File(outputDir, "mydir/success-test.txt");
+        builder.addOutputLocation(outputFile.toPath());
+
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null dataModel");
+
+        builder.addDataModel(dataModel);
+        OutputGenerator generator = builder.create();
+
+        assertEquals(0, generator.pomModifiedTimestamp);
+        assertEquals(file.toPath(), generator.generatorLocation);
+        assertEquals(templateFile.toPath(), generator.templateLocation);
+        assertEquals(outputFile.toPath(), generator.outputLocation);
+        assertEquals(dataModel.size(), generator.dataModel.size());
+        assertArrayEquals(dataModel.entrySet().toArray(), generator.dataModel.entrySet().toArray());
+    }
+
+    @Test
+    public void addToDataModelTest() {
+        OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set the pomModifiedTimestamp");
+
+        builder.addPomLastModifiedTimestamp(0);
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null generatorLocation");
+
+        File file = new File(dataDir, "mydir/success-test.txt.json");
+        builder.addGeneratorLocation(file.toPath());
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null templateLocation");
+
+        File templateFile = new File(templateDir, "test.ftl");
+        builder.addTemplateLocation(templateFile.toPath());
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null outputLocation");
+
+        File outputFile = new File(outputDir, "mydir/success-test.txt");
+        builder.addOutputLocation(outputFile.toPath());
+
+        assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
+            builder.create();
+        }).withMessage("Must set a non-null dataModel");
+
+        builder.addToDataModel("testVar", "testVal");
+        OutputGenerator generator = builder.create();
+
+        assertEquals(1, generator.dataModel.size());
+        assertEquals("testVal", generator.dataModel.get("testVar"));
+
+        builder.addDataModel(dataModel);
+        builder.addToDataModel("testVar2", "testVal2");
+
+        generator = builder.create();
+
+        assertEquals(3, generator.dataModel.size());
+        assertEquals("test value", generator.dataModel.get("testVar"));
+        assertEquals("testVal2", generator.dataModel.get("testVar2"));
+    }
+
+    @Test
+    public void generate_SuccessTest()
+            throws IOException {
+        OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
+        builder.addPomLastModifiedTimestamp(0);
+        File file = new File(dataDir, "mydir/success-test.txt.json");
+        builder.addGeneratorLocation(file.toPath());
+        File outputFile = new File(outputDir, "mydir/success-test.txt");
+        builder.addOutputLocation(outputFile.toPath());
+        File templateFile = new File(templateDir, "test.ftl");
+        builder.addTemplateLocation(templateFile.toPath());
+        builder.addDataModel(dataModel);
+        OutputGenerator generator = builder.create();
+        generator.generate(config);
+
+        assertTrue(outputFile.isFile());
+        List<String> lines = Files.readAllLines(outputFile.toPath(), StandardCharsets.UTF_8);
+        assertEquals(17, lines.size());
+        assertEquals("This is a test freemarker template. Test json data: 'test value'. Test pom data: 'pom value'.", lines
+                .get(16));
+
+        // Process same file again, should not regenerate file.
+        long lastMod = outputFile.lastModified();
+        generator.generate(config);
+        assertEquals(lastMod, outputFile.lastModified());
+
+        // Set mod time to before json file.
+        lastMod = file.lastModified() - 1000; // File system may only keep 1 second precision.
+        outputFile.setLastModified(lastMod);
+        generator.generate(config);
+        assertTrue(lastMod < outputFile.lastModified());
+
+        // Set mod time to before template file.
+        lastMod = templateFile.lastModified() - 1000; // File system may only keep 1 second precision.
+        outputFile.setLastModified(lastMod);
+        generator.generate(config);
+        assertTrue(lastMod < outputFile.lastModified());
+    }
+
+    @Test
+    public void generate_badTemplateNameTest() {
+        OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
+        builder.addPomLastModifiedTimestamp(0);
+        File file = new File(dataDir, "mydir/bad-template-name.txt.json");
+        builder.addGeneratorLocation(file.toPath());
+        File outputFile = new File(outputDir, "mydir/bad-template-name.txt");
+        builder.addOutputLocation(outputFile.toPath());
+        File templateFile = new File(templateDir, "missing.ftl"); //this doesn't exist
+        builder.addTemplateLocation(templateFile.toPath());
+        builder.addDataModel(dataModel);
+        OutputGenerator generator = builder.create();
+        Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
+            generator.generate(config);
+        }).withMessage("Could not read template: missing.ftl");
+    }
+
+    @Test
+    public void generate_missingVarTest() {
+        OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
+        builder.addPomLastModifiedTimestamp(0);
+        File file = new File(dataDir, "mydir/missing-var-test.txt.json");
+        builder.addGeneratorLocation(file.toPath());
+        File outputFile = new File(outputDir, "mydir/missing-var-test.txt");
+        builder.addOutputLocation(outputFile.toPath());
+        File templateFile = new File(templateDir, "test.ftl"); //this is missing a
+        builder.addTemplateLocation(templateFile.toPath());
+        dataModel.remove("testVar");
+        builder.addDataModel(dataModel);
+        OutputGenerator generator = builder.create();
+        Assertions.assertThatExceptionOfType(RuntimeException.class)
+                .isThrownBy(() -> {
+                    generator.generate(config);
+                })
+                .withMessage("Could not process template associated with data file: src/test/data/generating-file-visitor/data/mydir/missing-var-test.txt.json");
+    }
+
+    @Test
+    public void generate_badParentTest() throws IOException {
+        OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
+        builder.addPomLastModifiedTimestamp(0);
+        File file = new File(dataDir, "badParent/bad-parent-test.txt.json");
+        builder.addGeneratorLocation(file.toPath());
+        File outputFile = new File(outputDir, "badParent/bad-parent-test.txt");
+        builder.addOutputLocation(outputFile.toPath());
+        File templateFile = new File(templateDir, "test.ftl"); //this is missing a
+        builder.addTemplateLocation(templateFile.toPath());
+        builder.addDataModel(dataModel);
+        OutputGenerator generator = builder.create();
+        outputDir.mkdirs();
+        outputFile.getParentFile().createNewFile();
+
+        Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
+            generator.generate(config);
+        }).withMessage("Parent directory of output file is a file: " + outputFile.getParentFile().getAbsolutePath());
+    }
+
+    @Test
+    public void generate_cantCreateOutputFileParentDirTest(
+            @Mocked FactoryUtil factoryUtil,
+            @Mocked File mockOutputFile) throws IOException {
+
+        File parentDir = new File("target/test-output/generating-file-visitor/mydir");
+        new Expectations(mockOutputFile, parentDir) {{
+            FactoryUtil.createFile(anyString);
+            result = mockOutputFile;
+            mockOutputFile.exists();
+            result = false;
+            mockOutputFile.getParentFile();
+            result = parentDir;
+            parentDir.isDirectory();
+            result = false;
+        }};
+
+        OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
+        builder.addPomLastModifiedTimestamp(0);
+        File file = new File(dataDir, "mydir/missing-var-test.txt.json");
+        builder.addGeneratorLocation(file.toPath());
+        File outputFile = new File(outputDir, "mydir/missing-var-test.txt");
+        builder.addOutputLocation(outputFile.toPath());
+        File templateFile = new File(templateDir, "test.ftl"); //this is missing a
+        builder.addTemplateLocation(templateFile.toPath());
+        builder.addDataModel(dataModel);
+        OutputGenerator generator = builder.create();
+        Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
+            generator.generate(config);
+        }).withMessage("Could not create directory: " + parentDir.getAbsoluteFile().toString());
+    }
+}
diff --git a/freemarker-generator-tools/LICENSE b/freemarker-generator-tools/LICENSE
new file mode 100644
index 0000000..1121eba
--- /dev/null
+++ b/freemarker-generator-tools/LICENSE
@@ -0,0 +1,223 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================
+
+The source code contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
+
+  src/main/misc/overloadedNumberRules/prices.ods
+  src/manual/en_US/docgen-originals/figures/overview.odg
+  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
+  src/manual/en_US/favicon.png
+  src/manual/en_US/figures/model2sketch.png
+  src/manual/en_US/figures/overview.png
+  src/manual/en_US/figures/tree.png
+  src/manual/en_US/logo.png
+  src/manual/zh_CN/favicon.png
+  src/manual/zh_CN/figures/model2sketch.png
+  src/manual/zh_CN/figures/overview.png
+  src/manual/zh_CN/figures/tree.png
+  src/manual/zh_CN/logo.png
diff --git a/freemarker-generator-tools/NOTICE b/freemarker-generator-tools/NOTICE
new file mode 100644
index 0000000..c27f50e
--- /dev/null
+++ b/freemarker-generator-tools/NOTICE
@@ -0,0 +1,5 @@
+Apache FreeMarker Site
+Copyright 2020 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/freemarker-generator-tools/README.md b/freemarker-generator-tools/README.md
new file mode 100644
index 0000000..12d1c61
--- /dev/null
+++ b/freemarker-generator-tools/README.md
@@ -0,0 +1,35 @@
+Apache FreeMarker Generator Tools
+=============================================================================
+
+A "tool" is just a POJO (plain old java object) that is "useful" in a template and is not meant to be rendered in the output. 
+
+Design Considerations
+------------------------------------------------------------------------------
+
+* A tool shall expose a default constructor and/or a constructor taking a `Map<String, Object> settings`
+* A tool processing documents shall provide a `parse(Document document)` method
+* A tool shall be stateless, multi-thread safe and potentially long-lived to enable usage in a different context
+* A tool shall support arbitrary large source documents and process them efficiently
+* A tool shall expose a `toString()` method for documentation purposes
+
+Available Tools
+------------------------------------------------------------------------------
+
+The following tools are currently provided
+
+| Helper                | Description                                                                                               |
+|-----------------------|-----------------------------------------------------------------------------------------------------------|
+| CSVTool               | Process CSV files using [Apache Commons CSV](https://commons.apache.org/proper/commons-csv/)              |
+| ExecTool              | Execute command line tools using [Apache Commons Exec](https://commons.apache.org/proper/commons-exec/)   |
+| ExcelTool             | Process Excels files (XLS, XLSX) using [Apache POI](https://poi.apache.org)                               |
+| FreeMarkerTool        | Expose useful Apache FreeMarker classes                                                                   |
+| GrokTool              | Process text files using [Grok](https://github.com/thekrakken/java-grok) expressions                      |
+| JsonPathTool          | Process JSON files using [Java JSON Path](https://github.com/json-path/JsonPath)                          |
+| JsoupTool             | Process  HTML files using [Jsoup](https://jsoup.org)                                                      |
+| PropertiesTool        | Process JDK properties files                                                                              |
+| SystemTool            | Expose System-related utility methods                                                                     |
+| XmlTool               | Process XML files using [Apache FreeMarker](https://freemarker.apache.org/docs/xgui.html)                 |
+| YamlTool              | Process YAML files using [SnakeYAML](https://bitbucket.org/asomov/snakeyaml/wiki/Home)                    |
+| UUIDTool              | Create UUIDs                                                                                              |
+
+
diff --git a/freemarker-generator-tools/pom.xml b/freemarker-generator-tools/pom.xml
new file mode 100644
index 0000000..32fa5b7
--- /dev/null
+++ b/freemarker-generator-tools/pom.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.freemarker.generator</groupId>
+        <artifactId>freemarker-generator</artifactId>
+        <version>0.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>freemarker-generator-tools</artifactId>
+    <name>Apache FreeMarker Generator: Tools</name>
+    <description>Document processing tools for Apache FreeMarker Generator</description>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <apache.poi.version>4.1.1</apache.poi.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.freemarker.generator</groupId>
+            <artifactId>freemarker-generator-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.krakens</groupId>
+            <artifactId>java-grok</artifactId>
+            <version>0.1.9</version>
+        </dependency>
+        <dependency>
+            <groupId>com.jayway.jsonpath</groupId>
+            <artifactId>json-path</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>info.picocli</groupId>
+            <artifactId>picocli</artifactId>
+            <version>4.1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.activation</groupId>
+            <artifactId>activation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.12.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>1.25</version>
+        </dependency>
+        <!-- Apache libraries -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-exec</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-csv</artifactId>
+            <version>1.8</version>
+        </dependency>
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+        </dependency>
+        <!-- Apache POI -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${apache.poi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${apache.poi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>${apache.poi.version}</version>
+        </dependency>
+        <!-- Testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>*.md</exclude>
+                        <exclude>**/*.csv</exclude>
+                        <exclude>src/main/resources/patterns/*</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </reporting>
+</project>
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
new file mode 100644
index 0000000..da7779a
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
@@ -0,0 +1,278 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.commonscsv;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.apache.commons.io.input.BOMInputStream;
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.util.StringUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+import static org.apache.commons.io.IOUtils.toInputStream;
+
+public class CommonsCSVTool {
+
+    public CSVParser parse(Document document) {
+        return parse(document, CSVFormat.DEFAULT);
+    }
+
+    public CSVParser parse(Document document, CSVFormat format) {
+        if (document == null) {
+            throw new IllegalArgumentException("No document was provided");
+        }
+
+        try {
+            // As stated in the documentation : "If you do not read all records from the given {@code reader},
+            // you should call {@link #close()} on the parser, unless you close the {@code reader}."
+            // The underlying input stream is closed by the document by its "CloseableReaper".
+            final InputStream is = new BOMInputStream(document.getInputStream(), false);
+            return parse(is, document.getCharset(), format);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse CSV: " + document, e);
+        }
+    }
+
+    public CSVParser parse(String csv, CSVFormat format) {
+        if (StringUtils.isEmpty(csv)) {
+            throw new IllegalArgumentException("No CSV was provided");
+        }
+
+        try {
+            // We don't need to close the underyling ByteArrayInputStream
+            return parse(toInputStream(csv, UTF_8), UTF_8, format);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse CSV", e);
+        }
+    }
+
+    public Map<String, CSVFormat> getFormats() {
+        return createCSVFormats();
+    }
+
+    /**
+     * Get a CSVPrinter using the FreeMarker's writer instance.
+     *
+     * @param csvFormat CSV format to use for writing records
+     * @param writer    Writer to receive the CSV output
+     * @return CSVPrinter instance
+     * @throws IOException thrown if the parameters of the format are inconsistent or if either out or format are null.
+     */
+    public CSVPrinter printer(CSVFormat csvFormat, Writer writer) throws IOException {
+        // We do not close the CSVPrinter but the underlying writer at the of processing
+        return new CSVPrinter(writer, csvFormat);
+    }
+
+    /**
+     * Extract the list of unique values (keys) of the column "name".
+     *
+     * @param records records to process
+     * @param name    column name to process
+     * @return unique keys
+     */
+    public List<String> toKeys(Collection<CSVRecord> records, String name) {
+        return toKeys(records, new ValueResolver(name));
+    }
+
+    /**
+     * Extract the list of unique values (keys) of the column with the given index..
+     *
+     * @param records records to process
+     * @param index   column index to map
+     * @return unique keys
+     */
+    public List<String> toKeys(Collection<CSVRecord> records, Integer index) {
+        return toKeys(records, new ValueResolver(index));
+    }
+
+    /**
+     * Map the given value of the CVS record into (key to record). If duplicates
+     * are encountered return the first occurence of the CVS record. The map
+     * retains the insertion order of they keys.
+     *
+     * @param records records to process
+     * @param name    column name to map
+     * @return map of records
+     */
+    public Map<String, CSVRecord> toMap(Collection<CSVRecord> records, String name) {
+        return toMap(records, new ValueResolver(name));
+    }
+
+    /**
+     * Map the given value of the CVS record into (key to record). If duplicates
+     * are encountered return the first occurence of the CVS record. The map
+     * retains the insertion order of they keys.
+     *
+     * @param records records to process
+     * @param index   column index to map
+     * @return map of records
+     */
+    public Map<String, CSVRecord> toMap(Collection<CSVRecord> records, Integer index) {
+        return toMap(records, new ValueResolver(index));
+    }
+
+    /**
+     * Map the given value of the CVS record into a list of records.
+     *
+     * @param records records to process
+     * @param name    column name to map
+     * @return map of records
+     */
+    public Map<String, List<CSVRecord>> toMultiMap(Collection<CSVRecord> records, String name) {
+        return toMultiMap(records, new ValueResolver(name));
+    }
+
+    /**
+     * Map the given value of the CVS record into a list of records.
+     *
+     * @param records records to process
+     * @param index   column index to map
+     * @return map of records
+     */
+    public Map<String, List<CSVRecord>> toMultiMap(Collection<CSVRecord> records, Integer index) {
+        return toMultiMap(records, new ValueResolver(index));
+    }
+
+    /**
+     * Maps the sybmolic name of a delimiter to a single character since it
+     * is not possible to define commony used delimiters on the command line.
+     *
+     * @param name symbolic name of delimiter
+     * @return CSV delimiter
+     */
+    public char toDelimiter(String name) {
+        if (name == null || name.isEmpty()) {
+            throw new IllegalArgumentException("Now CSV delimiter provided");
+        }
+
+        switch (name.toUpperCase().trim()) {
+            case "COMMA":
+                return ',';
+            case "HASH":
+                return '#';
+            case "PIPE":
+                return '|';
+            case "RS":
+                return 30;
+            case "SEMICOLON":
+                return ';';
+            case "SPACE":
+                return ' ';
+            case "TAB":
+                return '\t';
+            default:
+                if (name.length() == 1) {
+                    return name.charAt(0);
+                } else {
+                    throw new IllegalArgumentException("Unsupported CSV delimiter: " + name);
+                }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "Process CSV files using Apache Commons CSV (see https://commons.apache.org/proper/commons-csv/)";
+    }
+
+    private static CSVParser parse(InputStream is, Charset charset, CSVFormat format) throws IOException {
+        if (is == null) {
+            throw new IllegalArgumentException("No input stream was provided");
+        }
+
+        return CSVParser.parse(is, charset, format);
+    }
+
+    private static List<String> toKeys(Collection<CSVRecord> csvRecords, Function<CSVRecord, String> value) {
+        return csvRecords.stream()
+                .map(value)
+                .distinct()
+                .collect(toList());
+    }
+
+    private static Map<String, CSVRecord> toMap(Collection<CSVRecord> records, Function<CSVRecord, String> value) {
+        return records.stream()
+                .collect(Collectors.toMap(
+                        value,
+                        record -> record,
+                        (firstKey, currentKey) -> firstKey,
+                        LinkedHashMap::new
+                ));
+    }
+
+    private static Map<String, List<CSVRecord>> toMultiMap(Collection<CSVRecord> records, Function<CSVRecord, String> value) {
+        final Map<String, List<CSVRecord>> result = new LinkedHashMap<>();
+        final List<String> keys = toKeys(records, value);
+        keys.forEach(key -> result.put(key, new ArrayList<>()));
+        records.forEach(record -> result.get(value.apply(record)).add(record));
+        return result;
+    }
+
+    private static Map<String, CSVFormat> createCSVFormats() {
+        final Map<String, CSVFormat> result = new HashMap<>();
+        result.put("DEFAULT", CSVFormat.DEFAULT);
+        result.put("EXCEL", CSVFormat.EXCEL);
+        result.put("INFORMIX_UNLOAD", CSVFormat.INFORMIX_UNLOAD);
+        result.put("INFORMIX_UNLOAD_CSV", CSVFormat.INFORMIX_UNLOAD_CSV);
+        result.put("MONGODB_CSV", CSVFormat.MONGODB_CSV);
+        result.put("MONGODB_TSV", CSVFormat.MONGODB_TSV);
+        result.put("MYSQL", CSVFormat.MYSQL);
+        result.put("RFC4180", CSVFormat.RFC4180);
+        result.put("ORACLE", CSVFormat.ORACLE);
+        result.put("POSTGRESQL_CSV", CSVFormat.POSTGRESQL_CSV);
+        result.put("POSTGRESQL_TEXT", CSVFormat.POSTGRESQL_TEXT);
+        result.put("TDF", CSVFormat.TDF);
+        return result;
+    }
+
+    private static final class ValueResolver implements Function<CSVRecord, String> {
+
+        private final Integer index;
+        private final String name;
+
+        ValueResolver(Integer index) {
+            this.index = requireNonNull(index);
+            this.name = null;
+        }
+
+        ValueResolver(String name) {
+            this.index = null;
+            this.name = requireNonNull(name);
+        }
+
+        @Override
+        public String apply(CSVRecord record) {
+            return index != null ? record.get(index) : record.get(name);
+        }
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonsexec/CommonsExecTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonsexec/CommonsExecTool.java
new file mode 100644
index 0000000..d0e4f2e
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonsexec/CommonsExecTool.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.commonsexec;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.DefaultExecutor;
+import org.apache.commons.exec.Executor;
+import org.apache.commons.exec.PumpStreamHandler;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+public class CommonsExecTool {
+
+    public String execute(String line) {
+        return execute(CommandLine.parse(line));
+    }
+
+    public String execute(String executable, List<String> args) {
+        return execute(commandLine(executable, args));
+    }
+
+    @Override
+    public String toString() {
+        return "Execute command line tools using Apache Commons Exec (see https://commons.apache.org/proper/commons-exec/)";
+    }
+
+    private String execute(CommandLine commandLine) {
+        try (ByteArrayOutputStream boas = new ByteArrayOutputStream()) {
+            final Executor executor = new DefaultExecutor();
+            executor.setStreamHandler(new PumpStreamHandler(boas));
+            executor.execute(commandLine);
+            return boas.toString();
+        } catch (IOException e) {
+            throw new RuntimeException("Executing command failed: " + commandLine, e);
+        }
+    }
+
+    private static CommandLine commandLine(String executable, List<String> args) {
+        final CommandLine cmdLine = new CommandLine(executable);
+        cmdLine.addArguments(args.toArray(new String[0]));
+        return cmdLine;
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/excel/ExcelTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/excel/ExcelTool.java
new file mode 100644
index 0000000..43fa5ea
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/excel/ExcelTool.java
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.excel;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.DateUtil;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK;
+
+/**
+ * Parse Excel documents (XLS &amp; XLSX) using Apache POI.
+ */
+public class ExcelTool {
+
+    private static final boolean EMULATE_CSV = true;
+    private static final SimpleDateFormat TIME_DATE_FORMAT = new SimpleDateFormat("HH:mm:ss");
+    private static final SimpleDateFormat YEAR_TIME_FORMAT = new SimpleDateFormat("yyyy");
+
+    public Workbook parse(Document document) {
+        try (InputStream is = document.getUnsafeInputStream()) {
+            final Workbook workbook = WorkbookFactory.create(is);
+            // make sure that the workbook is closed together with the document
+            return document.addClosable(workbook);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse Ecxel document: " + document, e);
+        }
+    }
+
+    /**
+     * Get all sheets of a workbook.
+     *
+     * @param workbook The workbook
+     * @return Sheets of the workbook
+     */
+    public List<Sheet> getSheets(Workbook workbook) {
+        final List<Sheet> result = new ArrayList<>();
+        for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
+            result.add(workbook.getSheetAt(i));
+        }
+        return result;
+    }
+
+    /**
+     * Transform the Excel sheet into a table. Please not that locales are mostly
+     * ignored by Apache POI (see https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/DataFormatter.html)
+     *
+     * @param sheet Excel sheet
+     * @return Table containing formatted cell values as strings
+     */
+    public List<List<String>> toTable(Sheet sheet) {
+        final DataFormatter dataFormatter = dataFormatter();
+        final Iterator<Row> iterator = sheet.iterator();
+        final List<List<String>> result = new ArrayList<>();
+
+        while (iterator.hasNext()) {
+            final Row row = iterator.next();
+            result.add(toColumns(row, dataFormatter));
+        }
+
+        return result;
+    }
+
+    /**
+     * EXPERIMENTAL FEATURE
+     * <p>
+     * Transform the sheet to table contaning raw Java objects, e.g. Date, Double, ...
+     *
+     * @param sheet Excel sheet
+     * @return Table containing cells as raw Java objects
+     */
+    public List<List<Object>> toRawTable(Sheet sheet) {
+        final DataFormatter dataFormatter = dataFormatter();
+        final Iterator<Row> iterator = sheet.iterator();
+        final List<List<Object>> result = new ArrayList<>();
+
+        while (iterator.hasNext()) {
+            final Row row = iterator.next();
+            result.add(toRawColumns(row, dataFormatter));
+        }
+
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "Process Excels files (XLS, XLSX) using Apache POI (see https://poi.apache.org)";
+    }
+
+    private static List<String> toColumns(Row row, DataFormatter dataFormatter) {
+        final List<String> columnValues = new ArrayList<>();
+        for (int columnIndex = 0; columnIndex < row.getLastCellNum(); columnIndex++) {
+            final Cell cell = row.getCell(columnIndex, CREATE_NULL_AS_BLANK);
+            final String formatedCellValue = dataFormatter.formatCellValue(cell).trim();
+            columnValues.add(formatedCellValue);
+        }
+        return columnValues;
+    }
+
+    private static List<Object> toRawColumns(Row row, DataFormatter dataFormatter) {
+        final List<Object> columnValues = new ArrayList<>();
+        for (int columnIndex = 0; columnIndex < row.getLastCellNum(); columnIndex++) {
+            final Cell cell = row.getCell(columnIndex, CREATE_NULL_AS_BLANK);
+            final Object cellValue = toCellValue(cell, dataFormatter);
+            columnValues.add(cellValue);
+        }
+        return columnValues;
+    }
+
+    private static Object toCellValue(Cell cell, DataFormatter formatter) {
+        final CellType cellType = cell.getCellType();
+        switch (cellType) {
+            case BOOLEAN:
+                return cell.getBooleanCellValue();
+            case NUMERIC:
+                return DateUtil.isCellDateFormatted(cell) ? toDateCellValue(cell) : cell.getNumericCellValue();
+            default:
+                return formatter.formatCellValue(cell);
+        }
+    }
+
+    /**
+     * Try desperately to make sense out of Excel and its handling of dates.
+     * See https://stackoverflow.com/questions/15710888/reading-time-values-from-spreadsheet-using-poi-api.
+     *
+     * @param cell Cell containing some sort of date or time
+     * @return The corresponding Java istance
+     */
+    private static synchronized Object toDateCellValue(Cell cell) {
+        final Date date = cell.getDateCellValue();
+
+        // "Time-only" values have date set to 31-Dec-1899 so if year is "1899"
+        // you can assume it is a "time-only" value
+        final String year = YEAR_TIME_FORMAT.format(date);
+
+        if (year.equals("1899")) {
+            // handle "Time-only" value
+            return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalTime();
+        } else {
+            // here you may have a date-only or date-time value
+            final String timeStamp = TIME_DATE_FORMAT.format(date);
+            if (timeStamp.equals("00:00:00")) {
+                // if time is 00:00:00 you can assume it is a date only value (but it could be midnight)
+                return new java.sql.Date(date.getTime()).toLocalDate();
+            } else {
+                return date;
+            }
+        }
+    }
+
+    private static DataFormatter dataFormatter() {
+        return new DataFormatter(EMULATE_CSV);
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/freemarker/FreeMarkerTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/freemarker/FreeMarkerTool.java
new file mode 100644
index 0000000..1150ccb
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/freemarker/FreeMarkerTool.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.freemarker;
+
+import freemarker.ext.beans.BeansWrapper;
+import freemarker.ext.beans.BeansWrapperBuilder;
+import freemarker.template.Configuration;
+import freemarker.template.TemplateHashModel;
+import freemarker.template.utility.ObjectConstructor;
+
+public class FreeMarkerTool {
+
+    private BeansWrapper beansWrapper;
+    private ObjectConstructor objectConstructor;
+
+    public synchronized ObjectConstructor getObjectConstructor() {
+        if (objectConstructor == null) {
+            objectConstructor = new ObjectConstructor();
+        }
+        return objectConstructor;
+    }
+
+    public synchronized BeansWrapper getBeansWrapper() {
+        if (beansWrapper == null) {
+            beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_29).build();
+        }
+        return beansWrapper;
+    }
+
+    public TemplateHashModel getEnums() {
+        return getBeansWrapper().getEnumModels();
+    }
+
+    public TemplateHashModel getStatics() {
+        return getBeansWrapper().getStaticModels();
+    }
+
+    @Override
+    public String toString() {
+        return "Expose useful Apache FreeMarker classes";
+    }
+}
+
+
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokTool.java
new file mode 100644
index 0000000..984d22c
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokTool.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.grok;
+
+import io.krakens.grok.api.Grok;
+import io.krakens.grok.api.GrokCompiler;
+
+public class GrokTool {
+
+    private static final String DEFAULT_PATTERN = "/patterns/patterns";
+
+    public GrokWrapper compile(String pattern) {
+        return compile(DEFAULT_PATTERN, pattern);
+    }
+
+    public GrokWrapper compile(String path, String pattern) {
+        final GrokCompiler grokCompiler = GrokCompiler.newInstance();
+        grokCompiler.registerPatternFromClasspath(path);
+        final Grok grok = grokCompiler.compile(pattern);
+        return new GrokWrapper(grok);
+    }
+
+    @Override
+    public String toString() {
+        return "Process text files using Grok expressions (see https://github.com/thekrakken/java-grok)";
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokWrapper.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokWrapper.java
new file mode 100644
index 0000000..7a6931e
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokWrapper.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.grok;
+
+import io.krakens.grok.api.Grok;
+import org.apache.freemarker.generator.base.util.StringUtils;
+
+import java.util.Collections;
+import java.util.Map;
+
+import static java.util.Objects.requireNonNull;
+
+public class GrokWrapper {
+
+    private final Grok grok;
+
+    public GrokWrapper(Grok grok) {
+        this.grok = requireNonNull(grok);
+    }
+
+    public Map<String, Object> match(String line) {
+        if (StringUtils.isEmpty(line)) {
+            return Collections.emptyMap();
+        }
+
+        return grok.match(line).capture();
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathTool.java
new file mode 100644
index 0000000..3e31ffc
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathTool.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.jsonpath;
+
+import com.jayway.jsonpath.Configuration;
+import com.jayway.jsonpath.DocumentContext;
+import com.jayway.jsonpath.JsonPath;
+import com.jayway.jsonpath.Option;
+import org.apache.freemarker.generator.base.document.Document;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class JsonPathTool {
+
+    public DocumentContext parse(Document document) throws IOException {
+        try (InputStream is = document.getUnsafeInputStream()) {
+            return JsonPath.using(configuration()).parse(is);
+        }
+    }
+
+    public DocumentContext parse(String json) {
+        return JsonPath.using(configuration()).parse(json);
+    }
+
+    @Override
+    public String toString() {
+        return "Process JSON files using Java JSON Path (see https://github.com/json-path/JsonPath)";
+    }
+
+    private Configuration configuration() {
+        return Configuration.builder()
+                .options(Option.SUPPRESS_EXCEPTIONS)
+                .build();
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsoup/JsoupTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsoup/JsoupTool.java
new file mode 100644
index 0000000..62d0944
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsoup/JsoupTool.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.jsoup;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.jsoup.Jsoup;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class JsoupTool {
+
+    public org.jsoup.nodes.Document parse(Document document) {
+        try (InputStream is = document.getUnsafeInputStream()) {
+            return Jsoup.parse(is, document.getCharset().name(), "");
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse HTML document: " + document, e);
+        }
+    }
+
+    public org.jsoup.nodes.Document parse(String html) {
+        return Jsoup.parse(html);
+    }
+
+    @Override
+    public String toString() {
+        return "Process  HTML files using Jsoup (see https://jsoup.org)";
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/properties/PropertiesTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/properties/PropertiesTool.java
new file mode 100644
index 0000000..96acb0d
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/properties/PropertiesTool.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.properties;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.util.PropertiesFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+public class PropertiesTool {
+
+    public Properties parse(Document document) {
+        try (InputStream is = document.getUnsafeInputStream()) {
+            return PropertiesFactory.create(is);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse properties: " + document, e);
+        }
+    }
+
+    public Properties parse(String value) {
+        return PropertiesFactory.create(value);
+    }
+
+    @Override
+    public String toString() {
+        return "Process JDK properties files";
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlTool.java
new file mode 100644
index 0000000..96bc938
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlTool.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.snakeyaml;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+public class SnakeYamlTool {
+
+    public Map<String, Object> parse(Document document) {
+        try (InputStream is = document.getUnsafeInputStream()) {
+            return new Yaml().load(is);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to load YAML document: " + document, e);
+        }
+    }
+
+    public Map<String, Object> parse(String value) {
+        return new Yaml().load(value);
+    }
+
+    @Override
+    public String toString() {
+        return "Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home)";
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
new file mode 100644
index 0000000..2b50c99
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.system;
+
+import java.io.File;
+import java.io.Writer;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.FREEMARKER_CLI_ARGS;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.FREEMARKER_TEMPLATE_DIRECTORIES;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.FREEMARKER_USER_PARAMETERS;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.FREEMARKER_USER_SYSTEM_PROPERTIES;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.FREEMARKER_WRITER;
+
+/**
+ * Provides system related functionality, e.g. accessing environment variable,
+ * system properties, commandl-line arguments, hostname, FreeMarker writer, etc.
+ */
+@SuppressWarnings("unchecked")
+public class SystemTool {
+
+    /** Command line arguments */
+    private final List<String> commandLineArgs;
+
+    /** User-supplied parameters */
+    private final Map<String, String> parameters;
+
+    /** List of FreeMarker's template directories */
+    private final List<File> templateDirectories;
+
+    /** User-supplied system properties */
+    private final Properties userSystemProperties;
+
+    /** Underlying FreeMarker writer for rendering templates */
+    private final Writer writer;
+
+    public SystemTool() {
+        this.commandLineArgs = emptyList();
+        this.templateDirectories = emptyList();
+        this.parameters = emptyMap();
+        this.userSystemProperties = new Properties();
+        this.writer = null;
+    }
+
+    public SystemTool(Map<String, Object> settings) {
+        requireNonNull(settings);
+        this.commandLineArgs = (List<String>) settings.getOrDefault(FREEMARKER_CLI_ARGS, emptyList());
+        this.parameters = (Map<String, String>) settings.getOrDefault(FREEMARKER_USER_PARAMETERS, emptyMap());
+        this.templateDirectories = (List<File>) settings.getOrDefault(FREEMARKER_TEMPLATE_DIRECTORIES, emptyList());
+        this.userSystemProperties = (Properties) settings.getOrDefault(FREEMARKER_USER_SYSTEM_PROPERTIES, new Properties());
+        this.writer = (Writer) settings.getOrDefault(FREEMARKER_WRITER, null);
+    }
+
+    public List<String> getCommandLineArgs() {
+        return commandLineArgs;
+    }
+
+    public List<File> getTemplateDirectories() {
+        return templateDirectories;
+    }
+
+    public String getSystemProperty(String key) {
+        return System.getProperty(key);
+    }
+
+    public String getSystemProperty(String key, String def) {
+        return System.getProperty(key, def);
+    }
+
+    public Properties getSystemProperties() {
+        return System.getProperties();
+    }
+
+    public String getParameter(String key) {
+        return parameters.get(key);
+    }
+
+    public String getParameter(String key, String def) {
+        return parameters.getOrDefault(key, def);
+    }
+
+    public Map<String, String> getParameters() {
+        return parameters;
+    }
+
+    public Properties getUserSystemProperties() {
+        return userSystemProperties;
+    }
+
+    public Map<String, String> getEnvs() {
+        return System.getenv();
+    }
+
+    public String getEnv(String name) {
+        return System.getenv(name);
+    }
+
+    public String getEnv(String name, String def) {
+        final String env = this.getEnv(name);
+        return env != null ? env : def;
+    }
+
+    public String getHostName() {
+        try {
+            return InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException ignored) {
+            return "localhost";
+        }
+    }
+
+    public Writer getWriter() {
+        return writer;
+    }
+
+    public long getCurrentTimeMillis() {
+        return System.currentTimeMillis();
+    }
+
+    @Override
+    public String toString() {
+        return "Expose System-related utility methods";
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/uuid/UUIDTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/uuid/UUIDTool.java
new file mode 100644
index 0000000..34eab30
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/uuid/UUIDTool.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.uuid;
+
+import java.util.UUID;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+public class UUIDTool {
+
+    public UUID randomUUID() {
+        return UUID.randomUUID();
+    }
+
+    public UUID namedUUID(String name) {
+        return UUID.nameUUIDFromBytes(name.getBytes(UTF_8));
+    }
+
+    @Override
+    public String toString() {
+        return "Create UUIDs";
+    }
+}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/xml/XmlTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/xml/XmlTool.java
new file mode 100644
index 0000000..5977ae7
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/xml/XmlTool.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.xml;
+
+import freemarker.ext.dom.NodeModel;
+import org.apache.freemarker.generator.base.document.Document;
+import org.xml.sax.InputSource;
+
+import java.io.InputStream;
+import java.io.StringReader;
+
+public class XmlTool {
+
+    public NodeModel parse(Document document) {
+        try (InputStream is = document.getUnsafeInputStream()) {
+            return NodeModel.parse(new InputSource(is));
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to parse XML document: " + document, e);
+        }
+    }
+
+    public NodeModel parse(String value) {
+        try (StringReader reader = new StringReader(value)) {
+            return NodeModel.parse(new InputSource(reader));
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to parse XML document: " + value, e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html)";
+    }
+}
diff --git a/freemarker-generator-tools/src/main/resources/patterns/firewalls b/freemarker-generator-tools/src/main/resources/patterns/firewalls
new file mode 100755
index 0000000..8f16bea
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/firewalls
@@ -0,0 +1,3 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+# NetScreen firewall logs
+NETSCREENSESSIONLOG %{SYSLOGTIMESTAMP:date} %{IPORHOST:device} %{IPORHOST}: NetScreen device_id=%{WORD:device_id}%{DATA}: start_time=%{QUOTEDSTRING:start_time} duration=%{INT:duration} policy_id=%{INT:policy_id} service=%{DATA:service} proto=%{INT:proto} src zone=%{WORD:src_zone} dst zone=%{WORD:dst_zone} action=%{WORD:action} sent=%{INT:sent} rcvd=%{INT:rcvd} src=%{IPORHOST:src_ip} dst=%{IPORHOST:dst_ip} src_port=%{INT:src_port} dst_port=%{INT:dst_port} src-xlated ip=%{IPORHOST:src_xlated_ip} port=%{INT:src_xlated_port} dst-xlated ip=%{IPORHOST:dst_xlated_ip} port=%{INT:dst_xlated_port} session_id=%{INT:session_id} reason=%{GREEDYDATA:reason}
diff --git a/freemarker-generator-tools/src/main/resources/patterns/haproxy b/freemarker-generator-tools/src/main/resources/patterns/haproxy
new file mode 100755
index 0000000..99fff30
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/haproxy
@@ -0,0 +1,38 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+## These patterns were tested w/ haproxy-1.4.15
+
+## Documentation of the haproxy log formats can be found at the following links:
+## http://code.google.com/p/haproxy-docs/wiki/HTTPLogFormat
+## http://code.google.com/p/haproxy-docs/wiki/TCPLogFormat
+
+HAPROXYTIME (?!<[0-9])%{HOUR:haproxy_hour}:%{MINUTE:haproxy_minute}(?::%{SECOND:haproxy_second})(?![0-9])
+HAPROXYDATE %{MONTHDAY:haproxy_monthday}/%{MONTH:haproxy_month}/%{YEAR:haproxy_year}:%{HAPROXYTIME:haproxy_time}.%{INT:haproxy_milliseconds}
+
+# Override these default patterns to parse out what is captured in your haproxy.cfg
+HAPROXYCAPTUREDREQUESTHEADERS %{DATA:captured_request_headers}
+HAPROXYCAPTUREDRESPONSEHEADERS %{DATA:captured_response_headers}
+
+# Example:
+#  These haproxy config lines will add data to the logs that are captured
+#  by the patterns below. Place them in your custom patterns directory to
+#  override the defaults.
+#
+#  capture request header Host len 40
+#  capture request header X-Forwarded-For len 50
+#  capture request header Accept-Language len 50
+#  capture request header Referer len 200
+#  capture request header User-Agent len 200
+#
+#  capture response header Content-Type len 30
+#  capture response header Content-Encoding len 10
+#  capture response header Cache-Control len 200
+#  capture response header Last-Modified len 200
+#
+# HAPROXYCAPTUREDREQUESTHEADERS %{DATA:request_header_host}\|%{DATA:request_header_x_forwarded_for}\|%{DATA:request_header_accept_language}\|%{DATA:request_header_referer}\|%{DATA:request_header_user_agent}
+# HAPROXYCAPTUREDRESPONSEHEADERS %{DATA:response_header_content_type}\|%{DATA:response_header_content_encoding}\|%{DATA:response_header_cache_control}\|%{DATA:response_header_last_modified}
+
+# parse a haproxy 'httplog' line
+HAPROXYHTTP %{SYSLOGTIMESTAMP:syslog_timestamp} %{IPORHOST:syslog_server} %{SYSLOGPROG}: %{IP:client_ip}:%{INT:client_port} \[%{HAPROXYDATE:accept_date}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} (\{%{HAPROXYCAPTUREDREQUESTHEADERS}\})?( )?(\{%{HAPROXYCAPTUREDRESPONSEHEADERS}\})?( )?"%{WORD:http_verb} %{URIPATHPARAM:http_request}( HTTP/%{NUMBER:http_version}")?
+
+# parse a haproxy 'tcplog' line
+HAPROXYTCP %{SYSLOGTIMESTAMP:syslog_timestamp} %{IPORHOST:syslog_server} %{SYSLOGPROG}: %{IP:client_ip}:%{INT:client_port} \[%{HAPROXYDATE:accept_date}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_queue}/%{INT:time_backend_connect}/%{NOTSPACE:time_duration} %{NOTSPACE:bytes_read} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue}
diff --git a/freemarker-generator-tools/src/main/resources/patterns/java b/freemarker-generator-tools/src/main/resources/patterns/java
new file mode 100755
index 0000000..611952c
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/java
@@ -0,0 +1,4 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+JAVACLASS (?:[a-zA-Z0-9-]+\.)+[A-Za-z0-9$]+
+JAVAFILE (?:[A-Za-z0-9_.-]+)
+JAVASTACKTRACEPART at %{JAVACLASS:class}\.%{WORD:method}\(%{JAVAFILE:file}:%{NUMBER:line}\)
diff --git a/freemarker-generator-tools/src/main/resources/patterns/linux-syslog b/freemarker-generator-tools/src/main/resources/patterns/linux-syslog
new file mode 100755
index 0000000..a888999
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/linux-syslog
@@ -0,0 +1,8 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+SYSLOGBASE2 (?:%{SYSLOGTIMESTAMP:timestamp}|%{TIMESTAMP_ISO8601:timestamp8601}) (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
+SYSLOGPAMSESSION %{SYSLOGBASE} (?=%{GREEDYDATA:message})%{WORD:pam_module}\(%{DATA:pam_caller}\): session %{WORD:pam_session_state} for user %{USERNAME:username}(?: by %{GREEDYDATA:pam_by})?
+
+CRON_ACTION [A-Z ]+
+CRONLOG %{SYSLOGBASE} \(%{USER:user}\) %{CRON_ACTION:action} \(%{DATA:message}\)
+
+SYSLOGLINE %{SYSLOGBASE2} %{GREEDYDATA:message}
diff --git a/freemarker-generator-tools/src/main/resources/patterns/nagios b/freemarker-generator-tools/src/main/resources/patterns/nagios
new file mode 100755
index 0000000..771cb0a
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/nagios
@@ -0,0 +1,109 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+##################################################################################
+##################################################################################
+# Chop Nagios log files to smithereens!
+#
+# A set of GROK filters to process logfiles generated by Nagios.
+# While it does not, this set intends to cover all possible Nagios logs.
+#
+# Some more work needs to be done to cover all External Commands:
+#	http://old.nagios.org/developerinfo/externalcommands/commandlist.php
+#
+# If you need some support on these rules please contact:
+#	Jelle Smet http://smetj.net
+#
+#################################################################################
+#################################################################################
+
+NAGIOSTIME \[%{NUMBER:nagios_epoch}\]
+
+###############################################
+######## Begin nagios log types
+###############################################
+NAGIOS_TYPE_CURRENT_SERVICE_STATE CURRENT SERVICE STATE
+NAGIOS_TYPE_CURRENT_HOST_STATE CURRENT HOST STATE
+
+NAGIOS_TYPE_SERVICE_NOTIFICATION SERVICE NOTIFICATION
+NAGIOS_TYPE_HOST_NOTIFICATION HOST NOTIFICATION
+
+NAGIOS_TYPE_SERVICE_ALERT SERVICE ALERT
+NAGIOS_TYPE_HOST_ALERT HOST ALERT
+
+NAGIOS_TYPE_SERVICE_FLAPPING_ALERT SERVICE FLAPPING ALERT
+NAGIOS_TYPE_HOST_FLAPPING_ALERT HOST FLAPPING ALERT
+
+NAGIOS_TYPE_SERVICE_DOWNTIME_ALERT SERVICE DOWNTIME ALERT
+NAGIOS_TYPE_HOST_DOWNTIME_ALERT HOST DOWNTIME ALERT
+
+NAGIOS_TYPE_PASSIVE_SERVICE_CHECK PASSIVE SERVICE CHECK
+NAGIOS_TYPE_PASSIVE_HOST_CHECK PASSIVE HOST CHECK
+
+NAGIOS_TYPE_SERVICE_EVENT_HANDLER SERVICE EVENT HANDLER
+NAGIOS_TYPE_HOST_EVENT_HANDLER HOST EVENT HANDLER
+
+NAGIOS_TYPE_EXTERNAL_COMMAND EXTERNAL COMMAND
+NAGIOS_TYPE_TIMEPERIOD_TRANSITION TIMEPERIOD TRANSITION
+###############################################
+######## End nagios log types
+###############################################
+
+###############################################
+######## Begin external check types
+###############################################
+NAGIOS_EC_DISABLE_SVC_CHECK DISABLE_SVC_CHECK
+NAGIOS_EC_ENABLE_SVC_CHECK ENABLE_SVC_CHECK
+NAGIOS_EC_DISABLE_HOST_CHECK DISABLE_HOST_CHECK
+NAGIOS_EC_ENABLE_HOST_CHECK ENABLE_HOST_CHECK
+NAGIOS_EC_PROCESS_SERVICE_CHECK_RESULT PROCESS_SERVICE_CHECK_RESULT
+NAGIOS_EC_PROCESS_HOST_CHECK_RESULT PROCESS_HOST_CHECK_RESULT
+NAGIOS_EC_SCHEDULE_SERVICE_DOWNTIME SCHEDULE_SERVICE_DOWNTIME
+NAGIOS_EC_SCHEDULE_HOST_DOWNTIME SCHEDULE_HOST_DOWNTIME
+###############################################
+######## End external check types
+###############################################
+NAGIOS_WARNING Warning:%{SPACE}%{GREEDYDATA:nagios_message}
+
+NAGIOS_CURRENT_SERVICE_STATE %{NAGIOS_TYPE_CURRENT_SERVICE_STATE:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statetype};%{DATA:nagios_statecode};%{GREEDYDATA:nagios_message}
+NAGIOS_CURRENT_HOST_STATE %{NAGIOS_TYPE_CURRENT_HOST_STATE:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statetype};%{DATA:nagios_statecode};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_NOTIFICATION %{NAGIOS_TYPE_SERVICE_NOTIFICATION:nagios_type}: %{DATA:nagios_notifyname};%{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_contact};%{GREEDYDATA:nagios_message}
+NAGIOS_HOST_NOTIFICATION %{NAGIOS_TYPE_HOST_NOTIFICATION}: %{DATA:nagios_notifyname};%{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_contact};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_ALERT %{NAGIOS_TYPE_SERVICE_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{NUMBER:nagios_attempt};%{GREEDYDATA:nagios_message}
+NAGIOS_HOST_ALERT %{NAGIOS_TYPE_HOST_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{NUMBER:nagios_attempt};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_FLAPPING_ALERT %{NAGIOS_TYPE_SERVICE_FLAPPING_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_message}
+NAGIOS_HOST_FLAPPING_ALERT %{NAGIOS_TYPE_HOST_FLAPPING_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_message}
+
+NAGIOS_SERVICE_DOWNTIME_ALERT %{NAGIOS_TYPE_SERVICE_DOWNTIME_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+NAGIOS_HOST_DOWNTIME_ALERT %{NAGIOS_TYPE_HOST_DOWNTIME_ALERT:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+
+NAGIOS_PASSIVE_SERVICE_CHECK %{NAGIOS_TYPE_PASSIVE_SERVICE_CHECK:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+NAGIOS_PASSIVE_HOST_CHECK %{NAGIOS_TYPE_PASSIVE_HOST_CHECK:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_comment}
+
+NAGIOS_SERVICE_EVENT_HANDLER %{NAGIOS_TYPE_SERVICE_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
+NAGIOS_HOST_EVENT_HANDLER %{NAGIOS_TYPE_HOST_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
+
+NAGIOS_TIMEPERIOD_TRANSITION %{NAGIOS_TYPE_TIMEPERIOD_TRANSITION:nagios_type}: %{DATA:nagios_service};%{DATA:nagios_unknown1};%{DATA:nagios_unknown2};
+
+####################
+#### External checks
+####################
+
+#Disable host & service check
+NAGIOS_EC_LINE_DISABLE_SVC_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_DISABLE_SVC_CHECK:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_service}
+NAGIOS_EC_LINE_DISABLE_HOST_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_DISABLE_HOST_CHECK:nagios_command};%{DATA:nagios_hostname}
+
+#Enable host & service check
+NAGIOS_EC_LINE_ENABLE_SVC_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_ENABLE_SVC_CHECK:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_service}
+NAGIOS_EC_LINE_ENABLE_HOST_CHECK %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_ENABLE_HOST_CHECK:nagios_command};%{DATA:nagios_hostname}
+
+#Process host & service check
+NAGIOS_EC_LINE_PROCESS_SERVICE_CHECK_RESULT %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_PROCESS_SERVICE_CHECK_RESULT:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{GREEDYDATA:nagios_check_result}
+NAGIOS_EC_LINE_PROCESS_HOST_CHECK_RESULT %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_PROCESS_HOST_CHECK_RESULT:nagios_command};%{DATA:nagios_hostname};%{DATA:nagios_state};%{GREEDYDATA:nagios_check_result}
+
+#Schedule host & service downtime
+NAGIOS_EC_LINE_SCHEDULE_HOST_DOWNTIME %{NAGIOS_TYPE_EXTERNAL_COMMAND:nagios_type}: %{NAGIOS_EC_SCHEDULE_HOST_DOWNTIME:nagios_command};%{DATA:nagios_hostname};%{NUMBER:nagios_start_time};%{NUMBER:nagios_end_time};%{NUMBER:nagios_fixed};%{NUMBER:nagios_trigger_id};%{NUMBER:nagios_duration};%{DATA:author};%{DATA:comment}
+
+#End matching line
+NAGIOSLOGLINE %{NAGIOSTIME} (?:%{NAGIOS_WARNING}|%{NAGIOS_CURRENT_SERVICE_STATE}|%{NAGIOS_CURRENT_HOST_STATE}|%{NAGIOS_SERVICE_NOTIFICATION}|%{NAGIOS_HOST_NOTIFICATION}|%{NAGIOS_SERVICE_ALERT}|%{NAGIOS_HOST_ALERT}|%{NAGIOS_SERVICE_FLAPPING_ALERT}|%{NAGIOS_HOST_FLAPPING_ALERT}|%{NAGIOS_SERVICE_DOWNTIME_ALERT}|%{NAGIOS_HOST_DOWNTIME_ALERT}|%{NAGIOS_PASSIVE_SERVICE_CHECK}|%{NAGIOS_PASSIVE_HOST_CHECK}|%{NAGIOS_SERVICE_EVENT_HANDLER}|%{NAGIOS_HOST_EVENT_HANDLER}|%{NAGIOS_TIMEPERIOD_TRANSITION}|%{NAGIOS_EC_LINE_DISABLE_SVC_CHECK}|%{NAGIOS_EC_LINE_ENABLE_SVC_CHECK}|%{NAGIOS_EC_LINE_DISABLE_HOST_CHECK|%{NAGIOS_EC_LINE_ENABLE_HOST_CHECK}|%{NAGIOS_EC_LINE_PROCESS_HOST_CHECK_RESULT}|%{NAGIOS_EC_LINE_PROCESS_SERVICE_CHECK_RESULT}|%{NAGIOS_EC_LINE_SCHEDULE_HOST_DOWNTIME})
diff --git a/freemarker-generator-tools/src/main/resources/patterns/patterns b/freemarker-generator-tools/src/main/resources/patterns/patterns
new file mode 100755
index 0000000..52235d8
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/patterns
@@ -0,0 +1,108 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+
+USERNAME [a-zA-Z0-9._-]+
+USER %{USERNAME:UNWANTED}
+INT (?:[+-]?(?:[0-9]+))
+BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
+NUMBER (?:%{BASE10NUM:UNWANTED})
+BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
+BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b
+
+POSINT \b(?:[1-9][0-9]*)\b
+NONNEGINT \b(?:[0-9]+)\b
+WORD \b\w+\b
+NOTSPACE \S+
+SPACE \s*
+DATA .*?
+GREEDYDATA .*
+#QUOTEDSTRING (?:(?<!\\)(?:"(?:\\.|[^\\"])*"|(?:'(?:\\.|[^\\'])*')|(?:`(?:\\.|[^\\`])*`)))
+QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``))
+UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}
+
+# Networking
+MAC (?:%{CISCOMAC:UNWANTED}|%{WINDOWSMAC:UNWANTED}|%{COMMONMAC:UNWANTED})
+CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4})
+WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2})
+COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})
+IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
+IPV4 (?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])
+IP (?:%{IPV6:UNWANTED}|%{IPV4:UNWANTED})
+HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
+HOST %{HOSTNAME:UNWANTED}
+IPORHOST (?:%{HOSTNAME:UNWANTED}|%{IP:UNWANTED})
+HOSTPORT (?:%{IPORHOST}:%{POSINT:PORT})
+
+# paths
+PATH (?:%{UNIXPATH}|%{WINPATH})
+UNIXPATH (?>/(?>[\w_%!$@:.,~-]+|\\.)*)+
+#UNIXPATH (?<![\w\/])(?:/[^\/\s?*]*)+
+TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+))
+WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+
+URIPROTO [A-Za-z]+(\+[A-Za-z+]+)?
+URIHOST %{IPORHOST}(?::%{POSINT:port})?
+# uripath comes loosely from RFC1738, but mostly from what Firefox
+# doesn't turn into %XX
+URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+
+#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
+URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
+URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?
+URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
+
+# Months: January, Feb, 3, 03, 12, December
+MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b
+MONTHNUM (?:0?[1-9]|1[0-2])
+MONTHNUM2 (?:0[1-9]|1[0-2])
+MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])
+
+# Days: Monday, Tue, Thu, etc...
+DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)
+
+# Years?
+YEAR (?>\d\d){1,2}
+# Time: HH:MM:SS
+#TIME \d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?
+# I'm still on the fence about using grok to perform the time match,
+# since it's probably slower.
+# TIME %{POSINT<24}:%{POSINT<60}(?::%{POSINT<60}(?:\.%{POSINT})?)?
+HOUR (?:2[0123]|[01]?[0-9])
+MINUTE (?:[0-5][0-9])
+# '60' is a leap second in most time standards and thus is valid.
+SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)
+TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
+# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
+DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
+DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
+ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
+ISO8601_SECOND (?:%{SECOND}|60)
+TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
+DATE %{DATE_US}|%{DATE_EU}
+DATESTAMP %{DATE}[- ]%{TIME}
+TZ (?:[PMCE][SD]T|UTC)
+DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
+DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE}
+DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}
+DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND}
+
+# Syslog Dates: Month Day HH:MM:SS
+SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
+PROG (?:[\w._/%-]+)
+SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])?
+SYSLOGHOST %{IPORHOST}
+SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}>
+HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}
+
+# Shortcuts
+QS %{QUOTEDSTRING:UNWANTED}
+
+# Log formats
+SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
+
+MESSAGESLOG %{SYSLOGBASE} %{DATA}
+
+COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
+COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}
+COMMONAPACHELOG_DATATYPED %{IPORHOST:clientip} %{USER:ident;boolean} %{USER:auth} \[%{HTTPDATE:timestamp;date;dd/MMM/yyyy:HH:mm:ss Z}\] "(?:%{WORD:verb;string} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion;float})?|%{DATA:rawrequest})" %{NUMBER:response;int} (?:%{NUMBER:bytes;long}|-)
+
+
+# Log Levels
+LOGLEVEL ([A|a]lert|ALERT|[T|t]race|TRACE|[D|d]ebug|DEBUG|[N|n]otice|NOTICE|[I|i]nfo|INFO|[W|w]arn?(?:ing)?|WARN?(?:ING)?|[E|e]rr?(?:or)?|ERR?(?:OR)?|[C|c]rit?(?:ical)?|CRIT?(?:ICAL)?|[F|f]atal|FATAL|[S|s]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
diff --git a/freemarker-generator-tools/src/main/resources/patterns/postfix b/freemarker-generator-tools/src/main/resources/patterns/postfix
new file mode 100755
index 0000000..3adcb69
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/postfix
@@ -0,0 +1,125 @@
+# common postfix patterns
+POSTFIX_QUEUEID ([0-9A-F]{6,}|[0-9a-zA-Z]{15,})
+POSTFIX_CLIENT_INFO %{HOSTNAME:postfix_client_hostname}?\[%{IP:postfix_client_ip}\](:%{INT:postfix_client_port})?
+POSTFIX_RELAY_INFO %{HOSTNAME:postfix_relay_hostname}?\[(%{IP:postfix_relay_ip}|%{DATA:postfix_relay_service})\](:%{INT:postfix_relay_port})?|%{WORD:postfix_relay_service}
+POSTFIX_SMTP_STAGE (CONNECT|HELO|EHLO|STARTTLS|AUTH|MAIL( FROM)?|RCPT( TO)?|(end of )?DATA|RSET|UNKNOWN|END-OF-MESSAGE|VRFY|\.)
+POSTFIX_ACTION (accept|defer|discard|filter|header-redirect|reject)
+POSTFIX_STATUS_CODE \d{3}
+POSTFIX_STATUS_CODE_ENHANCED \d\.\d\.\d
+POSTFIX_DNSBL_MESSAGE Service unavailable; .* \[%{GREEDYDATA:postfix_status_data}\] %{GREEDYDATA:postfix_status_message};
+POSTFIX_PS_ACCESS_ACTION (DISCONNECT|BLACKLISTED|WHITELISTED|WHITELIST VETO|PASS NEW|PASS OLD)
+POSTFIX_PS_VIOLATION (BARE NEWLINE|COMMAND (TIME|COUNT|LENGTH) LIMIT|COMMAND PIPELINING|DNSBL|HANGUP|NON-SMTP COMMAND|PREGREET)
+POSTFIX_TIME_UNIT %{NUMBER}[smhd]
+POSTFIX_KEYVALUE_DATA [\w-]+=[^;]*
+POSTFIX_KEYVALUE %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+POSTFIX_WARNING_LEVEL (warning|fatal|info)
+
+POSTFIX_TLSCONN (Anonymous|Trusted|Untrusted|Verified) TLS connection established (to %{POSTFIX_RELAY_INFO}|from %{POSTFIX_CLIENT_INFO}): %{DATA:postfix_tls_version} with cipher %{DATA:postfix_tls_cipher} \(%{DATA:postfix_tls_cipher_size} bits\)
+POSTFIX_DELAYS %{NUMBER:postfix_delay_before_qmgr}/%{NUMBER:postfix_delay_in_qmgr}/%{NUMBER:postfix_delay_conn_setup}/%{NUMBER:postfix_delay_transmission}
+POSTFIX_LOSTCONN (lost connection|timeout|SSL_accept error)
+POSTFIX_LOSTCONN_REASONS (receiving the initial server greeting|sending message body|sending end of data -- message may be sent more than once)
+POSTFIX_PROXY_MESSAGE (%{POSTFIX_STATUS_CODE:postfix_proxy_status_code} )?(%{POSTFIX_STATUS_CODE_ENHANCED:postfix_proxy_status_code_enhanced})?.*
+
+# helper patterns
+GREEDYDATA_NO_COLON [^:]*
+GREEDYDATA_NO_SEMICOLON [^;]*
+
+# warning patterns
+POSTFIX_WARNING_WITH_KV (%{POSTFIX_QUEUEID:postfix_queueid}: )?%{POSTFIX_WARNING_LEVEL:postfix_message_level}: %{GREEDYDATA:postfix_message}; %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+POSTFIX_WARNING_WITHOUT_KV (%{POSTFIX_QUEUEID:postfix_queueid}: )?%{POSTFIX_WARNING_LEVEL:postfix_message_level}: %{GREEDYDATA:postfix_message}
+POSTFIX_WARNING %{POSTFIX_WARNING_WITH_KV}|%{POSTFIX_WARNING_WITHOUT_KV}
+
+# smtpd patterns
+POSTFIX_SMTPD_CONNECT connect from %{POSTFIX_CLIENT_INFO}
+POSTFIX_SMTPD_DISCONNECT disconnect from %{POSTFIX_CLIENT_INFO}
+POSTFIX_SMTPD_LOSTCONN %{POSTFIX_LOSTCONN:postfix_smtpd_lostconn_data}( after %{POSTFIX_SMTP_STAGE:postfix_smtp_stage}( \(%{INT} bytes\))?)? from %{POSTFIX_CLIENT_INFO}(: %{GREEDYDATA:postfix_smtpd_lostconn_reason})?
+POSTFIX_SMTPD_NOQUEUE NOQUEUE: %{POSTFIX_ACTION:postfix_action}: %{POSTFIX_SMTP_STAGE:postfix_smtp_stage} from %{POSTFIX_CLIENT_INFO}:( %{POSTFIX_STATUS_CODE:postfix_status_code} %{POSTFIX_STATUS_CODE_ENHANCED:postfix_status_code_enhanced})?( <%{DATA:postfix_status_data}>:)? (%{POSTFIX_DNSBL_MESSAGE}|%{GREEDYDATA:postfix_status_message};) %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+POSTFIX_SMTPD_PIPELINING improper command pipelining after %{POSTFIX_SMTP_STAGE:postfix_smtp_stage} from %{POSTFIX_CLIENT_INFO}: %{GREEDYDATA:postfix_improper_pipelining_data}
+POSTFIX_SMTPD_PROXY proxy-%{POSTFIX_ACTION:postfix_proxy_result}: (%{POSTFIX_SMTP_STAGE:postfix_proxy_smtp_stage}): %{POSTFIX_PROXY_MESSAGE:postfix_proxy_message}; %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}
+
+# cleanup patterns
+POSTFIX_CLEANUP_MILTER %{POSTFIX_QUEUEID:postfix_queueid}: milter-%{POSTFIX_ACTION:postfix_milter_result}: %{GREEDYDATA:postfix_milter_message}; %{GREEDYDATA_NO_COLON:postfix_keyvalue_data}(: %{GREEDYDATA:postfix_milter_data})?
+
+# qmgr patterns
+POSTFIX_QMGR_REMOVED %{POSTFIX_QUEUEID:postfix_queueid}: removed
+POSTFIX_QMGR_ACTIVE %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data} \(queue active\)
+POSTFIX_QMGR_EXPIRED %{POSTFIX_QUEUEID:postfix_queueid}: from=<%{DATA:postfix_from}>, status=%{WORD:postfix_status}, returned to sender
+
+# pipe patterns
+POSTFIX_PIPE_ANY %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}, status=%{WORD:postfix_status} \(%{GREEDYDATA:postfix_pipe_response}\)
+
+# error patterns
+POSTFIX_ERROR_ANY %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data}, status=%{WORD:postfix_status} \(%{GREEDYDATA:postfix_error_response}\)
+
+# discard patterns
+POSTFIX_DISCARD_ANY %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_KEYVALUE_DATA:postfix_keyvalue_data} status=%{WORD:postfix_status} %{GREEDYDATA}
+
+# postsuper patterns
+POSTFIX_POSTSUPER_ACTIONS (removed|requeued|placed on hold|released from hold)
+POSTFIX_POSTSUPER_ACTION %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_POSTSUPER_ACTIONS:postfix_postsuper_action}
+POSTFIX_POSTSUPER_SUMMARY_ACTIONS (Deleted|Requeued|Placed on hold|Released from hold)
+POSTFIX_POSTSUPER_SUMMARY %{POSTFIX_POSTSUPER_SUMMARY_ACTIONS:postfix_postsuper_summary_action}: %{NUMBER:postfix_postsuper_summary_count} messages?
+
+# postscreen patterns
+POSTFIX_PS_CONNECT CONNECT from %{POSTFIX_CLIENT_INFO} to \[%{IP:postfix_server_ip}\]:%{INT:postfix_server_port}
+POSTFIX_PS_ACCESS %{POSTFIX_PS_ACCESS_ACTION:postfix_postscreen_access} %{POSTFIX_CLIENT_INFO}
+POSTFIX_PS_NOQUEUE %{POSTFIX_SMTPD_NOQUEUE}
+POSTFIX_PS_TOOBUSY NOQUEUE: reject: CONNECT from %{POSTFIX_CLIENT_INFO}: %{GREEDYDATA:postfix_postscreen_toobusy_data}
+POSTFIX_PS_DNSBL %{POSTFIX_PS_VIOLATION:postfix_postscreen_violation} rank %{INT:postfix_postscreen_dnsbl_rank} for %{POSTFIX_CLIENT_INFO}
+POSTFIX_PS_CACHE cache %{DATA} full cleanup: retained=%{NUMBER:postfix_postscreen_cache_retained} dropped=%{NUMBER:postfix_postscreen_cache_dropped} entries
+POSTFIX_PS_VIOLATIONS %{POSTFIX_PS_VIOLATION:postfix_postscreen_violation}( %{INT})?( after %{NUMBER:postfix_postscreen_violation_time})? from %{POSTFIX_CLIENT_INFO}(( after %{POSTFIX_SMTP_STAGE:postfix_smtp_stage})?(: %{GREEDYDATA:postfix_postscreen_data})?| in tests (after|before) SMTP handshake)
+
+# dnsblog patterns
+POSTFIX_DNSBLOG_LISTING addr %{IP:postfix_client_ip} listed by domain %{HOSTNAME:postfix_dnsbl_domain} as %{IP:postfix_dnsbl_result}
+
+# tlsproxy patterns
+POSTFIX_TLSPROXY_CONN (DIS)?CONNECT( from)? %{POSTFIX_CLIENT_INFO}
+
+# anvil patterns
+POSTFIX_ANVIL_CONN_RATE statistics: max connection rate %{NUMBER:postfix_anvil_conn_rate}/%{POSTFIX_TIME_UNIT:postfix_anvil_conn_period} for \(%{DATA:postfix_service}:%{IP:postfix_client_ip}\) at %{SYSLOGTIMESTAMP:postfix_anvil_timestamp}
+POSTFIX_ANVIL_CONN_CACHE statistics: max cache size %{NUMBER:postfix_anvil_cache_size} at %{SYSLOGTIMESTAMP:postfix_anvil_timestamp}
+POSTFIX_ANVIL_CONN_COUNT statistics: max connection count %{NUMBER:postfix_anvil_conn_count} for \(%{DATA:postfix_service}:%{IP:postfix_client_ip}\) at %{SYSLOGTIMESTAMP:postfix_anvil_timestamp}
+
+# smtp patterns
+POSTFIX_SMTP_DELIVERY %{POSTFIX_KEYVALUE} status=%{WORD:postfix_status}( \(%{GREEDYDATA:postfix_smtp_response}\))?
+POSTFIX_SMTP_CONNERR connect to %{POSTFIX_RELAY_INFO}: (Connection timed out|No route to host|Connection refused|Network is unreachable)
+POSTFIX_SMTP_LOSTCONN %{POSTFIX_QUEUEID:postfix_queueid}: %{POSTFIX_LOSTCONN:postfix_smtp_lostconn_data} with %{POSTFIX_RELAY_INFO}( while %{POSTFIX_LOSTCONN_REASONS:postfix_smtp_lostconn_reason})?
+POSTFIX_SMTP_TIMEOUT %{POSTFIX_QUEUEID:postfix_queueid}: conversation with %{POSTFIX_RELAY_INFO} timed out( while %{POSTFIX_LOSTCONN_REASONS:postfix_smtp_lostconn_reason})?
+POSTFIX_SMTP_RELAYERR %{POSTFIX_QUEUEID:postfix_queueid}: host %{POSTFIX_RELAY_INFO} said: %{GREEDYDATA:postfix_smtp_response} \(in reply to %{POSTFIX_SMTP_STAGE:postfix_smtp_stage} command\)
+
+# master patterns
+POSTFIX_MASTER_START (daemon started|reload) -- version %{DATA:postfix_version}, configuration %{PATH:postfix_config_path}
+POSTFIX_MASTER_EXIT terminating on signal %{INT:postfix_termination_signal}
+
+# bounce patterns
+POSTFIX_BOUNCE_NOTIFICATION %{POSTFIX_QUEUEID:postfix_queueid}: sender (non-delivery|delivery status|delay) notification: %{POSTFIX_QUEUEID:postfix_bounce_queueid}
+
+# scache patterns
+POSTFIX_SCACHE_LOOKUPS statistics: (address|domain) lookup hits=%{INT:postfix_scache_hits} miss=%{INT:postfix_scache_miss} success=%{INT:postfix_scache_success}%
+POSTFIX_SCACHE_SIMULTANEOUS statistics: max simultaneous domains=%{INT:postfix_scache_domains} addresses=%{INT:postfix_scache_addresses} connection=%{INT:postfix_scache_connection}
+POSTFIX_SCACHE_TIMESTAMP statistics: start interval %{SYSLOGTIMESTAMP:postfix_scache_timestamp}
+
+# aggregate all patterns
+POSTFIX_SMTPD %{POSTFIX_SMTPD_CONNECT}|%{POSTFIX_SMTPD_DISCONNECT}|%{POSTFIX_SMTPD_LOSTCONN}|%{POSTFIX_SMTPD_NOQUEUE}|%{POSTFIX_SMTPD_PIPELINING}|%{POSTFIX_TLSCONN}|%{POSTFIX_WARNING}|%{POSTFIX_SMTPD_PROXY}|%{POSTFIX_KEYVALUE}
+POSTFIX_CLEANUP %{POSTFIX_CLEANUP_MILTER}|%{POSTFIX_WARNING}|%{POSTFIX_KEYVALUE}
+POSTFIX_QMGR %{POSTFIX_QMGR_REMOVED}|%{POSTFIX_QMGR_ACTIVE}|%{POSTFIX_QMGR_EXPIRED}|%{POSTFIX_WARNING}
+POSTFIX_PIPE %{POSTFIX_PIPE_ANY}
+POSTFIX_POSTSCREEN %{POSTFIX_PS_CONNECT}|%{POSTFIX_PS_ACCESS}|%{POSTFIX_PS_NOQUEUE}|%{POSTFIX_PS_TOOBUSY}|%{POSTFIX_PS_CACHE}|%{POSTFIX_PS_DNSBL}|%{POSTFIX_PS_VIOLATIONS}|%{POSTFIX_WARNING}
+POSTFIX_DNSBLOG %{POSTFIX_DNSBLOG_LISTING}|%{POSTFIX_WARNING}
+POSTFIX_ANVIL %{POSTFIX_ANVIL_CONN_RATE}|%{POSTFIX_ANVIL_CONN_CACHE}|%{POSTFIX_ANVIL_CONN_COUNT}
+POSTFIX_SMTP %{POSTFIX_SMTP_DELIVERY}|%{POSTFIX_SMTP_CONNERR}|%{POSTFIX_SMTP_LOSTCONN}|%{POSTFIX_SMTP_TIMEOUT}|%{POSTFIX_SMTP_RELAYERR}|%{POSTFIX_TLSCONN}|%{POSTFIX_WARNING}
+POSTFIX_DISCARD %{POSTFIX_DISCARD_ANY}|%{POSTFIX_WARNING}
+POSTFIX_LMTP %{POSTFIX_SMTP}
+POSTFIX_PICKUP %{POSTFIX_KEYVALUE}
+POSTFIX_TLSPROXY %{POSTFIX_TLSPROXY_CONN}|%{POSTFIX_WARNING}
+POSTFIX_MASTER %{POSTFIX_MASTER_START}|%{POSTFIX_MASTER_EXIT}|%{POSTFIX_WARNING}
+POSTFIX_BOUNCE %{POSTFIX_BOUNCE_NOTIFICATION}
+POSTFIX_SENDMAIL %{POSTFIX_WARNING}
+POSTFIX_POSTDROP %{POSTFIX_WARNING}
+POSTFIX_SCACHE %{POSTFIX_SCACHE_LOOKUPS}|%{POSTFIX_SCACHE_SIMULTANEOUS}|%{POSTFIX_SCACHE_TIMESTAMP}
+POSTFIX_TRIVIAL_REWRITE %{POSTFIX_WARNING}
+POSTFIX_TLSMGR %{POSTFIX_WARNING}
+POSTFIX_LOCAL %{POSTFIX_KEYVALUE}
+POSTFIX_VIRTUAL %{POSTFIX_SMTP_DELIVERY}
+POSTFIX_ERROR %{POSTFIX_ERROR_ANY}
+POSTFIX_POSTSUPER %{POSTFIX_POSTSUPER_ACTION}|%{POSTFIX_POSTSUPER_SUMMARY}
diff --git a/freemarker-generator-tools/src/main/resources/patterns/ruby b/freemarker-generator-tools/src/main/resources/patterns/ruby
new file mode 100755
index 0000000..9e5aa5b
--- /dev/null
+++ b/freemarker-generator-tools/src/main/resources/patterns/ruby
@@ -0,0 +1,3 @@
+# Forked from https://github.com/elasticsearch/logstash/tree/v1.4.0/patterns
+RUBY_LOGLEVEL (?:DEBUG|FATAL|ERROR|WARN|INFO)
+RUBY_LOGGER [DFEWI], \[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid}\] *%{RUBY_LOGLEVEL:loglevel} -- +%{DATA:progname}: %{GREEDYDATA:message}
diff --git a/freemarker-generator-tools/src/test/data/csv/contract.csv b/freemarker-generator-tools/src/test/data/csv/contract.csv
new file mode 100644
index 0000000..6ce0d00
--- /dev/null
+++ b/freemarker-generator-tools/src/test/data/csv/contract.csv
@@ -0,0 +1,23 @@
+contract_id,seller_company_name,customer_company_name,customer_duns_number,contract_affiliate,FERC_tariff_reference,contract_service_agreement_id,contract_execution_date,contract_commencement_date,contract_termination_date,actual_termination_date,extension_provision_description,class_name,term_name,increment_name,increment_peaking_name,product_type_name,product_name,quantity,units_for_contract,rate,rate_minimum,rate_maximum,rate_description,units_for_rate,point_of_receipt_control_area,point_of_receipt_specific_location,point_of_delivery_control_area,point_of_delivery_specific_location,begin_date,end_date,time_zone
+C71,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Original Volume No. 10,2,2/15/2001,2/15/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,,,,,,ES
+C72,The Electric Company,Utility A,38495837,n,FERC Electric Tariff Original Volume No. 10,15,7/25/2001,8/1/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,,,,,,ES
+C73,The Electric Company,Utility B,493758794,N,FERC Electric Tariff Original Volume No. 10,7,6/8/2001,7/6/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,, , ,,,ep
+C74,The Electric Company,Utility C,594739573,n,FERC Electric Tariff Original Volume No. 10,25,6/8/2001,7/6/2001,,,Evergreen,N/A,N/A,N/A,N/A,MB,ENERGY,0,, , , ,Market Based,,,, , ,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,ENERGY,2000,KWh,.1475, , ,Max amount of capacity and energy to be transmitted.  Bill based on monthly max delivery to City.,$/KWh,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,point-to-point agreement,2000,KW,0.01, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,network,2000,KW,0.2, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,BLACK START SERVICE,2000,KW,0.22, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,CAPACITY,2000,KW,0.04, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,regulation & frequency response,2000,KW,0.1, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C75,The Electric Company,The Power Company,456543333,N,FERC Electric Tariff Third Revised Volume No. 7,94,2/13/2001,7/1/2001,12/31/2006,,None,F,LT,M,P,T,real power transmission loss,2000,KW,7, , ,,$/kw-mo,PJM,Point A,PJM,Point B,,,ep
+C76,The Electric Company,The Power Company,456534333,N,FERC Electric Tariff Original Volume No. 10,132,12/15/2001,1/1/2002,12/31/2004,12/31/2004,None,F,LT,M,FP,MB,CAPACITY,70,MW,3750, , ,70MW for each and every hour over the term of the agreement (7x24 schedule).,$/MW,,,,,,,ep
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,35, , ,,$/MWH,,,PJM,Bus 4321,20020101,20030101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,37, , ,,$/MWH,,,PJM,Bus 4321,20030101,20040101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,39, , ,,$/MWH,,,PJM,Bus 4321,20040101,20050101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,41, , ,,$/MWH,,,PJM,Bus 4321,20050101,20060101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,43, , ,,$/MWH,,,PJM,Bus 4321,20060101,20070101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,45, , ,,$/MWH,,,PJM,Bus 4321,20070101,20080101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,47, , ,,$/MWH,,,PJM,Bus 4321,20080101,20090101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,49, , ,,$/MWH,,,PJM,Bus 4321,20090101,20100101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,51, , ,,$/MWH,,,PJM,Bus 4321,20100101,20110101,EP
+C78,The Electric Company,"The Electric Marketing Co., LLC",23456789,Y,FERC Electric Tariff Original Volume No. 2,Service Agreement 1,1/2/1992,1/2/1992,1/1/2012,,Renewable annually by mutual agreement after termination date.,UP,LT,Y,FP,CB,ENERGY,0,MWH,53, , ,,$/MWH,,,PJM,Bus 4321,20110101,20120101,EP
diff --git a/freemarker-generator-tools/src/test/data/csv/excel-export-utf8.csv b/freemarker-generator-tools/src/test/data/csv/excel-export-utf8.csv
new file mode 100644
index 0000000..8022365
--- /dev/null
+++ b/freemarker-generator-tools/src/test/data/csv/excel-export-utf8.csv
@@ -0,0 +1,3 @@
+Text;Date;Number;Currency;Time;Percentage;Forumula
+Row 1;01.01.17;100,00;€100,00;10:00;50,00%;50
+Row 2;01.01.17;100,00;€100,00;10:00;50,00%;50
\ No newline at end of file
diff --git a/freemarker-generator-tools/src/test/data/excel/test-multiple-sheets.xlsx b/freemarker-generator-tools/src/test/data/excel/test-multiple-sheets.xlsx
new file mode 100644
index 0000000..6fe449a
--- /dev/null
+++ b/freemarker-generator-tools/src/test/data/excel/test-multiple-sheets.xlsx
Binary files differ
diff --git a/freemarker-generator-tools/src/test/data/excel/test.xls b/freemarker-generator-tools/src/test/data/excel/test.xls
new file mode 100644
index 0000000..df48479
--- /dev/null
+++ b/freemarker-generator-tools/src/test/data/excel/test.xls
Binary files differ
diff --git a/freemarker-generator-tools/src/test/data/excel/test.xlsx b/freemarker-generator-tools/src/test/data/excel/test.xlsx
new file mode 100644
index 0000000..b79f954
--- /dev/null
+++ b/freemarker-generator-tools/src/test/data/excel/test.xlsx
Binary files differ
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
new file mode 100644
index 0000000..770309e
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.commonscsv;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.csv.CSVRecord;
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+import static junit.framework.TestCase.assertTrue;
+import static org.apache.commons.csv.CSVFormat.DEFAULT;
+import static org.apache.commons.csv.CSVFormat.EXCEL;
+
+public class CommonsCSVToolTest {
+
+    private static final String ANY_KEY = "C71";
+    private static final String CONTRACT_ID = "contract_id";
+    private static final int CONTRACT_ID_IDX = 0;
+    private static final File BOM_CSV = new File("./src/test/data/csv/excel-export-utf8.csv");
+    private static final File TEST_CSV = new File("./src/test/data/csv/contract.csv");
+
+    @Test
+    public void shallParseCvsFile() throws IOException {
+        try (CSVParser parser = commonsCsvTool().parse(document(), DEFAULT.withHeader())) {
+            assertNotNull(parser);
+            assertEquals(32, parser.getHeaderMap().size());
+            assertEquals(22, parser.getRecords().size());
+        }
+    }
+
+    @Test
+    public void shallParseCvsString() throws IOException {
+        try (CSVParser parser = commonsCsvTool().parse(document().getText(), DEFAULT.withHeader())) {
+            assertNotNull(parser);
+            assertEquals(32, parser.getHeaderMap().size());
+            assertEquals(22, parser.getRecords().size());
+        }
+    }
+
+    @Test
+    public void shallGetKeysFromCsvRecords() throws IOException {
+        final CommonsCSVTool commonsCsvTool = commonsCsvTool();
+        final List<String> keys;
+
+        try (CSVParser parser = commonsCsvTool.parse(document(), DEFAULT.withHeader())) {
+            keys = commonsCsvTool.toKeys(parser.getRecords(), CONTRACT_ID);
+        }
+
+        assertEquals(7, keys.size());
+        assertEquals(7, keys.size());
+        assertEquals("C71", keys.get(0));
+        assertEquals("C72", keys.get(1));
+        assertEquals("C73", keys.get(2));
+        assertEquals("C74", keys.get(3));
+        assertEquals("C75", keys.get(4));
+        assertEquals("C76", keys.get(5));
+        assertEquals("C78", keys.get(6));
+    }
+
+    @Test
+    public void shallCreateMapFromCsvRecords() throws IOException {
+        final CommonsCSVTool commonsCsvTool = commonsCsvTool();
+        final Map<String, CSVRecord> map;
+
+        try (CSVParser parser = commonsCsvTool.parse(document(), DEFAULT.withHeader())) {
+            map = commonsCsvTool.toMap(parser.getRecords(), CONTRACT_ID);
+        }
+
+        assertEquals(7, map.size());
+        assertEquals(ANY_KEY, map.get(ANY_KEY).get(CONTRACT_ID_IDX));
+    }
+
+    @Test
+    public void shallCreateMultiMapFromCsvRecords() throws IOException {
+        final CommonsCSVTool commonsCsvTool = commonsCsvTool();
+        final Map<String, List<CSVRecord>> map;
+
+        try (CSVParser parser = commonsCsvTool.parse(document(), DEFAULT.withHeader())) {
+            map = commonsCsvTool.toMultiMap(parser.getRecords(), CONTRACT_ID);
+        }
+
+        assertEquals(7, map.size());
+        assertEquals(ANY_KEY, map.get(ANY_KEY).get(0).get(CONTRACT_ID_IDX));
+    }
+
+    @Test
+    public void shallPrintCsvRecords() throws IOException {
+        final CommonsCSVTool commonsCsvTool = commonsCsvTool();
+        final CSVFormat cvsFormat = DEFAULT.withHeader();
+        final Writer writer = new StringWriter();
+
+        try (CSVParser parser = commonsCsvTool.parse(document(), cvsFormat)) {
+            try (CSVPrinter printer = commonsCsvTool.printer(cvsFormat, writer)) {
+                printer.printRecord(parser.getHeaderMap());
+            }
+        }
+
+        assertTrue(writer.toString().contains(CONTRACT_ID));
+    }
+
+    @Test
+    public void shallStripBomFromCsvFile() throws IOException {
+        try (CSVParser parser = commonsCsvTool().parse(document(BOM_CSV), EXCEL.withHeader().withDelimiter(';'))) {
+            assertEquals("Text", parser.getHeaderNames().get(0));
+        }
+    }
+
+    @Test
+    public void shallConvertToCsvDelimiter() {
+        assertEquals(' ', commonsCsvTool().toDelimiter("space"));
+        assertEquals(' ', commonsCsvTool().toDelimiter("SPACE"));
+        assertEquals('^', commonsCsvTool().toDelimiter("^"));
+    }
+
+    private Document document() {
+        return document(TEST_CSV);
+    }
+
+    private Document document(File file) {
+        return DocumentFactory.create(file, UTF_8);
+    }
+
+    private CommonsCSVTool commonsCsvTool() {
+        return new CommonsCSVTool();
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonsexec/CommonsExecToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonsexec/CommonsExecToolTest.java
new file mode 100644
index 0000000..aa1ce62
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonsexec/CommonsExecToolTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.commonsexec;
+
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static junit.framework.TestCase.assertFalse;
+
+public class CommonsExecToolTest {
+
+    // The "date" command should work on all platforms
+    private static final String ANY_EXECUTABLE = "date";
+
+    @Test
+    public void shallExecuteCommand() {
+        final String result = commonsExecTool().execute(ANY_EXECUTABLE, Collections.emptyList());
+
+        assertFalse(result.isEmpty());
+    }
+
+    @Test
+    public void shallExecuteCommandLine() {
+        final String result = commonsExecTool().execute(ANY_EXECUTABLE);
+
+        assertFalse(result.isEmpty());
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void shallThrowExecptionForUnknownCommand() {
+        commonsExecTool().execute("does-not-exist");
+    }
+
+    private CommonsExecTool commonsExecTool() {
+        return new CommonsExecTool();
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/excel/ExcelToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/excel/ExcelToolTest.java
new file mode 100644
index 0000000..9003a38
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/excel/ExcelToolTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.excel;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static junit.framework.TestCase.assertEquals;
+
+public class ExcelToolTest {
+
+    private final File TEST_XLS = new File("./src/test/data/excel/test.xls");
+    private final File TEST_XLSX = new File("./src/test/data/excel/test.xlsx");
+    private final File MULTIPLE_SHEETS_XSLX_FILE = new File("./src/test/data/excel/test-multiple-sheets.xlsx");
+
+    @Test
+    public void shallParseXlsFile() {
+        final Workbook workbook = workbook(TEST_XLS);
+
+        final List<Sheet> sheets = excelTool().getSheets(workbook);
+        final List<List<String>> records = excelTool().toTable(sheets.get(0));
+
+        assertEquals(1, sheets.size());
+        assertEquals(3, records.size());
+    }
+
+    @Test
+    public void shallParseXlsxFile() {
+        final Workbook workbook = workbook(TEST_XLSX);
+
+        final List<Sheet> sheets = excelTool().getSheets(workbook);
+        final List<List<String>> records = excelTool().toTable(sheets.get(0));
+
+        assertEquals(1, sheets.size());
+        assertEquals(3, records.size());
+    }
+
+    @Test
+    public void shallParseMultiSheetExcel() {
+        final Workbook workbook = workbook(MULTIPLE_SHEETS_XSLX_FILE);
+
+        final List<Sheet> sheets = excelTool().getSheets(workbook);
+
+        assertEquals(2, sheets.size());
+        assertEquals(3, excelTool().toTable(sheets.get(0)).size());
+        assertEquals(2, excelTool().toTable(sheets.get(1)).size());
+    }
+
+    @Test
+    public void shouldConvertSheetToTable() {
+        final Workbook workbook = workbook(TEST_XLSX);
+        final List<Sheet> sheets = excelTool().getSheets(workbook);
+        final List<List<String>> records = excelTool().toTable(sheets.get(0));
+
+        final List<String> record = records.get(1);
+
+        assertEquals("Row 1", record.get(0));
+        assertEquals("01/31/17", record.get(1));
+        assertEquals("100.00", record.get(2));
+        assertEquals("€100.00", record.get(3));
+        assertEquals("11:00", record.get(4));
+        assertEquals("10.00%", record.get(5));
+        assertEquals("C2*F2", record.get(6));
+    }
+
+    @Test
+    public void shouldConvertSheetToRawTable() {
+        final Workbook workbook = workbook(TEST_XLSX);
+        final List<Sheet> sheets = excelTool().getSheets(workbook);
+        final List<List<Object>> records = excelTool().toRawTable(sheets.get(0));
+
+        final List<Object> record = records.get(1);
+
+        assertEquals("Row 1", record.get(0));
+        assertEquals("2017-01-31", record.get(1).toString());
+        assertEquals(100.00, record.get(2));
+        assertEquals(100.00, record.get(2));
+        assertEquals("11:00", record.get(4).toString());
+        assertEquals(0.1, record.get(5));
+        assertEquals("C2*F2", record.get(6));
+    }
+
+    private Workbook workbook(File file) {
+        return excelTool().parse(document(file));
+    }
+
+    private ExcelTool excelTool() {
+        return new ExcelTool();
+    }
+
+    private Document document(File file) {
+        return DocumentFactory.create(file, UTF_8);
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/freemarker/FreeMarkerToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/freemarker/FreeMarkerToolTest.java
new file mode 100644
index 0000000..d585945
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/freemarker/FreeMarkerToolTest.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.freemarker;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertNotNull;
+
+public class FreeMarkerToolTest {
+
+    @Test
+    public void shallGetBeansWrapper() {
+        assertNotNull(freeMarkerTool().getBeansWrapper());
+    }
+
+    @Test
+    public void shallGetObjectConstructor() {
+        assertNotNull(freeMarkerTool().getObjectConstructor());
+    }
+
+    @Test
+    public void shallGetEnums() {
+        assertNotNull(freeMarkerTool().getEnums());
+    }
+
+    @Test
+    public void shallGetStatics() {
+        assertNotNull(freeMarkerTool().getStatics());
+    }
+
+    private FreeMarkerTool freeMarkerTool() {
+        return new FreeMarkerTool();
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/grok/GrokToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/grok/GrokToolTest.java
new file mode 100644
index 0000000..2bf21dc
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/grok/GrokToolTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.grok;
+
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class GrokToolTest {
+
+    private static final String LOG = "112.169.19.192 - - [06/Mar/2013:01:36:30 +0900] \"GET / HTTP/1.1\" 200 44346 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22\"";
+
+    @Test
+    public void shallParseCombinedAccessLog() {
+        final GrokWrapper grok = grokTool().compile("%{COMBINEDAPACHELOG}");
+
+        final Map<String, Object> map = grok.match(LOG);
+
+        assertEquals("GET", map.get("verb"));
+        assertEquals("06/Mar/2013:01:36:30 +0900", map.get("timestamp"));
+        assertEquals("44346", map.get("bytes"));
+        assertEquals("/", map.get("request"));
+        assertEquals("1.1", map.get("httpversion"));
+    }
+
+    private GrokTool grokTool() {
+        return new GrokTool();
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java
new file mode 100644
index 0000000..aaed1b5
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.jsonpath;
+
+import com.jayway.jsonpath.DocumentContext;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNull;
+
+public class JsonPathToolTest {
+
+    private static final String JSON_OBJECT_STRING = "{\n" +
+            "\"id\": 110,\n" +
+            "\"language\": \"Python\",\n" +
+            "\"price\": 1900,\n" +
+            "}";
+
+    private static final String JSON_ARRAY_STRING = "{\n" +
+            "   \"eBooks\":[\n" +
+            "      {\n" +
+            "         \"language\":\"Pascal\",\n" +
+            "         \"edition\":\"third\"\n" +
+            "      },\n" +
+            "      {\n" +
+            "         \"language\":\"Python\",\n" +
+            "         \"edition\":\"four\"\n" +
+            "      },\n" +
+            "      {\n" +
+            "         \"language\":\"SQL\",\n" +
+            "         \"edition\":\"second\"\n" +
+            "      }\n" +
+            "   ]\n" +
+            "}";
+
+    private static final String JSON_WITH_COMMENTS = "{\n" +
+            "    // Single line comment\n" +
+            "    \"fruit\": \"Apple\",\n" +
+            "    \"size\": \"Large\",\n" +
+            "    \"color\": \"Red\"\n" +
+            "}";
+
+    @Test
+    public void shallParseJsonObject() {
+        final DocumentContext json = parse(JSON_OBJECT_STRING);
+
+        assertEquals(json.read("$.language"), "Python");
+        assertEquals(json.read("$['language']"), "Python");
+    }
+
+    @Test
+    public void shallParseJsonArray() {
+        final DocumentContext json = parse(JSON_ARRAY_STRING);
+
+        assertEquals(json.read("$.eBooks[0].language"), "Pascal");
+        assertEquals(json.read("$['eBooks'][0]['language']"), "Pascal");
+    }
+
+    @Test
+    public void failsToParseJsonComments() {
+        final DocumentContext json = parse(JSON_WITH_COMMENTS);
+
+        assertNull(json.read("$.fruit"));
+        assertEquals("Large", json.read("$.size"));
+    }
+
+    @Test
+    public void shallSuppressExceptionForUnknonwPath() {
+        assertNull(parse(JSON_OBJECT_STRING).read("$.unknown"));
+    }
+
+    private DocumentContext parse(String json) {
+        return jsonPathTool().parse(json);
+    }
+
+    private JsonPathTool jsonPathTool() {
+        return new JsonPathTool();
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsoup/JsoupToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsoup/JsoupToolTest.java
new file mode 100644
index 0000000..a8f3a61
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsoup/JsoupToolTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.jsoup;
+
+import org.jsoup.nodes.Document;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNull;
+
+public class JsoupToolTest {
+
+    private static final String ANY_HTML_CONTENT = "<!DOCTYPE html>\n" +
+            "<html lang=\"en\">\n" +
+            "  <head>\n" +
+            "    <meta charset=\"utf-8\">\n" +
+            "    <title>title</title>\n" +
+            "    <link rel=\"stylesheet\" href=\"style.css\">\n" +
+            "    <script src=\"script.js\"></script>\n" +
+            "  </head>\n" +
+            "  <body>\n" +
+            "    <h1>Hello World</h1>\n" +
+            "  </body>\n" +
+            "</html>";
+
+    @Test
+    public void shallParseStringHtmlContent() {
+        assertEquals("Hello World", parse(ANY_HTML_CONTENT).select("h1").first().text());
+    }
+
+    @Test
+    public void shallReturnNullForUndefinedCSSPath() {
+        assertNull(parse(ANY_HTML_CONTENT).select("h2").first());
+    }
+
+    private Document parse(String html) {
+        return jsoupTool().parse(html);
+    }
+
+    private JsoupTool jsoupTool() {
+        return new JsoupTool();
+    }
+
+
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/properties/PropertiesToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/properties/PropertiesToolTest.java
new file mode 100644
index 0000000..8e010e7
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/properties/PropertiesToolTest.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.properties;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class PropertiesToolTest {
+
+    private static final String ANY_PROPERTIES_STRING = "foo=bar";
+
+    @Test
+    public void shallParsePropertiesDocument() {
+        try (Document document = document(ANY_PROPERTIES_STRING)) {
+            assertEquals("bar", propertiesTool().parse(document).getProperty("foo"));
+        }
+    }
+
+    @Test
+    public void shallParsePropertiesString() {
+        assertEquals("bar", propertiesTool().parse(ANY_PROPERTIES_STRING).getProperty("foo"));
+    }
+
+    private PropertiesTool propertiesTool() {
+        return new PropertiesTool();
+    }
+
+    private Document document(String value) {
+        return DocumentFactory.create("test.properties", value);
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlToolTest.java
new file mode 100644
index 0000000..4a522b6
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlToolTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.snakeyaml;
+
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class SnakeYamlToolTest {
+
+    private static final String ANY_YAML_STRING = "docker:\n" +
+            "    - image: ubuntu:14.04\n" +
+            "    - image: mongo:2.6.8\n" +
+            "      command: [mongod, --smallfiles]\n" +
+            "    - image: postgres:9.4.1";
+
+    @Test
+    public void shallParseYamlDocument() {
+        try (Document document = document(ANY_YAML_STRING)) {
+            final Map<String, Object> map = snakeYamlTool().parse(document);
+
+            assertEquals(1, map.size());
+            assertEquals(3, ((List<?>) map.get("docker")).size());
+        }
+    }
+
+    @Test
+    public void shallParseYamlString() {
+        final Map<String, Object> map = snakeYamlTool().parse(ANY_YAML_STRING);
+
+        assertEquals(1, map.size());
+        assertEquals(3, ((List<?>) map.get("docker")).size());
+    }
+
+    private SnakeYamlTool snakeYamlTool() {
+        return new SnakeYamlTool();
+    }
+
+    private Document document(String value) {
+        return DocumentFactory.create("test.yml", value);
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/system/SystemToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/system/SystemToolTest.java
new file mode 100644
index 0000000..46323be
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/system/SystemToolTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.system;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+
+public class SystemToolTest {
+
+    @Test
+    public void shallGetProperties() {
+        assertFalse(systemTool().getSystemProperties().isEmpty());
+    }
+
+    @Test
+    public void shallGetEnvs() {
+        assertFalse(systemTool().getEnvs().isEmpty());
+    }
+
+    @Test
+    public void shallGetHostName() {
+        assertFalse(systemTool().getHostName().isEmpty());
+    }
+
+    private SystemTool systemTool() {
+        return new SystemTool();
+    }
+
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/uuid/UUIDToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/uuid/UUIDToolTest.java
new file mode 100644
index 0000000..5130240
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/uuid/UUIDToolTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.uuid;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+
+public class UUIDToolTest {
+
+    @Test
+    public void shallCreateRandomUUID() {
+        assertNotNull(uuidTool().randomUUID());
+    }
+
+    @Test
+    public void shallCreateNamedUUID() {
+        assertEquals("b068931c-c450-342b-a3f5-b3d276ea4297", uuidTool().namedUUID("name").toString());
+    }
+
+    private UUIDTool uuidTool() {
+        return new UUIDTool();
+    }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/xml/XmlToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/xml/XmlToolTest.java
new file mode 100644
index 0000000..de69881
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/xml/XmlToolTest.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.xml;
+
+import freemarker.ext.dom.NodeModel;
+import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+
+public class XmlToolTest {
+
+    private static final String ANY_XML_STRING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+            "<note>\n" +
+            "  <to>Tove</to>\n" +
+            "  <from>Jani</from>\n" +
+            "  <heading>Reminder</heading>\n" +
+            "  <body>Don't forget me this weekend!</body>\n" +
+            "</note>";
+
+    @Test
+    public void shallParseXmlDocument() throws Exception {
+        try (Document document = document(ANY_XML_STRING)) {
+            final NodeModel model = xmlTool().parse(document);
+
+            assertNotNull(model);
+            assertEquals(1, model.getChildNodes().size());
+        }
+    }
+
+    @Test
+    public void shallParseXmlString() throws Exception {
+        final NodeModel model = xmlTool().parse(ANY_XML_STRING);
+
+        assertNotNull(model);
+        assertEquals(1, model.getChildNodes().size());
+    }
+
+    private XmlTool xmlTool() {
+        return new XmlTool();
+    }
+
+    private Document document(String value) {
+        return DocumentFactory.create("test.xml", value);
+    }
+}
diff --git a/pom.xml b/pom.xml
index 7e826cb..e5a5d73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,182 +1,271 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
 
-  <groupId>org.apache.freemarker</groupId>
-  <artifactId>freemarker-generator-maven-plugin</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
+       http://www.apache.org/licenses/LICENSE-2.0
 
-  <name>Freemarker Generator Maven Plugin</name>
-  <url>http://freemarker.apache.org/</url>
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
 
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.compiler.source>1.8</maven.compiler.source>
-    <maven.compiler.target>1.8</maven.compiler.target>
-    <maven-core.version>3.5.2</maven-core.version>
-    <maven-plugin-api.version>3.5.2</maven-plugin-api.version>
-    <maven-plugin-annotations.version>3.5</maven-plugin-annotations.version>
-    <fastutil.version>8.1.0</fastutil.version>
-    <freemarker.version>2.3.29</freemarker.version>
-    <gson.version>2.8.6</gson.version>
-    <jmockit.version>1.32</jmockit.version>
-    <org.testng.version>6.8</org.testng.version>
-    <assertj-core.version>3.8.0</assertj-core.version>
-    <clover-target-percentage>100</clover-target-percentage>
-    <clover-phase>pre-site</clover-phase>
-    <target-jdk-version>1.8</target-jdk-version>
-  </properties>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>23</version>
+    </parent>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
-      <version>${maven-core.version}</version>
-      <scope>provided</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.plexus</groupId>
-          <artifactId>plexus-utils</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>${maven-plugin-api.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.plugin-tools</groupId>
-      <artifactId>maven-plugin-annotations</artifactId>
-      <version>${maven-plugin-annotations.version}</version>
-      <scope>provided</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.maven</groupId>
-          <artifactId>maven-artifact</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.sisu</groupId>
-      <artifactId>org.eclipse.sisu.plexus</artifactId>
-      <version>0.3.3</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.codehaus.plexus</groupId>
-          <artifactId>plexus-utils</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.jmockit</groupId>
-      <artifactId>jmockit</artifactId>
-      <version>${jmockit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-      <version>${gson.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.freemarker</groupId>
-      <artifactId>freemarker</artifactId>
-      <version>${freemarker.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.testng</groupId>
-      <artifactId>testng</artifactId>
-      <version>${org.testng.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <version>${assertj-core.version}</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
+    <groupId>org.apache.freemarker.generator</groupId>
+    <artifactId>freemarker-generator</artifactId>
+    <packaging>pom</packaging>
+    <version>0.1.0-SNAPSHOT</version>
+    <name>Apache FreeMarker Generator: Parent</name>
+    <url>https://freemarker.apache.org/</url>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-site-plugin</artifactId>
-        <version>3.7.1</version>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>3.0.0</version>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.8.1</version>
-        <configuration>
-          <source>1.8</source>
-          <target>1.8</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-source-plugin</artifactId>
-        <version>3.2.0</version>
-        <executions>
-          <execution>
-            <id>attach-sources</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>3.6.0</version>
-        <configuration>
-          <goalPrefix>freemarker</goalPrefix>
-        </configuration>
-        <executions>
-          <execution>
-            <id>default-descriptor</id>
-            <goals>
-              <goal>descriptor</goal>
-            </goals>
-            <phase>process-classes</phase>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.openclover</groupId>
-        <artifactId>clover-maven-plugin</artifactId>
-        <version>4.2.0</version>
-        <executions>
-          <execution>
-            <id>clover</id>
-            <phase>${clover-phase}</phase>
-            <goals>
-              <goal>instrument-test</goal>
-              <goal>clover</goal>
-              <goal>check</goal>
-            </goals>
-            <configuration>
-              <targetPercentage>${clover-target-percentage}</targetPercentage>
-              <generateHtml>true</generateHtml>
-              <generateXml>true</generateXml>
-              <jdk>${target-jdk-version}</jdk>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
+    <issueManagement>
+        <system>jira</system>
+        <url>https://issues.apache.org/jira/browse/FREEMARKER/</url>
+    </issueManagement>
+
+    <mailingLists>
+        <mailingList>
+            <name>FreeMarker developer list</name>
+            <post>dev@freemarker.apache.org</post>
+            <subscribe>dev-subscribe@freemarker.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@freemarker.apache.org</unsubscribe>
+            <archive>http://mail-archives.apache.org/mod_mbox/freemarker-dev/</archive>
+        </mailingList>
+        <mailingList>
+            <name>FreeMarker commit and Jira notifications list</name>
+            <post>notifications@freemarker.apache.org</post>
+            <subscribe>notifications-subscribe@freemarker.apache.org</subscribe>
+            <unsubscribe>notifications-unsubscribe@freemarker.apache.org</unsubscribe>
+            <archive>http://mail-archives.apache.org/mod_mbox/freemarker-notifications/</archive>
+        </mailingList>
+        <mailingList>
+            <name>FreeMarker management private</name>
+            <post>private@freemarker.apache.org</post>
+        </mailingList>
+    </mailingLists>
+
+    <scm>
+        <connection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker-generator.git</connection>
+        <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker-generator.git
+        </developerConnection>
+        <url>https://git-wip-us.apache.org/repos/asf?p=freemarker-generator.git</url>
+        <tag />
+    </scm>
+
+    <modules>
+        <module>freemarker-generator-base</module>
+        <module>freemarker-generator-tools</module>
+        <module>freemarker-generator-cli</module>
+        <module>freemarker-generator-maven-plugin</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <freemarker.version>2.3.29</freemarker.version>
+    </properties>
+
+    <developers>
+        <developer>
+            <name>Siegfried Goeschl</name>
+            <organization>ASF</organization>
+            <organizationUrl>https://github.com/sgoeschl</organizationUrl>
+        </developer>
+    </developers>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.freemarker</groupId>
+                <artifactId>freemarker</artifactId>
+                <version>${freemarker.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>2.6</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.activation</groupId>
+                <artifactId>activation</artifactId>
+                <version>1.1.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>1.7.28</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-simple</artifactId>
+                <version>1.7.28</version>
+            </dependency>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>4.13</version>
+                <scope>test</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <artifactId>maven-antrun-plugin</artifactId>
+                    <version>1.8</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-assembly-plugin</artifactId>
+                    <version>3.2.0</version>                    
+                </plugin>
+                <plugin>
+                    <artifactId>maven-clean-plugin</artifactId>
+                    <version>3.1.0</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.8.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-gpg-plugin</artifactId>
+                    <version>1.6</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>3.0.0-M1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>3.1.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-plugin-plugin</artifactId>
+                    <version>3.6.0</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-pmd-plugin</artifactId>
+                    <version>3.12.0</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-project-info-reports-plugin</artifactId>
+                    <version>3.0.0</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>2.5.3</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>3.1.0</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-site-plugin</artifactId>
+                    <version>3.7.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>3.2.0</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.19</version>
+                    <configuration>
+                        <useSystemClassLoader>false</useSystemClassLoader>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>appassembler-maven-plugin</artifactId>
+                    <version>1.10</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.openclover</groupId>
+                    <artifactId>clover-maven-plugin</artifactId>
+                    <version>4.2.0</version>
+                </plugin>
+                <plugin>
+                    <groupId>pl.project13.maven</groupId>
+                    <artifactId>git-commit-id-plugin</artifactId>
+                    <version>2.2.6</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.rat</groupId>
+                    <artifactId>apache-rat-plugin</artifactId>
+                    <version>0.13</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${maven.compiler.source}</source>
+                    <target>${maven.compiler.target}</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-release-plugin</artifactId>
+                <configuration>
+                    <arguments>-Dmaven.javadoc.skip=true</arguments>
+                    <autoVersionSubmodules>true</autoVersionSubmodules>
+                    <localCheckout>true</localCheckout>
+                    <releaseProfiles>release</releaseProfiles>
+                    <pushChanges>false</pushChanges>
+                    <goals>deploy</goals>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-pmd-plugin</artifactId>
+                <configuration>
+                    <linkXRef>false</linkXRef>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>*.md</exclude>
+                        <excludde>**/*.json</excludde>
+                        <excludde>**/*.csv</excludde>
+                    </excludes>
+                </configuration>
+            </plugin>            
+        </plugins>
+    </reporting>
+</project>
\ No newline at end of file
diff --git a/src/main/java/org/apache/freemarker/generator/FreeMarkerMojo.java b/src/main/java/org/apache/freemarker/generator/FreeMarkerMojo.java
deleted file mode 100644
index 5b0454a..0000000
--- a/src/main/java/org/apache/freemarker/generator/FreeMarkerMojo.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import java.io.File;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecution;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-
-import freemarker.cache.FileTemplateLoader;
-import freemarker.template.Configuration;
-
-@Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
-public class FreeMarkerMojo extends AbstractMojo {
-
-  /** FreeMarker version string used to build FreeMarker Configuration instance. */
-  @Parameter
-  private String freeMarkerVersion;
-
-  @Parameter(defaultValue = "src/main/freemarker/generator")
-  private File sourceDirectory;
-
-  @Parameter(defaultValue = "src/main/freemarker/generator/template")
-  private File templateDirectory;
-
-  @Parameter(defaultValue = "src/main/freemarker/generator/generator")
-  private File generatorDirectory;
-
-  @Parameter(defaultValue = "target/generated-sources/freemarker/generator")
-  private File outputDirectory;
-
-  @Parameter(defaultValue = "${session}", readonly = true)
-  private MavenSession session;
-
-  @Parameter(defaultValue = "${mojoExecution}", readonly = true)
-  private MojoExecution mojo;
-
-  @Override
-  public void execute() throws MojoExecutionException, MojoFailureException {
-
-    if (freeMarkerVersion == null || freeMarkerVersion.length() == 0) {
-      throw new MojoExecutionException("freeMarkerVersion is required");
-    }
-
-    if (!generatorDirectory.isDirectory()) {
-      throw new MojoExecutionException("Required directory does not exist: " + generatorDirectory);
-    }
-
-    Configuration config = FactoryUtil.createConfiguration(freeMarkerVersion);
-
-    config.setDefaultEncoding("UTF-8");
-
-    if (!templateDirectory.isDirectory()) {
-      throw new MojoExecutionException("Required directory does not exist: " + templateDirectory);
-    }
-    try {
-      config.setTemplateLoader(new FileTemplateLoader(templateDirectory));
-    } catch (Throwable t) {
-      getLog().error("Could not establish file template loader for directory: " + templateDirectory, t);
-      throw new MojoExecutionException("Could not establish file template loader for directory: " + templateDirectory);
-    }
-
-    File freeMarkerProps = FactoryUtil.createFile(sourceDirectory, "freemarker.properties");
-    if (freeMarkerProps.isFile()) {
-      Properties configProperties = new Properties();
-      try (InputStream is = FactoryUtil.createFileInputStream(freeMarkerProps)) {
-        configProperties.load(is);
-      } catch (Throwable t) {
-        getLog().error("Failed to load " + freeMarkerProps, t);
-        throw new MojoExecutionException("Failed to load " + freeMarkerProps);
-      }
-      try {
-        config.setSettings(configProperties);
-      } catch (Throwable t) {
-        getLog().error("Invalid setting(s) in " + freeMarkerProps, t);
-        throw new MojoExecutionException("Invalid setting(s) in " + freeMarkerProps);
-      }
-    }
-    
-    if ("generate-sources".equals(mojo.getLifecyclePhase())) {
-      session.getCurrentProject().addCompileSourceRoot(outputDirectory.toString());
-    } else if ("generate-test-sources".equals(mojo.getLifecyclePhase())) {
-      session.getCurrentProject().addTestCompileSourceRoot(outputDirectory.toString());
-    }
-
-    Map<String, OutputGeneratorPropertiesProvider> extensionToBuilders = new HashMap<>(1);
-    extensionToBuilders.put(".json", JsonPropertiesProvider.create(generatorDirectory,templateDirectory,outputDirectory));
-
-    GeneratingFileVisitor fileVisitor = GeneratingFileVisitor.create(config, session, extensionToBuilders);
-    try {
-      Files.walkFileTree(generatorDirectory.toPath(), fileVisitor);
-    } catch (Throwable t) {
-      getLog().error("Failed to process files in generator dir: " + generatorDirectory, t);
-      throw new MojoExecutionException("Failed to process files in generator dir: " + generatorDirectory);
-    }
-  }
-}
diff --git a/src/main/java/org/apache/freemarker/generator/GeneratingFileVisitor.java b/src/main/java/org/apache/freemarker/generator/GeneratingFileVisitor.java
deleted file mode 100644
index a130257..0000000
--- a/src/main/java/org/apache/freemarker/generator/GeneratingFileVisitor.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import java.nio.file.FileVisitResult;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Map;
-
-import org.apache.maven.execution.MavenSession;
-
-import freemarker.template.Configuration;
-
-/**
- * FileVisitor designed to process json data files. The json file parsed into
- * a map and given to FreeMarker to 
- */
-public class GeneratingFileVisitor extends SimpleFileVisitor<Path> {
-
-  private final Configuration config;
-  private final MavenSession session;
-  private final long pomLastModifiedTimestamp;
-  private final Map<String, OutputGeneratorPropertiesProvider > extensionToBuilder;
-
-  private GeneratingFileVisitor(Configuration config, MavenSession session, Map<String, OutputGeneratorPropertiesProvider> extensionToBuilder) {
-    this.config = config;
-    this.session = session;
-    this.extensionToBuilder = extensionToBuilder;
-    this.pomLastModifiedTimestamp = session.getAllProjects().stream()
-        .map(project->project.getFile().lastModified())
-        .reduce(Long::max)
-        .orElse(0L);
-  }
-
-  /**
-   * Factory method that calls constructor, added to facilitate testing with jmockit.
-   */
-  public static GeneratingFileVisitor create(Configuration config, MavenSession session, Map<String, OutputGeneratorPropertiesProvider> extensionToBuilder) {
-    return new GeneratingFileVisitor(config, session, extensionToBuilder);
-  }
-
-  @Override
-  public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) {
-    if (attrs.isRegularFile()) {
-      OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder()
-          .addGeneratorLocation(path)
-          .addPomLastModifiedTimestamp(pomLastModifiedTimestamp);
-      String fileName = path.getFileName().toString();
-      String extenstion = fileName.substring(fileName.lastIndexOf('.'));
-      OutputGeneratorPropertiesProvider pathProcessor = extensionToBuilder.get(extenstion);
-      if (pathProcessor == null) {
-        throw new RuntimeException("Unknown file extension: " + path);
-      }
-      pathProcessor.providePropertiesFromFile(path, builder);
-      builder.addToDataModel("pomProperties", session.getCurrentProject().getProperties());
-      builder.create().generate(config);
-    }
-    return FileVisitResult.CONTINUE;
-  }
-}
diff --git a/src/main/java/org/apache/freemarker/generator/JsonPropertiesProvider.java b/src/main/java/org/apache/freemarker/generator/JsonPropertiesProvider.java
deleted file mode 100644
index ea9e678..0000000
--- a/src/main/java/org/apache/freemarker/generator/JsonPropertiesProvider.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonReader;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Type;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.Map;
-
-public class JsonPropertiesProvider implements OutputGeneratorPropertiesProvider {
-	private final Gson gson;
-	private final Type stringObjectMap;
-	private final File dataDir;
-	private final File templateDir;
-	private final File outputDir;
-
-	private JsonPropertiesProvider(File dataDir, File templateDir, File outputDir) {
-		this.dataDir = dataDir;
-		this.templateDir = templateDir;
-		this.outputDir = outputDir;
-		gson = new GsonBuilder().setLenient().create();
-		stringObjectMap = new TypeToken<Map<String, Object>>() { } .getType();
-	}
-
-	public static JsonPropertiesProvider create(File dataDir, File templateDir, File outputDir) {
-		return new JsonPropertiesProvider(dataDir, templateDir, outputDir);
-	}
-
-	@Override
-	public void providePropertiesFromFile(Path path, OutputGenerator.OutputGeneratorBuilder builder) {
-		File jsonDataFile = path.toFile();
-		Map<String,Object> data = parseJson(jsonDataFile);
-
-		Object obj = data.get("dataModel");
-		if (obj != null) {
-			builder.addDataModel((Map<String, Object>) obj);
-		} else {
-			builder.addDataModel(new HashMap<String,Object>());
-		}
-
-		obj = data.get("templateName");
-		if (obj == null) {
-			throw new RuntimeException("Require json data property not found: templateName");
-		}
-		builder.addTemplateLocation(templateDir.toPath().resolve(obj.toString()));
-
-		String dataDirName = dataDir.getAbsolutePath();
-		String jsonFileName = jsonDataFile.getAbsolutePath();
-		if (!jsonFileName.startsWith(dataDirName)) {
-			throw new IllegalStateException("visitFile() given file not in sourceDirectory: " + jsonDataFile);
-		}
-
-		String outputFileName = jsonFileName.substring(dataDirName.length()+1);
-		outputFileName = outputFileName.substring(0, outputFileName.length() - 5);
-		Path outputPath = outputDir.toPath();
-		Path resolved = outputPath.resolve(outputFileName);
-		builder.addOutputLocation(resolved);
-	}
-
-	private Map<String, Object> parseJson(File jsonDataFile) {
-		try (JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(jsonDataFile), "UTF-8"))) {
-			return gson.fromJson(reader, stringObjectMap);
-		} catch (Throwable t) {
-			throw new RuntimeException("Could not parse json data file: " + jsonDataFile, t);
-		}
-	}
-}
diff --git a/src/main/java/org/apache/freemarker/generator/OutputGenerator.java b/src/main/java/org/apache/freemarker/generator/OutputGenerator.java
deleted file mode 100644
index e639392..0000000
--- a/src/main/java/org/apache/freemarker/generator/OutputGenerator.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Knows how to generate an output file given five things:
- * <ul>
- * <li>The latest update time of the <b>pom file(s)</b> for the project</li>
- * <li>The location of the <b>generator file</b></li>
- * <li>The location of the <b>template file</b></li>
- * <li>The location of the <b>output file</b></li>
- * <li>A <b>data model<b> used to fill out the template.</li>
- * </ul>
- *<p>Given these five pieces of information, the generator will generate a new output file, but only if any existing
- * generated file is not newer than the inputs (pom, generator, and template).</p>
- */
-class OutputGenerator {
-	public final long pomModifiedTimestamp;
-	public final Path generatorLocation;
-	public final Path templateLocation;
-	public final Path outputLocation;
-	public final Map<String,Object> dataModel;
-	private OutputGenerator(
-		 long pomModifiedTimestamp,
-		 Path generatorLocation,
-		 Path templateLocation,
-		 Path outputLocation,
-		 Map<String, Object> dataModel) {
-		this.pomModifiedTimestamp = pomModifiedTimestamp;
-		this.generatorLocation = generatorLocation;
-		this.templateLocation = templateLocation;
-		this.outputLocation = outputLocation;
-		this.dataModel = dataModel;
-	}
-
-	/**
-	 * Uses a fluent builder to make the code more legible in place.
-	 * Also allows the output generator to be built from multiple locations in source by passing the builder.
-	 * @return A new fluent builder for the OutputGenerator class.
-	 */
-	public static OutputGeneratorBuilder builder() {
-		return new OutputGeneratorBuilder();
-	}
-
-	public static class OutputGeneratorBuilder {
-		private long pomModifiedTimestamp = Long.MAX_VALUE;
-		private Path generatorLocation = null;
-		private Path templateLocation = null;
-		private Path outputLocation = null;
-		private Map<String,Object> dataModel = null;
-
-		public OutputGeneratorBuilder addPomLastModifiedTimestamp(long pomModifiedTimestamp) {
-			this.pomModifiedTimestamp = pomModifiedTimestamp;
-			return this;
-		}
-
-		public OutputGeneratorBuilder addGeneratorLocation(Path generatorLocation) {
-			this.generatorLocation = generatorLocation;
-			return this;
-		}
-
-		public OutputGeneratorBuilder addTemplateLocation(Path templateLocation) {
-			this.templateLocation = templateLocation;
-			return this;
-		}
-
-		public OutputGeneratorBuilder addOutputLocation(Path outputLocation) {
-			this.outputLocation = outputLocation;
-			return this;
-		}
-
-		public OutputGeneratorBuilder addDataModel(Map<String,Object> dataModel) {
-			this.dataModel = dataModel;
-			return this;
-		}
-
-		public OutputGeneratorBuilder addToDataModel(String key, Object val) {
-			if (this.dataModel == null) {
-				this.dataModel = new HashMap<>(4);
-			}
-			this.dataModel.put(key,val);
-			return this;
-		}
-
-		/**
-		 * @throws IllegalStateException if any of the parts of the OutputGenerator were not set.
-		 * @return A new output generator (which is immutable).
-		 */
-		public OutputGenerator create() {
-			if (pomModifiedTimestamp == Long.MAX_VALUE) throw new IllegalStateException("Must set the pomModifiedTimestamp");
-			if (generatorLocation == null) throw new IllegalStateException("Must set a non-null generatorLocation");
-			if (templateLocation == null) throw new IllegalStateException("Must set a non-null templateLocation");
-			if (outputLocation == null) throw new IllegalStateException("Must set a non-null outputLocation");
-			if (dataModel == null) throw new IllegalStateException("Must set a non-null dataModel");
-			return new OutputGenerator(pomModifiedTimestamp, generatorLocation, templateLocation, outputLocation, dataModel);
-		}
-	}
-
-	/**
-	 * <p>Generates an output by applying the model to the template.</p>
-	 * <p>Checks the ages of the inputs against an existing output file to early exit if there is no update.</p>
-	 * @param config Used to load the template from the template name.
-	 */
-	public void generate(Configuration config) {
-		//Use "createFile" for testing purposes only
-		File outputFile = FactoryUtil.createFile(outputLocation.toFile().toString());
-		File templateFile = templateLocation.toFile();
-		File generatorFile = generatorLocation.toFile();
-		if (outputFile.exists()) {
-			//early exit only if the output file is newer than all files that contribute to its generation
-			if (outputFile.lastModified() > generatorFile.lastModified()
-				 && outputFile.lastModified() > templateFile.lastModified()
-				 && outputFile.lastModified() > pomModifiedTimestamp) {
-				return;
-			}
-		} else {
-			File parentDir = outputFile.getParentFile();
-			if (parentDir.isFile()) {
-				throw new RuntimeException("Parent directory of output file is a file: " + parentDir.getAbsoluteFile());
-			}
-			parentDir.mkdirs();
-			if (!parentDir.isDirectory()) {
-				throw new RuntimeException("Could not create directory: " + parentDir.getAbsoluteFile());
-			}
-		}
-
-		Template template;
-		try {
-			template = config.getTemplate(templateFile.getName());
-		} catch (Throwable t) {
-			throw new RuntimeException("Could not read template: " + templateFile.getName(), t);
-		}
-
-		try (FileWriter writer = new FileWriter(outputFile)) {
-			template.process(dataModel, writer);
-		} catch (Throwable t) {
-			throw new RuntimeException("Could not process template associated with data file: " + generatorLocation, t);
-		}
-	}
-}
diff --git a/src/test/data/freemarker-mojo/freemarker.properties b/src/test/data/freemarker-mojo/freemarker.properties
deleted file mode 100644
index 17cefa1..0000000
--- a/src/test/data/freemarker-mojo/freemarker.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-# Test properties file used by FreeMarkerMojoTest to verify FreeMarkerMojo
-# passes these settings to the FreeMarker configuration.
-boolean_format: T,F
\ No newline at end of file
diff --git a/src/test/data/freemarker-mojo/template/test.ftl b/src/test/data/freemarker-mojo/template/test.ftl
deleted file mode 100644
index 6986c80..0000000
--- a/src/test/data/freemarker-mojo/template/test.ftl
+++ /dev/null
@@ -1 +0,0 @@
-This is a dummy test file. It is only here to make sure the directory exists.
\ No newline at end of file
diff --git a/src/test/data/generating-file-visitor/template/test-pom-only.ftl b/src/test/data/generating-file-visitor/template/test-pom-only.ftl
deleted file mode 100644
index 7168154..0000000
--- a/src/test/data/generating-file-visitor/template/test-pom-only.ftl
+++ /dev/null
@@ -1 +0,0 @@
-This is a test freemarker template. Test pom data: '${pomProperties.pomVar}'.
diff --git a/src/test/data/generating-file-visitor/template/test.ftl b/src/test/data/generating-file-visitor/template/test.ftl
deleted file mode 100644
index 1edee95..0000000
--- a/src/test/data/generating-file-visitor/template/test.ftl
+++ /dev/null
@@ -1 +0,0 @@
-This is a test freemarker template. Test json data: '${testVar}'. Test pom data: '${pomProperties.pomVar}'.
\ No newline at end of file
diff --git a/src/test/java/org/apache/freemarker/generator/FreeMarkerMojoTest.java b/src/test/java/org/apache/freemarker/generator/FreeMarkerMojoTest.java
deleted file mode 100644
index 31281fb..0000000
--- a/src/test/java/org/apache/freemarker/generator/FreeMarkerMojoTest.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitor;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.MojoExecution;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.project.MavenProject;
-import org.junit.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import freemarker.cache.FileTemplateLoader;
-import freemarker.cache.TemplateLoader;
-import freemarker.template.Configuration;
-import mockit.Deencapsulation;
-import mockit.Expectations;
-import mockit.Mocked;
-import mockit.Verifications;
-
-public class FreeMarkerMojoTest extends Assert {
-
-  private static final File TEST_OUTPUT_DIR = new File("target/test-output/freemarker-mojo");
-  private static final String FREEMARKER_VERSION = "2.3.29";
-  
-  @BeforeClass
-  public static void beforeClass() throws IOException {
-    // Clean output dir before each run.
-    if (TEST_OUTPUT_DIR.exists()) {
-      // Recursively delete output from previous run.
-      Files.walk(TEST_OUTPUT_DIR.toPath())
-       .sorted(Comparator.reverseOrder())
-       .map(Path::toFile)
-       .forEach(File::delete);
-    }
-  }
-
-  @Test
-  public void executeTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked MojoExecution mojoExecution,
-      @Mocked GeneratingFileVisitor generatingFileVisitor,
-      @Mocked Files files
-      ) throws MojoExecutionException, MojoFailureException, IOException {
-
-    new Expectations(mojoExecution, generatingFileVisitor) {{
-      mojoExecution.getLifecyclePhase(); result = "generate-sources";
-      session.getCurrentProject(); result = project;
-    }};
-
-    FreeMarkerMojo mojo = new FreeMarkerMojo();
-    
-    // Validate freeMarkerVersion is required.
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("freeMarkerVersion is required");
-    
-    Deencapsulation.setField(mojo, "freeMarkerVersion", "");
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("freeMarkerVersion is required");
-
-    File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "executeTest");
-    Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
-    Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
-    Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
-    Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
-    Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
-    Deencapsulation.setField(mojo, "mojo", mojoExecution);
-    Deencapsulation.setField(mojo, "session", session);
-
-    // Validate source directory.
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("Required directory does not exist: target/test-output/freemarker-mojo/executeTest/data");
-    
-    new File(testCaseOutputDir, "data").mkdirs();
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("Required directory does not exist: target/test-output/freemarker-mojo/executeTest/template");
-    new File(testCaseOutputDir, "template").mkdirs();
-    
-    // Validate minimum configuration.
-    mojo.execute();
-    
-    new Verifications() {{
-      project.addCompileSourceRoot("target/test-output/freemarker-mojo/executeTest/generated-files"); times = 1;
-
-      Configuration config;
-      MavenSession capturedSession;
-      Map<String, OutputGeneratorPropertiesProvider> builders;
-
-      GeneratingFileVisitor.create(
-          config = withCapture(), 
-          capturedSession = withCapture(), 
-          builders = withCapture()); times = 1;
-
-      assertEquals("UTF-8", config.getDefaultEncoding());
-      assertEquals(session, capturedSession);
-      TemplateLoader loader = config.getTemplateLoader();
-      assertTrue(loader instanceof FileTemplateLoader);
-
-      Path path;
-      FileVisitor<Path> fileVisitor;
-      
-      Files.walkFileTree(path = withCapture(), fileVisitor = withCapture()); times = 1;
-      
-      assertEquals(new File(testCaseOutputDir, "data").toPath(), path);
-      assertTrue(fileVisitor instanceof GeneratingFileVisitor);
-    }};
-  }
-  
-  @Test
-  public void execute_generateTestSourceTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked MojoExecution mojoExecution,
-      @Mocked GeneratingFileVisitor generatingFileVisitor,
-      @Mocked Files files
-      ) throws MojoExecutionException, MojoFailureException, IOException {
-
-    new Expectations(mojoExecution, generatingFileVisitor) {{
-      mojoExecution.getLifecyclePhase(); result = "generate-test-sources";
-      session.getCurrentProject(); result = project;
-    }};
-
-    FreeMarkerMojo mojo = new FreeMarkerMojo();
-    
-    File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "generateTestSourceTest");
-    Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
-    Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
-    Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
-    Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
-    Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
-    Deencapsulation.setField(mojo, "mojo", mojoExecution);
-    Deencapsulation.setField(mojo, "session", session);
-
-    new File(testCaseOutputDir, "data").mkdirs();
-    new File(testCaseOutputDir, "template").mkdirs();
-    
-    mojo.execute();
-    
-    new Verifications() {{
-      project.addTestCompileSourceRoot("target/test-output/freemarker-mojo/generateTestSourceTest/generated-files"); times = 1;
-    }};
-  }
-
-  @SuppressWarnings({"rawtypes", "unchecked"})
-  @Test
-  public void execute_walkFileTreeExceptionTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked MojoExecution mojoExecution,
-      @Mocked GeneratingFileVisitor generatingFileVisitor,
-      @Mocked Files files
-      ) throws MojoExecutionException, MojoFailureException, IOException {
-
-    new Expectations(mojoExecution, generatingFileVisitor) {{
-      mojoExecution.getLifecyclePhase(); result = "generate-test-sources";
-      session.getCurrentProject(); result = project;
-      Files.walkFileTree((Path) any,(FileVisitor) any); result = new RuntimeException("test exception");
-    }};
-
-    FreeMarkerMojo mojo = new FreeMarkerMojo();
-    
-    File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "generateTestSourceTest");
-    Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
-    Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
-    Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
-    Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
-    Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
-    Deencapsulation.setField(mojo, "mojo", mojoExecution);
-    Deencapsulation.setField(mojo, "session", session);
-
-    new File(testCaseOutputDir, "data").mkdirs();
-    new File(testCaseOutputDir, "template").mkdirs();
-    
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("Failed to process files in generator dir: target/test-output/freemarker-mojo/generateTestSourceTest/data");
-  }
-  
-  @Test
-  public void execute_setTemplateLoaderExceptionTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked MojoExecution mojoExecution,
-      @Mocked FactoryUtil factoryUtil,
-      @Mocked Configuration config) {
-    
-    new Expectations(config, FactoryUtil.class) {{
-      FactoryUtil.createConfiguration(FREEMARKER_VERSION); result = config;
-      config.setTemplateLoader((TemplateLoader) any); result = new RuntimeException("test exception");
-    }};
-
-    FreeMarkerMojo mojo = new FreeMarkerMojo();
-
-    File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "setTemplateLoaderException");
-
-    Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
-    Deencapsulation.setField(mojo, "sourceDirectory", testCaseOutputDir);
-    Deencapsulation.setField(mojo, "templateDirectory", new File(testCaseOutputDir, "template"));
-    Deencapsulation.setField(mojo, "generatorDirectory", new File(testCaseOutputDir, "data"));
-    Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
-    Deencapsulation.setField(mojo, "mojo", mojoExecution);
-    Deencapsulation.setField(mojo, "session", session);
-
-    new File(testCaseOutputDir, "data").mkdirs();
-    new File(testCaseOutputDir, "template").mkdirs();
-
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("Could not establish file template loader for directory: target/test-output/freemarker-mojo/setTemplateLoaderException/template");
-  }
-  
-  @Test
-  public void execute_loadFreemarkerPropertiesTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked MojoExecution mojoExecution,
-      @Mocked Configuration config) throws Exception {
-    
-    FreeMarkerMojo mojo = new FreeMarkerMojo();
-
-    File sourceDirectory = new File("src/test/data/freemarker-mojo");
-    File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "loadFreemarkerProperties");
-
-    Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
-    Deencapsulation.setField(mojo, "sourceDirectory", sourceDirectory);
-    Deencapsulation.setField(mojo, "templateDirectory", new File( sourceDirectory, "template"));
-    Deencapsulation.setField(mojo, "generatorDirectory", new File( sourceDirectory, "data"));
-    Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
-    Deencapsulation.setField(mojo, "mojo", mojoExecution);
-    Deencapsulation.setField(mojo, "session", session);
-
-    mojo.execute();
-    
-    new Verifications() {{
-      Properties properties;
-      
-      config.setSettings(properties = withCapture()); times = 1;
-      
-      assertEquals("T,F", properties.getProperty("boolean_format"));
-    }};
-  }
-  
-  @Test
-  public void execute_loadFreemarkerPropertiesExceptionTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked MojoExecution mojoExecution,
-      @Mocked FactoryUtil factoryUtil,
-      @Mocked Configuration config) throws Exception {
-    
-    new Expectations(FactoryUtil.class) {{
-      FactoryUtil.createFileInputStream((File) any); result = new RuntimeException("test exception");
-    }};
-    
-    FreeMarkerMojo mojo = new FreeMarkerMojo();
-
-    File sourceDirectory = new File("src/test/data/freemarker-mojo");
-    File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "loadFreemarkerPropertiesExceptionTest");
-
-    Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
-    Deencapsulation.setField(mojo, "sourceDirectory", sourceDirectory);
-    Deencapsulation.setField(mojo, "templateDirectory", new File( sourceDirectory, "template"));
-    Deencapsulation.setField(mojo, "generatorDirectory", new File( sourceDirectory, "data"));
-    Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
-    Deencapsulation.setField(mojo, "mojo", mojoExecution);
-    Deencapsulation.setField(mojo, "session", session);
-
-    System.out.println("==== before mojo execute");
-    try {
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("Failed to load src/test/data/freemarker-mojo/freemarker.properties");
-    } catch ( Throwable t) {
-      t.printStackTrace();
-    }
-  }
-
-  @Test
-  public void execute_setSettingsExceptionTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked MojoExecution mojoExecution,
-      @Mocked Configuration config) throws Exception {
-    
-    new Expectations() {{
-      config.setSettings((Properties) any); result = new RuntimeException("test exception");
-    }};
-    
-    FreeMarkerMojo mojo = new FreeMarkerMojo();
-
-    File sourceDirectory = new File("src/test/data/freemarker-mojo");
-    File testCaseOutputDir = new File(TEST_OUTPUT_DIR, "loadFreemarkerProperties");
-
-    Deencapsulation.setField(mojo, "freeMarkerVersion", FREEMARKER_VERSION);
-    Deencapsulation.setField(mojo, "sourceDirectory", sourceDirectory);
-    Deencapsulation.setField(mojo, "templateDirectory", new File( sourceDirectory, "template"));
-    Deencapsulation.setField(mojo, "generatorDirectory", new File( sourceDirectory, "data"));
-    Deencapsulation.setField(mojo, "outputDirectory", new File(testCaseOutputDir, "generated-files"));
-    Deencapsulation.setField(mojo, "mojo", mojoExecution);
-    Deencapsulation.setField(mojo, "session", session);
-
-    assertThatExceptionOfType(MojoExecutionException.class).isThrownBy(() -> {
-      mojo.execute();
-    }).withMessage("Invalid setting(s) in src/test/data/freemarker-mojo/freemarker.properties");
-  }
-  
-}
diff --git a/src/test/java/org/apache/freemarker/generator/GeneratingFileVisitorTest.java b/src/test/java/org/apache/freemarker/generator/GeneratingFileVisitorTest.java
deleted file mode 100644
index 8770a27..0000000
--- a/src/test/java/org/apache/freemarker/generator/GeneratingFileVisitorTest.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.*;
-
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.project.MavenProject;
-import org.junit.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import freemarker.cache.FileTemplateLoader;
-import freemarker.template.Configuration;
-import mockit.Expectations;
-import mockit.Mocked;
-
-public class GeneratingFileVisitorTest extends Assert {
-
-  private static File testDir = new File("src/test/data/generating-file-visitor");
-  private static File dataDir = new File(testDir, "data");
-  private static File templateDir = new File(testDir, "template");
-  private static File outputDir = new File("target/test-output/generating-file-visitor");
-  private static Map<String, OutputGeneratorPropertiesProvider> builders = new HashMap<>();
-  private Configuration config;
-  private Properties pomProperties = new Properties();
-  
-  @BeforeClass
-  public static void beforeClass() throws IOException {
-  	 builders.put(".json", JsonPropertiesProvider.create(dataDir,templateDir,outputDir));
-    // Clean output dir before each run.
-    File outputDir = new File("target/test-output/generating-file-visitor");
-    if (outputDir.exists()) {
-      // Recursively delete output from previous run.
-      Files.walk(outputDir.toPath())
-       .sorted(Comparator.reverseOrder())
-       .map(Path::toFile)
-       .forEach(File::delete);
-    }
-  }
-
-  @BeforeMethod
-  public void before() throws IOException {
-    if (!testDir.isDirectory()) {
-      throw new RuntimeException("Can't find required test data directory. "
-          + "If running test outside of maven, make sure working directory is the project directory. "
-          + "Looking for: " + testDir);
-    }
-
-    config = new Configuration(Configuration.VERSION_2_3_23);
-    config.setDefaultEncoding("UTF-8");
-    config.setTemplateLoader(new FileTemplateLoader(templateDir));
-    pomProperties.put("pomVar", "pom value");
-  }
-  
-  @Test
-  public void functionalHappyPathTestNoDataModel(
-      @Mocked MavenSession session, 
-      @Mocked MavenProject project,
-      @Mocked File mockFile,
-      @Mocked BasicFileAttributes attrs) throws IOException {
-    List<MavenProject> projects = new ArrayList<>();
-    projects.add(project);
-    new Expectations(session, project, mockFile) {{
-      session.getCurrentProject(); result = project;
-      session.getAllProjects(); result = projects;
-      project.getProperties(); result = pomProperties;
-      attrs.isRegularFile(); result = true;
-      project.getFile(); result = mockFile;
-      mockFile.lastModified(); result = 10;
-    }};
-    
-    File file = new File(dataDir, "mydir/success-test-2.txt.json");
-    GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
-    assertEquals(FileVisitResult.CONTINUE, gfv.visitFile(file.toPath(), attrs));
-    
-    File outputFile = new File(outputDir, "mydir/success-test-2.txt");
-    assertTrue(outputFile.isFile());
-    List<String> lines = Files.readAllLines(outputFile.toPath(), StandardCharsets.UTF_8);
-    assertEquals(1, lines.size());
-    assertEquals("This is a test freemarker template. Test pom data: 'pom value'.", lines.get(0));
-  }
-
-  @Test
-  public void functionalHappyPathTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked File mockFile,
-      @Mocked BasicFileAttributes attrs) throws IOException {
-    List<MavenProject> projects = new ArrayList<>();
-    projects.add(project);
-    new Expectations(session, project, mockFile) {{
-      session.getCurrentProject(); result = project;
-      session.getAllProjects(); result = projects;
-      project.getProperties(); result = pomProperties;
-      attrs.isRegularFile(); result = true;
-      project.getFile(); result = mockFile;
-      mockFile.lastModified(); result = 10;
-    }};
-
-    File file = new File(dataDir, "mydir/success-test.txt.json");
-    GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
-    assertEquals(FileVisitResult.CONTINUE, gfv.visitFile(file.toPath(), attrs));
-
-    File outputFile = new File(outputDir, "mydir/success-test.txt");
-    assertTrue(outputFile.isFile());
-    List<String> lines = Files.readAllLines(outputFile.toPath(), StandardCharsets.UTF_8);
-    assertEquals(1, lines.size());
-    assertEquals("This is a test freemarker template. Test json data: 'test value'. Test pom data: 'pom value'.", lines.get(0));
-  }
-
-  @Test
-  public void visitFile_badExtensionTest(
-      @Mocked MavenSession session,
-      @Mocked MavenProject project,
-      @Mocked File mockFile,
-      @Mocked BasicFileAttributes attrs) throws IOException {
-    List<MavenProject> projects = new ArrayList<>();
-    projects.add(project);
-    new Expectations(session, project, mockFile) {{
-      attrs.isRegularFile(); result = true;
-      session.getAllProjects(); result = projects;
-      project.getFile(); result = mockFile;
-      mockFile.lastModified(); result = 10;
-    }};
-    // Test file without .json suffix.
-    File file = new File(dataDir, "mydir/bad-extension-test.txt");
-    GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
-    assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
-      gfv.visitFile(file.toPath(), attrs);
-    }).withMessage("Unknown file extension: " + file.toPath());
-  }
-
-  @Test 
-  public void visitFile_notRegularFileTest(@Mocked MavenSession session,
-                                           @Mocked MavenProject project,
-                                           @Mocked BasicFileAttributes attrs,
-                                           @Mocked File mockFile
-                                           ) {
-    List<MavenProject> projects = new ArrayList<>();
-    projects.add(project);
-    new Expectations(session, project, mockFile) {{
-      attrs.isRegularFile(); result = false;
-      session.getAllProjects(); result = projects;
-      project.getFile(); result = mockFile;
-      mockFile.lastModified(); result = 10;
-    }};
-    // FYI: if you change above result to true, test will fail trying to read the 'mydir' directory
-    // as a json file.
-    File dir = new File(dataDir, "mydir");
-    GeneratingFileVisitor gfv = GeneratingFileVisitor.create(config, session, builders);
-    assertEquals(FileVisitResult.CONTINUE, gfv.visitFile(dir.toPath(), attrs));
-  }
-}
diff --git a/src/test/java/org/apache/freemarker/generator/JsonPropertiesProviderTest.java b/src/test/java/org/apache/freemarker/generator/JsonPropertiesProviderTest.java
deleted file mode 100644
index 3f5b2ff..0000000
--- a/src/test/java/org/apache/freemarker/generator/JsonPropertiesProviderTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import com.google.gson.Gson;
-import com.google.gson.stream.JsonReader;
-import mockit.Expectations;
-import mockit.Mocked;
-import mockit.Verifications;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.lang.reflect.Type;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType;
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
-
-public class JsonPropertiesProviderTest {
-	private File testDir = new File("src/test/data/generating-file-visitor");
-	private File dataDir = new File(testDir, "data");
-	private File templateDir = new File(testDir, "template");
-	private File outputDir = new File("target/test-output/generating-file-visitor");
-
-	@Test
-	public void testSuccess(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
-		Path path = dataDir.toPath().resolve("mydir/success-test.txt.json");
-		Path expectedTemplateLocation = templateDir.toPath().resolve("test.ftl");
-		Path expectedOutputLocation = outputDir.toPath().resolve("mydir/success-test.txt");
-		Map<String,Object> expectedMap = new HashMap<String,Object>(4);
-		expectedMap.put("testVar", "test value");
-		JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
-		toTest.providePropertiesFromFile(path, builder);
-		new Verifications(){{
-			Path templateLocation;
-			builder.addTemplateLocation(templateLocation = withCapture());
-			Path outputLocation;
-			builder.addOutputLocation(outputLocation = withCapture());
-			Map<String,Object> actualMap;
-			builder.addDataModel(actualMap = withCapture());
-
-			assertEquals(expectedTemplateLocation, templateLocation);
-			assertEquals(expectedOutputLocation, outputLocation);
-			assertArrayEquals(expectedMap.entrySet().toArray(), actualMap.entrySet().toArray());
-		}};
-	}
-
-	@Test
-	public void testSuccessNoDataModel(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
-		Path path = dataDir.toPath().resolve("mydir/success-test-2.txt.json");
-		Path expectedTemplateLocation = templateDir.toPath().resolve("test-pom-only.ftl");
-		Path expectedOutputLocation = outputDir.toPath().resolve("mydir/success-test-2.txt");
-		Map<String,Object> expectedMap = new HashMap<String,Object>(4);
-		JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
-		toTest.providePropertiesFromFile(path, builder);
-		new Verifications(){{
-			Path templateLocation;
-			builder.addTemplateLocation(templateLocation = withCapture());
-			Path outputLocation;
-			builder.addOutputLocation(outputLocation = withCapture());
-			Map<String,Object> actualMap;
-			builder.addDataModel(actualMap = withCapture());
-
-			assertEquals(expectedTemplateLocation, templateLocation);
-			assertEquals(expectedOutputLocation, outputLocation);
-			assertArrayEquals(expectedMap.entrySet().toArray(), actualMap.entrySet().toArray());
-		}};
-	}
-
-	@Test
-	public void testParsingException(@Mocked OutputGenerator.OutputGeneratorBuilder builder, @Mocked Gson gson) {
-		Path path = dataDir.toPath().resolve("mydir/success-test.txt.json");
-		new Expectations() {{
-			gson.fromJson((JsonReader) any, (Type) any); result = new RuntimeException("test exception");
-		}};
-		JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
-
-		assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
-			toTest.providePropertiesFromFile(path, builder);
-		}).withMessage("Could not parse json data file: src/test/data/generating-file-visitor/data/mydir/success-test.txt.json");
-	}
-
-	@Test
-	public void testMissingTemplateName(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
-		Path path = dataDir.toPath().resolve("mydir/missing-template-name.txt.json");
-		JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
-
-		assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
-			toTest.providePropertiesFromFile(path, builder);
-		}).withMessage("Require json data property not found: templateName");
-	}
-
-	@Test
-	public void testBadPath(@Mocked OutputGenerator.OutputGeneratorBuilder builder) {
-		Path path = testDir.toPath().resolve("badPath/success-test.txt.json");
-		JsonPropertiesProvider toTest = JsonPropertiesProvider.create(dataDir, templateDir, outputDir);
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			toTest.providePropertiesFromFile(path, builder);
-		}).withMessage("visitFile() given file not in sourceDirectory: src/test/data/generating-file-visitor/badPath/success-test.txt.json");
-	}
-}
diff --git a/src/test/java/org/apache/freemarker/generator/OutputGeneratorTest.java b/src/test/java/org/apache/freemarker/generator/OutputGeneratorTest.java
deleted file mode 100644
index 63e5eeb..0000000
--- a/src/test/java/org/apache/freemarker/generator/OutputGeneratorTest.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.generator;
-
-import freemarker.cache.FileTemplateLoader;
-import freemarker.template.Configuration;
-import mockit.Expectations;
-import mockit.Mocked;
-import org.assertj.core.api.Assertions;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-import org.testng.annotations.BeforeMethod;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.*;
-
-import static junit.framework.Assert.assertEquals;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertTrue;
-
-public class OutputGeneratorTest {
-
-	private File testDir = new File("src/test/data/generating-file-visitor");
-	private File dataDir = new File(testDir, "data");
-	private File templateDir = new File(testDir, "template");
-	private File outputDir = new File("target/test-output/generating-file-visitor");
-	private Configuration config;
-	private Map<String, Object> dataModel = new HashMap<String,Object>();
-
-	@BeforeMethod
-	public void setupDataModel() {
-		dataModel.clear();
-		dataModel.put("testVar", "test value");
-		dataModel.put("pomProperties", new HashMap<String,String>());
-		((Map<String,String>)dataModel.get("pomProperties")).put("pomVar", "pom value");
-	}
-
-	@BeforeClass
-	public static void cleanFields() throws IOException {
-		// Clean output dir before each run.
-		File outputDir = new File("target/test-output/generating-file-visitor");
-		if (outputDir.exists()) {
-			// Recursively delete output from previous run.
-			Files.walk(outputDir.toPath())
-				 .sorted(Comparator.reverseOrder())
-				 .map(Path::toFile)
-				 .forEach(File::delete);
-		}
-	}
-
-	@BeforeMethod
-	public void before() throws IOException {
-		if (!testDir.isDirectory()) {
-			throw new RuntimeException("Can't find required test data directory. "
-				 + "If running test outside of maven, make sure working directory is the project directory. "
-				 + "Looking for: " + testDir);
-		}
-
-		config = new Configuration(Configuration.VERSION_2_3_23);
-		config.setDefaultEncoding("UTF-8");
-		config.setTemplateLoader(new FileTemplateLoader(templateDir));
-	}
-
-	@Test
-	public void createTest() {
-		OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set the pomModifiedTimestamp");
-
-		builder.addPomLastModifiedTimestamp(0);
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null generatorLocation");
-
-		File file = new File(dataDir, "mydir/success-test.txt.json");
-		builder.addGeneratorLocation(file.toPath());
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null templateLocation");
-
-		File templateFile = new File(templateDir, "test.ftl");
-		builder.addTemplateLocation(templateFile.toPath());
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null outputLocation");
-
-		File outputFile = new File(outputDir, "mydir/success-test.txt");
-		builder.addOutputLocation(outputFile.toPath());
-
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null dataModel");
-
-		builder.addDataModel(dataModel);
-		OutputGenerator generator = builder.create();
-
-		assertEquals(0, generator.pomModifiedTimestamp);
-		assertEquals(file.toPath(), generator.generatorLocation);
-		assertEquals(templateFile.toPath(), generator.templateLocation);
-		assertEquals(outputFile.toPath(), generator.outputLocation);
-		assertEquals(dataModel.size(), generator.dataModel.size());
-		assertArrayEquals(dataModel.entrySet().toArray(), generator.dataModel.entrySet().toArray());
-	}
-
-	@Test
-	public void addToDataModelTest() {
-		OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set the pomModifiedTimestamp");
-
-		builder.addPomLastModifiedTimestamp(0);
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null generatorLocation");
-
-		File file = new File(dataDir, "mydir/success-test.txt.json");
-		builder.addGeneratorLocation(file.toPath());
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null templateLocation");
-
-		File templateFile = new File(templateDir, "test.ftl");
-		builder.addTemplateLocation(templateFile.toPath());
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null outputLocation");
-
-		File outputFile = new File(outputDir, "mydir/success-test.txt");
-		builder.addOutputLocation(outputFile.toPath());
-
-		assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> {
-			builder.create();
-		}).withMessage("Must set a non-null dataModel");
-
-		builder.addToDataModel("testVar", "testVal");
-		OutputGenerator generator = builder.create();
-
-		assertEquals(1, generator.dataModel.size());
-		assertEquals( "testVal", generator.dataModel.get("testVar"));
-
-		builder.addDataModel(dataModel);
-		builder.addToDataModel("testVar2", "testVal2");
-
-		generator = builder.create();
-
-		assertEquals(3, generator.dataModel.size());
-		assertEquals( "test value", generator.dataModel.get("testVar"));
-		assertEquals( "testVal2", generator.dataModel.get("testVar2"));
-	}
-
-	@Test
-	public void generate_SuccessTest()
-		  throws IOException {
-		OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
-		builder.addPomLastModifiedTimestamp(0);
-		File file = new File(dataDir, "mydir/success-test.txt.json");
-		builder.addGeneratorLocation(file.toPath());
-		File outputFile = new File(outputDir, "mydir/success-test.txt");
-		builder.addOutputLocation(outputFile.toPath());
-		File templateFile = new File(templateDir, "test.ftl");
-		builder.addTemplateLocation(templateFile.toPath());
-		builder.addDataModel(dataModel);
-		OutputGenerator generator = builder.create();
-		generator.generate(config);
-
-		assertTrue(outputFile.isFile());
-		List<String> lines = Files.readAllLines(outputFile.toPath(), StandardCharsets.UTF_8);
-		assertEquals(1, lines.size());
-		assertEquals("This is a test freemarker template. Test json data: 'test value'. Test pom data: 'pom value'.", lines.get(0));
-
-		// Process same file again, should not regenerate file.
-		long lastMod = outputFile.lastModified();
-		generator.generate(config);
-		assertEquals(lastMod, outputFile.lastModified());
-
-		// Set mod time to before json file.
-		lastMod = file.lastModified() - 1000; // File system may only keep 1 second precision.
-		outputFile.setLastModified(lastMod);
-		generator.generate(config);
-		assertTrue(lastMod < outputFile.lastModified());
-
-		// Set mod time to before template file.
-		lastMod = templateFile.lastModified() - 1000; // File system may only keep 1 second precision.
-		outputFile.setLastModified(lastMod);
-		generator.generate(config);
-		assertTrue(lastMod < outputFile.lastModified());
-	}
-
-	@Test
-	public void generate_badTemplateNameTest(){
-		OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
-		builder.addPomLastModifiedTimestamp(0);
-		File file = new File(dataDir, "mydir/bad-template-name.txt.json");
-		builder.addGeneratorLocation(file.toPath());
-		File outputFile = new File(outputDir, "mydir/bad-template-name.txt");
-		builder.addOutputLocation(outputFile.toPath());
-		File templateFile = new File(templateDir, "missing.ftl"); //this doesn't exist
-		builder.addTemplateLocation(templateFile.toPath());
-		builder.addDataModel(dataModel);
-		OutputGenerator generator = builder.create();
-		Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
-			generator.generate(config);
-		}).withMessage("Could not read template: missing.ftl");
-	}
-
-	@Test
-	public void generate_missingVarTest() {
-		OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
-		builder.addPomLastModifiedTimestamp(0);
-		File file = new File(dataDir, "mydir/missing-var-test.txt.json");
-		builder.addGeneratorLocation(file.toPath());
-		File outputFile = new File(outputDir, "mydir/missing-var-test.txt");
-		builder.addOutputLocation(outputFile.toPath());
-		File templateFile = new File(templateDir, "test.ftl"); //this is missing a
-		builder.addTemplateLocation(templateFile.toPath());
-		dataModel.remove("testVar");
-		builder.addDataModel(dataModel);
-		OutputGenerator generator = builder.create();
-		Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
-			generator.generate(config);
-		}).withMessage("Could not process template associated with data file: src/test/data/generating-file-visitor/data/mydir/missing-var-test.txt.json");
-	}
-
-	@Test
-	public void generate_badParentTest() throws IOException {
-		OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
-		builder.addPomLastModifiedTimestamp(0);
-		File file = new File(dataDir, "badParent/bad-parent-test.txt.json");
-		builder.addGeneratorLocation(file.toPath());
-		File outputFile = new File(outputDir, "badParent/bad-parent-test.txt");
-		builder.addOutputLocation(outputFile.toPath());
-		File templateFile = new File(templateDir, "test.ftl"); //this is missing a
-		builder.addTemplateLocation(templateFile.toPath());
-		builder.addDataModel(dataModel);
-		OutputGenerator generator = builder.create();
-		outputDir.mkdirs();
-		outputFile.getParentFile().createNewFile();
-
-		Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
-			generator.generate(config);
-		}).withMessage("Parent directory of output file is a file: " + outputFile.getParentFile().getAbsolutePath());
-	}
-
-	@Test
-	public void generate_cantCreateOutputFileParentDirTest(
-		 @Mocked FactoryUtil factoryUtil,
-		 @Mocked File mockOutputFile) throws IOException {
-
-		File parentDir = new File("target/test-output/generating-file-visitor/mydir");
-		new Expectations(mockOutputFile, parentDir) {{
-			FactoryUtil.createFile(anyString); result = mockOutputFile;
-			mockOutputFile.exists(); result = false;
-			mockOutputFile.getParentFile(); result = parentDir;
-			parentDir.isDirectory(); result = false;
-		}};
-
-		OutputGenerator.OutputGeneratorBuilder builder = OutputGenerator.builder();
-		builder.addPomLastModifiedTimestamp(0);
-		File file = new File(dataDir, "mydir/missing-var-test.txt.json");
-		builder.addGeneratorLocation(file.toPath());
-		File outputFile = new File(outputDir, "mydir/missing-var-test.txt");
-		builder.addOutputLocation(outputFile.toPath());
-		File templateFile = new File(templateDir, "test.ftl"); //this is missing a
-		builder.addTemplateLocation(templateFile.toPath());
-		builder.addDataModel(dataModel);
-		OutputGenerator generator = builder.create();
-		Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
-			generator.generate(config);
-		}).withMessage("Could not create directory: " + parentDir.getAbsoluteFile().toString());
-	}
-}