diff --git a/website/.gitignore b/website/.gitignore
new file mode 100644
index 00000000..7e152f10
--- /dev/null
+++ b/website/.gitignore
@@ -0,0 +1,6 @@
+
+public/
+resources/
+node_modules/
+tech-doc-hugo
+
diff --git a/website/.gitmodules b/website/.gitmodules
new file mode 100644
index 00000000..a1524f2c
--- /dev/null
+++ b/website/.gitmodules
@@ -0,0 +1,4 @@
+
+[submodule "themes/docsy"]
+ path = themes/docsy
+ url = https://github.com/google/docsy
diff --git a/website/CONTRIBUTING.md b/website/CONTRIBUTING.md
new file mode 100644
index 00000000..db177d4a
--- /dev/null
+++ b/website/CONTRIBUTING.md
@@ -0,0 +1,28 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## Community Guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
diff --git a/website/LICENSE b/website/LICENSE
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/website/LICENSE
@@ -0,0 +1,201 @@
+ 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.
diff --git a/website/README.md b/website/README.md
new file mode 100644
index 00000000..271377f1
--- /dev/null
+++ b/website/README.md
@@ -0,0 +1,56 @@
+[Docsy](https://github.com/google/docsy) is a Hugo theme for technical documentation sites, providing easy site navigation, structure, and more. This **Docsy Example Project** uses the Docsy theme, as well as providing a skeleton documentation structure for you to use. You can either copy this project and edit it with your own content, or use the theme in your projects like any other [Hugo theme](https://gohugo.io/themes/installing-and-using-themes/).
+
+This Docsy Example Project is hosted at [https://goldydocs.netlify.com/](https://goldydocs.netlify.com/).
+
+You can find detailed theme instructions in the Docsy user guide: https://docsydocs.netlify.com/docs/
+
+This is not an officially supported Google product. This project is currently maintained.
+
+## Cloning the Docsy Example Project
+
+The following will give you a project that is set up and ready to use (don't forget to use `--recurse-submodules` or you won't pull down some of the code you need to generate a working site). The `hugo server` command builds and serves the site. If you just want to build the site, run `hugo` instead.
+
+```bash
+git clone --recurse-submodules --depth 1 https://github.com/google/docsy-example.git
+cd docsy-example
+hugo server
+```
+
+The theme is included as a Git submodule:
+
+```bash
+▶ git submodule
+ a053131a4ebf6a59e4e8834a42368e248d98c01d themes/docsy (heads/master)
+```
+
+If you want to do SCSS edits and want to publish these, you need to install `PostCSS` (not needed for `hugo server`):
+
+```bash
+npm install
+```
+
+
+
+## Running the website locally
+
+Once you've cloned the site repo, from the repo root folder, run:
+
+```
+hugo server
+```
diff --git a/website/assets/icons/lg.svg b/website/assets/icons/lg.svg
new file mode 100644
index 00000000..ce081e99
--- /dev/null
+++ b/website/assets/icons/lg.svg
@@ -0,0 +1,6988 @@
+
+
\ No newline at end of file
diff --git a/website/assets/icons/logo.svg b/website/assets/icons/logo.svg
new file mode 100644
index 00000000..95018636
--- /dev/null
+++ b/website/assets/icons/logo.svg
@@ -0,0 +1,6512 @@
+
+
diff --git a/website/assets/icons/vectorpaint.svg b/website/assets/icons/vectorpaint.svg
new file mode 100644
index 00000000..ba3f8f1b
--- /dev/null
+++ b/website/assets/icons/vectorpaint.svg
@@ -0,0 +1,1991 @@
+
\ No newline at end of file
diff --git a/website/assets/scss/_pageinfo.scss b/website/assets/scss/_pageinfo.scss
new file mode 100644
index 00000000..6309524f
--- /dev/null
+++ b/website/assets/scss/_pageinfo.scss
@@ -0,0 +1,20 @@
+.pageinfo {
+ font-weight: $font-weight-medium;
+ background: $gray-100;
+ color: inherit;
+ border-radius: 0;
+ margin: 2rem;
+ padding: 1.5rem;
+ padding-bottom: 0.5rem;
+
+ @each $color, $value in $theme-colors {
+ &-#{$color} {
+
+ border-style: solid;
+ border-color: $value;
+ }
+ }
+
+ width: 77.5%;
+}
+
diff --git a/website/assets/scss/_variables.scss b/website/assets/scss/_variables.scss
new file mode 100644
index 00000000..14472f7f
--- /dev/null
+++ b/website/assets/scss/_variables.scss
@@ -0,0 +1,131 @@
+/*
+
+Bootstrap variables overrides for theme.
+See https://github.com/twbs/bootstrap/pull/23260
+*/
+
+@fa-font-path : "../webfonts";
+
+// Bootstrap flags. For more, see https://getbootstrap.com/docs/4.0/getting-started/theming/
+$enable-gradients: false;
+$enable-rounded: false;
+$enable-shadows: false;
+
+// Theme flags.
+
+$td-enable-google-fonts: true;
+
+// Theme colors
+
+$primary: #30638E !default;
+$primary-light: lighten($primary, 75%) !default;
+$secondary: #FFA630 !default;
+$success: #3772FF !default;
+$info: #C0E0DE !default;
+$warning: #ED6A5A !default;
+$danger: #ED6A5A !default;
+$white: #fff !default;
+$light: #D3F3EE !default;
+
+$dark: #403F4C !default;
+$blue: #72A1E5 !default;
+$orange: #BA5A31 !default;
+$gray-100: #f8f9fa !default;
+$gray-200: #eee !default;
+$gray-300: #dee2e6 !default;
+$gray-400: #ccc !default;
+$gray-500: #adb5bd !default;
+$gray-600: #888 !default;
+$gray-700: #495057 !default;
+$gray-800: #333 !default;
+$gray-900: #222 !default;
+$black: #000 !default;
+
+$code-color: darken($secondary, 20%) !default;
+
+// UI element colors
+
+$border-color: $gray-300 !default;
+$td-sidebar-bg-color: rgba($primary, 0.03) !default;
+$td-sidebar-border-color: $border-color !default;
+
+// Background colors for the sections on home page etc. It is a paint by number system, starting at 0, where the number is taken from the shortcode's ordinal
+// if not provided by the user.
+// These colors are all part of the theme palette, but the mix is fairly random to create variation. This can be overridden by the project if needed.
+$td-box-colors: $secondary;
+
+$link-color: darken($blue, 15%) !default;
+$link-decoration: none !default;
+$link-hover-color: darken($link-color, 15%) !default;
+$link-hover-decoration: none !default;
+
+// Fonts
+
+$google_font_name: "Open Sans" !default;
+$google_font_family: "Open+Sans:300,300i,400,400i,700,700i" !default;
+$web-font-path: "https://fonts.googleapis.com/css?family=#{$google_font_family}";
+
+$td-fonts-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+
+@if $td-enable-google-fonts {
+ $td-fonts-serif: prepend($td-fonts-serif, "#{$google_font_name}");
+}
+
+$font-family-sans-serif: $td-fonts-serif !default;
+
+$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
+$font-family-base: $font-family-sans-serif !default;
+$font-size-base: 1rem !default;
+
+// Font weights
+
+$font-weight-light: 300 !default;
+$font-weight-normal: 400 !default;
+$font-weight-medium: 500 !default;
+$font-weight-bold: 700 !default;
+
+$font-weight-body-text: $font-weight-normal !default;
+$headings-font-weight: $font-weight-medium !default;
+
+// Heading sizes
+
+$h1-font-size: $font-size-base * 2.25 !default;
+$h2-font-size: $font-size-base * 2 !default;
+$h3-font-size: $font-size-base * 1.5 !default;
+$h4-font-size: $font-size-base * 1.35 !default;
+$h5-font-size: $font-size-base * 1.15 !default;
+$h6-font-size: $font-size-base !default;
+
+// Display styles
+
+$display1-weight: $font-weight-bold !default;
+$display2-weight: $font-weight-bold !default;
+$display3-weight: $font-weight-bold !default;
+$display4-weight: $font-weight-bold !default;
+$display1-size: 3rem !default;
+$display2-size: 2.5rem !default;
+$display3-size: 2rem !default;
+$display4-size: 1.75rem !default;
+
+// Space
+
+$spacer: 1rem;
+$td-block-space-top-base: 4 * $spacer;
+$td-block-space-bottom-base: 4 * $spacer;
+
+// Pagination
+
+$pagination-color: $gray-600 !default;
+$pagination-border-color: rgba($black, 0.1) !default;
+$pagination-active-border-color: darken($primary, 5%) !default;
+$pagination-disabled-color: $gray-300 !default;
+
+// Navbar
+
+$navbar-dark-color: rgba($white, 0.75) !default;
+$navbar-dark-hover-color: rgba($white, 0.5) !default;
+$navbar-dark-active-color: $white !default;
+$navbar-dark-disabled-color: rgba($white, 0.25) !default;
+
+// The yiq lightness value that determines when the lightness of color changes from "dark" to "light".
+$yiq-contrasted-threshold: 200 !default;
diff --git a/website/assets/scss/_variables_project.scss b/website/assets/scss/_variables_project.scss
new file mode 100644
index 00000000..096baa32
--- /dev/null
+++ b/website/assets/scss/_variables_project.scss
@@ -0,0 +1,36 @@
+/*
+Bootstrap variables overrides for theme.
+See https://github.com/twbs/bootstrap/pull/23260
+*/
+
+@fa-font-path : "../webfonts";
+
+// Bootstrap flags. For more, see https://getbootstrap.com/docs/4.0/getting-started/theming/
+$enable-gradients: false;
+$enable-rounded: false;
+$enable-shadows: false;
+
+$primary: #1EA149 !default;
+$primary-light: #F6D2A5;
+$secondary: #FFA630 !default;
+$success: #3772FF !default;
+$info: #C0E0DE !default;
+$warning: #ED6A5A !default;
+$danger: #ED6A5A !default;
+$white: #fff !default;
+$light: #D3F3EE !default;
+
+$dark: #403F4C !default;
+$blue: #72A1E5 !default;
+$orange: #EAAA2C;
+
+$link-color: #EAAA2C;
+$link-decoration: none !default;
+$link-hover-color: #FEC555 !default;
+$link-hover-decoration: none !default;
+
+$navbar-dark-color: $white !default;
+
+// $spacer: 20rem;
+
+$td-box-colors: $dark;
\ No newline at end of file
diff --git a/website/config.toml b/website/config.toml
new file mode 100644
index 00000000..363ae60e
--- /dev/null
+++ b/website/config.toml
@@ -0,0 +1,134 @@
+baseURL = "/"
+title = "Jenkins Operator"
+
+enableRobotsTXT = true
+
+# Hugo allows theme composition (and inheritance). The precedence is from left to right.
+theme = ["docsy"]
+
+# Will give values to .Lastmod etc.
+enableGitInfo = false
+
+# Language settings
+contentDir = "content/en"
+defaultContentLanguage = "en"
+defaultContentLanguageInSubdir = false
+# Useful when translating.
+enableMissingTranslationPlaceholders = true
+
+disableKinds = ["taxonomy", "taxonomyTerm"]
+
+# Highlighting config
+pygmentsCodeFences = true
+pygmentsUseClasses = false
+# Use the new Chroma Go highlighter in Hugo.
+pygmentsUseClassic = false
+#pygmentsOptions = "linenos=table"
+# See https://help.farbox.com/pygments.html
+pygmentsStyle = "tango"
+
+ # First one is picked as the Twitter card image if not set on page.
+ #images = ["images/project-illustration.png"]
+
+# Configure how URLs look like per section.
+[permalinks]
+blog = "/:section/:year/:month/:day/:slug/"
+
+## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday
+[blackfriday]
+plainIDAnchors = true
+hrefTargetBlank = true
+angledQuotes = false
+latexDashes = true
+
+# Image processing configuration.
+[imaging]
+resampleFilter = "CatmullRom"
+quality = 75
+anchor = "smart"
+
+[services]
+[services.googleAnalytics]
+# Comment out the next line to disable GA tracking. Also disables the feature described in [params.ui.feedback].
+id = "UA-00000000-0"
+
+# Language configuration
+
+[languages]
+[languages.en]
+title = "Jenkins Operator"
+description = "A native operator for Kubernetes to manage Jenkins"
+languageName ="English"
+# Weight used for sorting.
+weight = 1
+
+
+# Everything below this are Site Params
+
+[params]
+copyright = "VirtusLab"
+#privacy_policy = "https://policies.google.com/privacy"
+
+# Menu title if your navbar has a versions selector to access old versions of your site.
+# This menu appears only if you have at least one [params.versions] set.
+version_menu = "Releases"
+
+# Repository configuration (URLs for in-page links to opening issues and suggesting changes)
+github_repo = "https://github.com/jenkinsci/kubernetes-operator"
+# An optional link to a related project repo. For example, the sibling repository where your product code lives.
+github_project_repo = "https://github.com/jenkinsci/kubernetes-operator"
+
+# Specify a value here if your content directory is not in your repo's root directory
+# github_subdir = ""
+
+# Google Custom Search Engine ID. Remove or comment out to disable search.
+gcs_engine_id = "011737558837375720776:fsdu1nryfng"
+
+# User interface configuration
+[params.ui]
+# Enable to show the side bar menu in its compact state.
+sidebar_menu_compact = false
+# Set to true to disable breadcrumb navigation.
+breadcrumb_disable = false
+# Set to true to hide the sidebar search box (the top nav search box will still be displayed if search is enabled)
+sidebar_search_disable = false
+# Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top nav bar
+navbar_logo = true
+
+[params.blog]
+enable = false
+
+# Adds a H2 section titled "Feedback" to the bottom of each doc. The responses are sent to Google Analytics as events.
+# This feature depends on [services.googleAnalytics] and will be disabled if "services.googleAnalytics.id" is not set.
+# If you want this feature, but occasionally need to remove the "Feedback" section from a single page,
+# add "hide_feedback: true" to the page's front matter.
+[params.ui.feedback]
+enable = false
+# The responses that the user sees after clicking "yes" (the page was helpful) or "no" (the page was not helpful).
+yes = 'Glad to hear it! Please tell us how we can improve.'
+no = 'Sorry to hear that. Please tell us how we can improve.'
+
+[params.links]
+# End user relevant links. These will show up on left side of footer and in the community page if you have one.
+#[[params.links.user]]
+# name = "User mailing list"
+# url = "https://example.org/mail"
+# icon = "fa fa-envelope"
+# desc = "Discussion and help from your fellow users"
+#[[params.links.user]]
+# name ="Twitter"
+# url = "https://example.org/twitter"
+# icon = "fab fa-twitter"
+# desc = "Follow us on Twitter to get the latest news!"
+#[[params.links.user]]
+# name = "Stack Overflow"
+# url = "https://example.org/stack"
+# icon = "fab fa-stack-overflow"
+# desc = "Practical questions and curated answers"
+# Developer relevant links. These will show up on right side of footer and in the community page if you have one.
+#[[params.links.developer]]
+# name = "GitHub"
+# url = "https://github.com/google/docsy"
+# icon = "fab fa-github"
+# desc = "Development takes place here!"
+
diff --git a/website/content/en/_index.html b/website/content/en/_index.html
new file mode 100644
index 00000000..079103bf
--- /dev/null
+++ b/website/content/en/_index.html
@@ -0,0 +1,78 @@
++++
+title = "Jenkins Kubernetes Operator"
+linkTitle = "Jenkins Kubernetes Operator"
+
++++
+{{< blocks/section color="dark" >}}
+
+
+
+
+
+
Manage Jenkins in Kubernetes!
+
Deploy Jenkins Operator and configure your Jenkins instances in Kubernetes
+
+{{% /blocks/section %}}
+
+{{% blocks/lead color="primary" %}}
+Jenkins operator is a Kubernetes native operator which fully manages Jenkins on Kubernetes. It was built with immutability and declarative configuration as code in mind. Here are solved problems.
+{{% /blocks/lead %}}
+
+{{< blocks/section color="dark" >}}
+{{% blocks/feature icon="fa-hdd" title="Volumes handling" %}}
+AWS EBS volume attach/detach issue when using PVC
+{{% /blocks/feature %}}
+
+
+{{% blocks/feature icon="fas fa-cogs" title="Better configuration as code" %}}
+Use groovy scripts or casc to configure your Jenkins instance
+{{% /blocks/feature %}}
+
+
+{{% blocks/feature icon="fas fa-shield-alt" title="Security and hardening out of the box" %}}
+Enable CSRF, disable usage stats, enable master access control and more by default
+{{% /blocks/feature %}}
+
+{{% blocks/feature icon="fas fa-plug" title="Handle graceful shutdown properly" %}}
+Less chance to lose data
+{{% /blocks/feature %}}
+
+{{% blocks/feature icon="fas fa-exclamation-circle" title="Make errors more visible for end users" %}}
+Improve user experience by informing what has been done
+{{% /blocks/feature %}}
+
+{{% blocks/feature icon="fas fa-file-archive" title="Backup and restore for jobs history" %}}
+Prevent job history loss
+{{% /blocks/feature %}}
+
+
+{{< /blocks/section >}}
+
+
+{{< blocks/section >}}
+
+
+{{% blocks/feature icon="fab fa-github" title="Contributions welcome!" url="https://github.com/jenkinsci/kubernetes-operator" %}}
+We do a [Pull Request](https://github.com/jenkinsci/kubernetes-operator/pulls) contributions workflow on **GitHub**. New users are always welcome!
+{{% /blocks/feature %}}
+
+{{% blocks/feature icon="fas fa-folder-open" title="Documentation" url="/docs/" %}}
+Learning the usage of Jenkins Operator will make your life easier. After that, you can easily contribute to the project.
+{{% /blocks/feature %}}
+
+{{% blocks/feature icon="fas fa-bug" title="Bugs" url="https://github.com/jenkinsci/kubernetes-operator/issues" %}}
+Help us work on the software by reporting or fixing bugs. Make the Jenkins Operator better.
+{{% /blocks/feature %}}
+
+
+{{< /blocks/section >}}
+
diff --git a/website/content/en/about/_index.html b/website/content/en/about/_index.html
new file mode 100644
index 00000000..62d85959
--- /dev/null
+++ b/website/content/en/about/_index.html
@@ -0,0 +1,43 @@
+---
+title: What's the Jenkins Operator?
+linkTitle: What's the Jenkins Operator?
+menu:
+ main:
+ weight: 10
+
+---
+
+{{% blocks/lead color="primary" %}}
+
+jenkins-operator is a Kubernetes native operator which fully manages Jenkins on Kubernetes. It was built with immutability and declarative configuration as code in mind.
+
The main reason why we decided to write the jenkins-operator is the fact that we faced a lot of problems with standard Jenkins deployment. We want to make Jenkins more robust, suitable for dynamic and multi-tenant environments.
+
+
+ Some of the problems we want to solve:
+
+
Volumes handling (AWS EBS volume attach/detach issue when using PVC)
+
Installing plugins with incompatible versions or security vulnerabilities
+
Better configuration as code
+
Lack of end to end tests
+
Handle graceful shutdown properly
+
Security and hardening out of the box
+
Orphaned jobs with no jnlp connection
+
Make errors more visible for end users
+
Backup and restore for jobs history
+
+
+
+
+
+{{< /blocks/section >}}
\ No newline at end of file
diff --git a/website/content/en/blog/_index.md b/website/content/en/blog/_index.md
new file mode 100644
index 00000000..43820eb1
--- /dev/null
+++ b/website/content/en/blog/_index.md
@@ -0,0 +1,13 @@
+---
+title: "Docsy Blog"
+linkTitle: "Blog"
+menu:
+ main:
+ weight: 30
+---
+
+
+This is the **blog** section. It has two categories: News and Releases.
+
+Files in these directories will be listed in reverse chronological order.
+
diff --git a/website/content/en/blog/news/_index.md b/website/content/en/blog/news/_index.md
new file mode 100644
index 00000000..13d25eaa
--- /dev/null
+++ b/website/content/en/blog/news/_index.md
@@ -0,0 +1,8 @@
+
+---
+title: "News About Docsy"
+linkTitle: "News"
+weight: 20
+---
+
+
diff --git a/website/content/en/blog/news/first-post/featured-sunset-get.png b/website/content/en/blog/news/first-post/featured-sunset-get.png
new file mode 100644
index 00000000..db3373c0
Binary files /dev/null and b/website/content/en/blog/news/first-post/featured-sunset-get.png differ
diff --git a/website/content/en/blog/news/first-post/index.md b/website/content/en/blog/news/first-post/index.md
new file mode 100644
index 00000000..b6bfb477
--- /dev/null
+++ b/website/content/en/blog/news/first-post/index.md
@@ -0,0 +1,46 @@
+---
+date: 2018-10-06
+title: "Easy documentation with Docsy"
+linkTitle: "Announcing Docsy"
+description: "The Docsy Hugo theme lets project maintainers and contributors focus on content, not on reinventing a website infrastructure from scratch"
+author: Riona MacNamara ([@rionam](https://twitter.com/bepsays))
+resources:
+- src: "**.{png,jpg}"
+ title: "Image #:counter"
+ params:
+ byline: "Photo: Riona MacNamara / CC-BY-CA"
+---
+
+**This is a typical blog post that includes images.**
+
+The front matter specifies the date of the blog post, its title, a short description that will be displayed on the blog landing page, and its author.
+
+## Including images
+
+Here's an image (`featured-sunset-get.png`) that includes a byline and a caption.
+
+{{< imgproc sunset Fill "600x300" >}}
+Fetch and scale an image in the upcoming Hugo 0.43.
+{{< /imgproc >}}
+
+The front matter of this post specifies properties to be assigned to all image resources:
+
+```
+resources:
+- src: "**.{png,jpg}"
+ title: "Image #:counter"
+ params:
+ byline: "Photo: Riona MacNamara / CC-BY-CA"
+```
+
+To include the image in a page, specify its details like this:
+
+```
+{{< imgproc sunset Fill "600x300" >}}
+Fetch and scale an image in the upcoming Hugo 0.43.
+{{< /imgproc >}}
+```
+
+The image will be rendered at the size and byline specified in the front matter.
+
+
diff --git a/website/content/en/blog/news/second-post.md b/website/content/en/blog/news/second-post.md
new file mode 100755
index 00000000..26e5fbd9
--- /dev/null
+++ b/website/content/en/blog/news/second-post.md
@@ -0,0 +1,245 @@
+
+---
+title: "The second blog post"
+linkTitle: "Second blog post"
+date: 2018-10-06
+description: >
+ A short lead descripton about this content page. Text here can also be **bold** or _italic_ and can even be split over multiple paragraphs.
+---
+
+Text can be **bold**, _italic_, or ~~strikethrough~~. [Links](https://github.com) should be blue with no underlines (unless hovered over).
+
+There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.
+
+There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.
+
+> There should be no margin above this first sentence.
+>
+> Blockquotes should be a lighter gray with a border along the left side in the secondary color.
+>
+> There should be no margin below this final sentence.
+
+## First Header
+
+This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.
+
+Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito
+occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat:
+pignora hinc reppulit nos **aut**, aptos, ipsa.
+
+Meae optatos *passa est* Epiros utiliter *Talibus niveis*, hoc lata, edidit.
+Dixi ad aestum.
+
+## Header 2
+
+> This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Header 3
+
+```
+This is a code block following a header.
+```
+
+#### Header 4
+
+* This is an unordered list following a header.
+* This is an unordered list following a header.
+* This is an unordered list following a header.
+
+##### Header 5
+
+1. This is an ordered list following a header.
+2. This is an ordered list following a header.
+3. This is an ordered list following a header.
+
+###### Header 6
+
+| What | Follows |
+|-----------|-----------------|
+| A table | A header |
+| A table | A header |
+| A table | A header |
+
+----------------
+
+There's a horizontal rule above and below this.
+
+----------------
+
+Here is an unordered list:
+
+* Salt-n-Pepa
+* Bel Biv DeVoe
+* Kid 'N Play
+
+And an ordered list:
+
+1. Michael Jackson
+2. Michael Bolton
+3. Michael Bublé
+
+And an unordered task list:
+
+- [x] Create a sample markdown document
+- [x] Add task lists to it
+- [ ] Take a vacation
+
+And a "mixed" task list:
+
+- [ ] Steal underpants
+- ?
+- [ ] Profit!
+
+And a nested list:
+
+* Jackson 5
+ * Michael
+ * Tito
+ * Jackie
+ * Marlon
+ * Jermaine
+* TMNT
+ * Leonardo
+ * Michelangelo
+ * Donatello
+ * Raphael
+
+Definition lists can be used with Markdown syntax. Definition terms are bold.
+
+Name
+: Godzilla
+
+Born
+: 1952
+
+Birthplace
+: Japan
+
+Color
+: Green
+
+
+----------------
+
+Tables should have bold headings and alternating shaded rows.
+
+| Artist | Album | Year |
+|-------------------|-----------------|------|
+| Michael Jackson | Thriller | 1982 |
+| Prince | Purple Rain | 1984 |
+| Beastie Boys | License to Ill | 1986 |
+
+If a table is too wide, it should scroll horizontally.
+
+| Artist | Album | Year | Label | Awards | Songs |
+|-------------------|-----------------|------|-------------|----------|-----------|
+| Michael Jackson | Thriller | 1982 | Epic Records | Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical | Wanna Be Startin' Somethin', Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life |
+| Prince | Purple Rain | 1984 | Warner Brothers Records | Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal | Let's Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I'm a Star, Purple Rain |
+| Beastie Boys | License to Ill | 1986 | Mercury Records | noawardsbutthistablecelliswide | Rhymin & Stealin, The New Style, She's Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill |
+
+----------------
+
+Code snippets like `var foo = "bar";` can be shown inline.
+
+Also, `this should vertically align` ~~`with this`~~ ~~and this~~.
+
+Code can also be shown in a block element.
+
+```
+foo := "bar";
+bar := "foo";
+```
+
+Code can also use syntax highlighting.
+
+```go
+func main() {
+ input := `var foo = "bar";`
+
+ lexer := lexers.Get("javascript")
+ iterator, _ := lexer.Tokenise(nil, input)
+ style := styles.Get("github")
+ formatter := html.New(html.WithLineNumbers())
+
+ var buff bytes.Buffer
+ formatter.Format(&buff, style, iterator)
+
+ fmt.Println(buff.String())
+}
+```
+
+```
+Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.
+```
+
+Inline code inside table cells should still be distinguishable.
+
+| Language | Code |
+|-------------|--------------------|
+| Javascript | `var foo = "bar";` |
+| Ruby | `foo = "bar"{` |
+
+----------------
+
+Small images should be shown at their actual size.
+
+
+
+Large images should always scale down and fit in the content container.
+
+
+
+## Components
+
+### Alerts
+
+{{< alert >}}This is an alert.{{< /alert >}}
+{{< alert title="Note:" >}}This is an alert with a title.{{< /alert >}}
+{{< alert type="success" >}}This is a successful alert.{{< /alert >}}
+{{< alert type="warning" >}}This is a warning!{{< /alert >}}
+{{< alert type="warning" title="Warning!" >}}This is a warning with a title!{{< /alert >}}
+
+
+## Sizing
+
+Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Parameters available
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Using pixels
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Using rem
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+## Memory
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### RAM to use
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### More is better
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Used RAM
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+
+
+```
+This is the final element on the page and there should be no margin below this.
+```
diff --git a/website/content/en/blog/releases/_index.md b/website/content/en/blog/releases/_index.md
new file mode 100644
index 00000000..b1d9eb4f
--- /dev/null
+++ b/website/content/en/blog/releases/_index.md
@@ -0,0 +1,8 @@
+
+---
+title: "New Releases"
+linkTitle: "Releases"
+weight: 20
+---
+
+
diff --git a/website/content/en/blog/releases/in-depth-monoliths-detailed-spec.md b/website/content/en/blog/releases/in-depth-monoliths-detailed-spec.md
new file mode 100755
index 00000000..bb16131e
--- /dev/null
+++ b/website/content/en/blog/releases/in-depth-monoliths-detailed-spec.md
@@ -0,0 +1,245 @@
+
+---
+title: "Another Great Release"
+linkTitle: "Release New Features"
+date: 2018-01-04
+description: >
+ A short lead descripton about this content page. Text here can also be **bold** or _italic_ and can even be split over multiple paragraphs.
+---
+
+Text can be **bold**, _italic_, or ~~strikethrough~~. [Links](https://github.com) should be blue with no underlines (unless hovered over).
+
+There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.
+
+There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.
+
+> There should be no margin above this first sentence.
+>
+> Blockquotes should be a lighter gray with a border along the left side in the secondary color.
+>
+> There should be no margin below this final sentence.
+
+## First Header
+
+This is a normal paragraph following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.
+
+Lorem markdownum tuta hospes stabat; idem saxum facit quaterque repetito
+occumbere, oves novem gestit haerebat frena; qui. Respicit recurvam erat:
+pignora hinc reppulit nos **aut**, aptos, ipsa.
+
+Meae optatos *passa est* Epiros utiliter *Talibus niveis*, hoc lata, edidit.
+Dixi ad aestum.
+
+## Header 2
+
+> This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Header 3
+
+```
+This is a code block following a header.
+```
+
+#### Header 4
+
+* This is an unordered list following a header.
+* This is an unordered list following a header.
+* This is an unordered list following a header.
+
+##### Header 5
+
+1. This is an ordered list following a header.
+2. This is an ordered list following a header.
+3. This is an ordered list following a header.
+
+###### Header 6
+
+| What | Follows |
+|-----------|-----------------|
+| A table | A header |
+| A table | A header |
+| A table | A header |
+
+----------------
+
+There's a horizontal rule above and below this.
+
+----------------
+
+Here is an unordered list:
+
+* Salt-n-Pepa
+* Bel Biv DeVoe
+* Kid 'N Play
+
+And an ordered list:
+
+1. Michael Jackson
+2. Michael Bolton
+3. Michael Bublé
+
+And an unordered task list:
+
+- [x] Create a sample markdown document
+- [x] Add task lists to it
+- [ ] Take a vacation
+
+And a "mixed" task list:
+
+- [ ] Steal underpants
+- ?
+- [ ] Profit!
+
+And a nested list:
+
+* Jackson 5
+ * Michael
+ * Tito
+ * Jackie
+ * Marlon
+ * Jermaine
+* TMNT
+ * Leonardo
+ * Michelangelo
+ * Donatello
+ * Raphael
+
+Definition lists can be used with Markdown syntax. Definition terms are bold.
+
+Name
+: Godzilla
+
+Born
+: 1952
+
+Birthplace
+: Japan
+
+Color
+: Green
+
+
+----------------
+
+Tables should have bold headings and alternating shaded rows.
+
+| Artist | Album | Year |
+|-------------------|-----------------|------|
+| Michael Jackson | Thriller | 1982 |
+| Prince | Purple Rain | 1984 |
+| Beastie Boys | License to Ill | 1986 |
+
+If a table is too wide, it should scroll horizontally.
+
+| Artist | Album | Year | Label | Awards | Songs |
+|-------------------|-----------------|------|-------------|----------|-----------|
+| Michael Jackson | Thriller | 1982 | Epic Records | Grammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-Classical | Wanna Be Startin' Somethin', Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life |
+| Prince | Purple Rain | 1984 | Warner Brothers Records | Grammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with Vocal | Let's Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I'm a Star, Purple Rain |
+| Beastie Boys | License to Ill | 1986 | Mercury Records | noawardsbutthistablecelliswide | Rhymin & Stealin, The New Style, She's Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill |
+
+----------------
+
+Code snippets like `var foo = "bar";` can be shown inline.
+
+Also, `this should vertically align` ~~`with this`~~ ~~and this~~.
+
+Code can also be shown in a block element.
+
+```
+foo := "bar";
+bar := "foo";
+```
+
+Code can also use syntax highlighting.
+
+```go
+func main() {
+ input := `var foo = "bar";`
+
+ lexer := lexers.Get("javascript")
+ iterator, _ := lexer.Tokenise(nil, input)
+ style := styles.Get("github")
+ formatter := html.New(html.WithLineNumbers())
+
+ var buff bytes.Buffer
+ formatter.Format(&buff, style, iterator)
+
+ fmt.Println(buff.String())
+}
+```
+
+```
+Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.
+```
+
+Inline code inside table cells should still be distinguishable.
+
+| Language | Code |
+|-------------|--------------------|
+| Javascript | `var foo = "bar";` |
+| Ruby | `foo = "bar"{` |
+
+----------------
+
+Small images should be shown at their actual size.
+
+
+
+Large images should always scale down and fit in the content container.
+
+
+
+## Components
+
+### Alerts
+
+{{< alert >}}This is an alert.{{< /alert >}}
+{{< alert title="Note:" >}}This is an alert with a title.{{< /alert >}}
+{{< alert type="success" >}}This is a successful alert.{{< /alert >}}
+{{< alert type="warning" >}}This is a warning!{{< /alert >}}
+{{< alert type="warning" title="Warning!" >}}This is a warning with a title!{{< /alert >}}
+
+
+## Sizing
+
+Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Parameters available
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Using pixels
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Using rem
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+## Memory
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### RAM to use
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### More is better
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+### Used RAM
+
+Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.
+
+
+
+```
+This is the final element on the page and there should be no margin below this.
+```
diff --git a/website/content/en/community/_index.md b/website/content/en/community/_index.md
new file mode 100644
index 00000000..cdade163
--- /dev/null
+++ b/website/content/en/community/_index.md
@@ -0,0 +1,8 @@
+---
+title: Community
+menu:
+ main:
+ weight: 40
+---
+
+
diff --git a/website/content/en/docs/Developer Guide/_index.md b/website/content/en/docs/Developer Guide/_index.md
new file mode 100644
index 00000000..423f72ee
--- /dev/null
+++ b/website/content/en/docs/Developer Guide/_index.md
@@ -0,0 +1,151 @@
+---
+title: "Developer Guide"
+linkTitle: "Developer Guide"
+weight: 60
+date: 2019-08-05
+description: >
+ Jenkins Operator for developers
+---
+
+{{% pageinfo %}}
+This document explains how to setup your development environment.
+{{% /pageinfo %}}
+
+## Prerequisites
+
+- [operator_sdk][operator_sdk] version v0.8.1
+- [git][git_tool]
+- [go][go_tool] version v1.12+
+- [goimports, golint, checkmake and staticcheck][install_dev_tools]
+- [minikube][minikube] version v1.1.0+ (preferred Hypervisor - [virtualbox][virtualbox])
+- [docker][docker_tool] version 17.03+
+
+## Clone repository and download dependencies
+
+```bash
+mkdir -p $GOPATH/src/github.com/jenkinsci
+cd $GOPATH/src/github.com/jenkinsci/
+git clone git@github.com:jenkinsci/kubernetes-operator.git
+cd kubernetes-operator
+make go-dependencies
+```
+
+## Build and run with a minikube
+
+Build and run **jenkins-operator** locally:
+
+```bash
+make minikube-run EXTRA_ARGS='--minikube --local'
+```
+
+Once minikube and **jenkins-operator** are up and running, apply Jenkins custom resource:
+
+```bash
+kubectl apply -f deploy/crds/jenkins_v1alpha2_jenkins_cr.yaml
+kubectl get jenkins -o yaml
+kubectl get po
+```
+
+## Build and run with a remote Kubernetes cluster
+
+You can also run the controller locally and make it listen to a remote Kubernetes server.
+
+```bash
+make run NAMESPACE=default KUBECTL_CONTEXT=remote-k8s EXTRA_ARGS='--kubeconfig ~/.kube/config'
+```
+
+Once minikube and **jenkins-operator** are up and running, apply Jenkins custom resource:
+
+```bash
+kubectl --context remote-k8s --namespace default apply -f deploy/crds/jenkins_v1alpha2_jenkins_cr.yaml
+kubectl --context remote-k8s --namespace default get jenkins -o yaml
+kubectl --context remote-k8s --namespace default get po
+```
+
+## Testing
+
+Run unit tests:
+
+```bash
+make test
+```
+
+### Running E2E tests on Linux
+
+Run e2e tests with minikube:
+
+```bash
+make minikube-start
+eval $(minikube docker-env)
+make build e2e
+```
+
+Run the specific e2e test:
+
+```bash
+make build e2e E2E_TEST_SELECTOR='^TestConfiguration$'
+```
+
+### Running E2E tests on macOS
+
+At first, you need to start minikube:
+```bash
+$ make minikube-start
+$ eval $(minikube docker-env)
+```
+
+Build Docker image inside provided Linux container by:
+```bash
+$ make indocker
+```
+
+Build **jenkins-operator** inside container using:
+
+
+```bash
+$ make build
+```
+
+Then exit the container and run:
+```
+make e2e
+```
+
+## Tips & Tricks
+
+### Building docker image on minikube (for e2e tests)
+
+To be able to work with the docker daemon on `minikube` machine run the following command before building an image:
+
+```bash
+eval $(minikube docker-env)
+```
+
+### When `pkg/apis/jenkinsio/*/jenkins_types.go` has changed
+
+Run:
+
+```bash
+make deepcopy-gen
+```
+
+### Getting Jenkins URL and basic credentials
+
+```bash
+minikube service jenkins-operator-http- --url
+kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.user}' | base64 -d
+kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.password}' | base64 -d
+```
+
+
+[dep_tool]:https://golang.github.io/dep/docs/installation.html
+[git_tool]:https://git-scm.com/downloads
+[go_tool]:https://golang.org/dl/
+[operator_sdk]:https://github.com/operator-framework/operator-sdk
+[fork_guide]:https://help.github.com/articles/fork-a-repo/
+[docker_tool]:https://docs.docker.com/install/
+[kubectl_tool]:https://kubernetes.io/docs/tasks/tools/install-kubectl/
+[minikube]:https://kubernetes.io/docs/tasks/tools/install-minikube/
+[virtualbox]:https://www.virtualbox.org/wiki/Downloads
+[jenkins-operator]:../README.md
+[install_dev_tools]:install_dev_tools.md
diff --git a/website/content/en/docs/Developer Guide/tools.md b/website/content/en/docs/Developer Guide/tools.md
new file mode 100644
index 00000000..95285d80
--- /dev/null
+++ b/website/content/en/docs/Developer Guide/tools.md
@@ -0,0 +1,57 @@
+---
+title: "Tools"
+linkTitle: "Tools"
+weight: 30
+date: 2019-08-05
+description: >
+ Required tools for building and running Jenkins Operator
+---
+
+{{% pageinfo %}}
+This document explains how to install the Go tools used by the development process.
+{{% /pageinfo %}}
+
+## Configure environment variables
+
+```bash
+export GOPATH=/home/go # example value
+export GOROOT=/usr/lib/go-1.12 # example value
+export PATH=$GOPATH/bin:$PATH
+```
+
+## goimports
+
+```
+go get golang.org/x/tools/cmd/goimports
+cd $GOPATH/src/golang.org/x/tools/cmd/goimports
+go build
+go install
+```
+
+## golint
+
+```
+go get -u golang.org/x/lint/golint
+cd $GOPATH/src/golang.org/x/lint/golint
+go build
+go install
+```
+
+## checkmake
+```
+go get github.com/mrtazz/checkmake
+cd $GOPATH/src/github.com/mrtazz/checkmake
+go build
+go install
+```
+
+## staticcheck
+
+```
+mkdir -p $GOPATH/src/github.com/dominikh/
+cd $GOPATH/src/github.com/dominikh/
+git clone https://github.com/dominikh/go-tools.git
+cd $GOPATH/src/github.com/dominikh/go-tools/staticcheck
+go build
+go install
+```
diff --git a/website/content/en/docs/Getting Started/_index.md b/website/content/en/docs/Getting Started/_index.md
new file mode 100644
index 00000000..984fbb1e
--- /dev/null
+++ b/website/content/en/docs/Getting Started/_index.md
@@ -0,0 +1,17 @@
+---
+title: "Getting Started"
+linkTitle: "Getting Started"
+weight: 10
+date: 2019-08-05
+description: >
+ How to work with jenkins-operator
+---
+
+{{% pageinfo %}}
+This document describes a getting started guide for **jenkins-operator**
+{{% /pageinfo %}}
+
+## First Steps
+
+Prepare your Kubernetes cluster and set up access.
+Once you have running Kubernetes cluster you can focus on installing **jenkins-operator** according to the [Installation](/docs/installation/) guide.
diff --git a/website/content/en/docs/Getting Started/v0.1.1/_index.md b/website/content/en/docs/Getting Started/v0.1.1/_index.md
new file mode 100644
index 00000000..bab3c10d
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/_index.md
@@ -0,0 +1,17 @@
+---
+title: "v0.1.1"
+linkTitle: "v0.1.1"
+weight: 10
+date: 2019-08-05
+description: >
+ How to work with jenkins-operator legacy version. We recommend migration to v0.2.0 version
+---
+
+{{% pageinfo %}}
+This document describes a getting started guide for **jenkins-operator** `v0.1.1` and an additional configuration.
+{{% /pageinfo %}}
+
+## First Steps
+
+Prepare your Kubernetes cluster and set up access.
+Once you have running Kubernetes cluster you can focus on installing **jenkins-operator** according to the [Installation](/docs/installation/) guide.
diff --git a/website/content/en/docs/Getting Started/v0.1.1/aks.md b/website/content/en/docs/Getting Started/v0.1.1/aks.md
new file mode 100644
index 00000000..ebc9a3f8
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/aks.md
@@ -0,0 +1,24 @@
+---
+title: "AKS"
+linkTitle: "AKS"
+weight: 10
+date: 2019-08-05
+description: >
+ Additional configuration for Azure Kubernetes Service
+---
+
+Azure AKS managed Kubernetes service adds to every pod the following envs:
+
+```yaml
+- name: KUBERNETES_PORT_443_TCP_ADDR
+ value:
+- name: KUBERNETES_PORT
+ value: tcp://
+- name: KUBERNETES_PORT_443_TCP
+ value: tcp://
+- name: KUBERNETES_SERVICE_HOST
+ value:
+```
+
+The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents
+restart Jenkins pod over and over again.
diff --git a/website/content/en/docs/Getting Started/v0.1.1/configuration.md b/website/content/en/docs/Getting Started/v0.1.1/configuration.md
new file mode 100644
index 00000000..f6e0c845
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/configuration.md
@@ -0,0 +1,278 @@
+---
+title: "Configuration"
+linkTitle: "Configuration"
+weight: 2
+date: 2019-08-05
+description: >
+ How to configure Jenkins with Operator
+---
+
+Jenkins operator uses [job-dsl][job-dsl] and [kubernetes-credentials-provider][kubernetes-credentials-provider] plugins for configuring jobs
+and deploy keys.
+
+## Prepare job definitions and pipelines
+
+First you have to prepare pipelines and job definition in your GitHub repository using the following structure:
+
+```
+cicd/
+├── jobs
+│ └── build.jenkins
+└── pipelines
+ └── build.jenkins
+```
+
+**cicd/jobs/build.jenkins** it's a job definition:
+
+```
+#!/usr/bin/env groovy
+
+pipelineJob('build-jenkins-operator') {
+ displayName('Build jenkins-operator')
+
+ definition {
+ cpsScm {
+ scm {
+ git {
+ remote {
+ url('https://github.com/jenkinsci/kubernetes-operator.git')
+ credentials('jenkins-operator')
+ }
+ branches('*/master')
+ }
+ }
+ scriptPath('cicd/pipelines/build.jenkins')
+ }
+ }
+}
+```
+
+**cicd/jobs/build.jenkins** it's an actual Jenkins pipeline:
+
+```
+#!/usr/bin/env groovy
+
+def label = "build-jenkins-operator-${UUID.randomUUID().toString()}"
+def home = "/home/jenkins"
+def workspace = "${home}/workspace/build-jenkins-operator"
+def workdir = "${workspace}/src/github.com/jenkinsci/kubernetes-operator/"
+
+podTemplate(label: label,
+ containers: [
+ containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'),
+ containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true),
+ ],
+ envVars: [
+ envVar(key: 'GOPATH', value: workspace),
+ ],
+ ) {
+
+ node(label) {
+ dir(workdir) {
+ stage('Init') {
+ timeout(time: 3, unit: 'MINUTES') {
+ checkout scm
+ }
+ container('go') {
+ sh 'apk --no-cache --update add make git gcc libc-dev'
+ }
+ }
+
+ stage('Dep') {
+ container('go') {
+ sh 'make dep'
+ }
+ }
+
+ stage('Test') {
+ container('go') {
+ sh 'make test'
+ }
+ }
+
+ stage('Build') {
+ container('go') {
+ sh 'make build'
+ }
+ }
+ }
+ }
+}
+```
+
+## Configure Seed Jobs
+
+Jenkins Seed Jobs are configured using `Jenkins.spec.seedJobs` section from your custom resource manifest:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ seedJobs:
+ - id: jenkins-operator
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+```
+
+**jenkins-operator** will automatically discover and configure all seed jobs.
+
+You can verify if deploy keys were successfully configured in Jenkins **Credentials** tab.
+
+
+
+You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.
+
+
+
+If your GitHub repository is **private** you have to configure SSH or username/password authentication.
+
+### SSH authentication
+
+#### Generate SSH Keys
+
+There are two methods of SSH private key generation:
+
+```bash
+$ openssl genrsa -out 2048
+```
+
+or
+
+```bash
+$ ssh-keygen -t rsa -b 2048
+$ ssh-keygen -p -f -m pem
+```
+
+Then copy content from generated file.
+
+#### Public key
+
+If you want to upload your public key to your Git server you need to extract it.
+
+If key was generated by `openssl` then you need to type this to extract public key:
+
+```bash
+$ openssl rsa -in -pubout > .pub
+```
+
+If key was generated by `ssh-keygen` the public key content is located in .pub and there is no need to extract public key
+
+#### Configure SSH authentication
+
+Configure seed job like:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ seedJobs:
+ - id: jenkins-operator-ssh
+ credentialType: basicSSHUserPrivateKey
+ credentialID: k8s-ssh
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git
+```
+
+and create Kubernetes Secret(name of secret should be the same from `credentialID` field):
+
+```
+apiVersion: v1
+kind: Secret
+metadata:
+ name: k8s-ssh
+stringData:
+ privateKey: |
+ -----BEGIN RSA PRIVATE KEY-----
+ MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO
+ oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8
+ ...
+ username: github_user_name
+```
+
+### Username & password authentication
+
+Configure seed job like:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ seedJobs:
+ - id: jenkins-operator-user-pass
+ credentialType: usernamePassword
+ credentialID: k8s-user-pass
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+```
+
+and create Kubernetes Secret(name of secret should be the same from `credentialID` field):
+
+```
+apiVersion: v1
+kind: Secret
+metadata:
+ name: k8s-user-pass
+stringData:
+ username: github_user_name
+ password: password_or_token
+```
+
+## Jenkins login credentials
+
+The operator automatically generate Jenkins user name and password and stores it in Kubernetes secret named
+`jenkins-operator-credentials-` in namespace where Jenkins CR has been deployed.
+
+If you want change it you can override the secret:
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: jenkins-operator-credentials-
+ namespace:
+data:
+ user:
+ password:
+```
+
+If needed **jenkins-operator** will restart Jenkins master pod and then you can login with the new user and password
+credentials.
+
+## Override default Jenkins container command
+
+The default command for the Jenkins master container `jenkins/jenkins:lts` looks like:
+
+```yaml
+command:
+- bash
+- -c
+- /var/jenkins/scripts/init.sh && /sbin/tini -s -- /usr/local/bin/jenkins.sh
+```
+
+The script`/var/jenkins/scripts/init.sh` is provided be the operator and configures init.groovy.d(creates Jenkins user)
+and installs plugins.
+The `/sbin/tini -s -- /usr/local/bin/jenkins.sh` command runs the Jenkins master main process.
+
+You can overwrite it in the following pattern:
+
+```yaml
+command:
+- bash
+- -c
+- /var/jenkins/scripts/init.sh && && /sbin/tini -s -- /usr/local/bin/jenkins.sh
+```
+
+[job-dsl]:https://github.com/jenkinsci/job-dsl-plugin
+[kubernetes-credentials-provider]:https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/
\ No newline at end of file
diff --git a/website/content/en/docs/Getting Started/v0.1.1/configure-backup-and-restore.md b/website/content/en/docs/Getting Started/v0.1.1/configure-backup-and-restore.md
new file mode 100644
index 00000000..aff579c4
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/configure-backup-and-restore.md
@@ -0,0 +1,84 @@
+---
+title: "Configure backup and restore"
+linkTitle: "Configure backup and restore"
+weight: 10
+date: 2019-08-05
+description: >
+ Prevent job history loss
+---
+
+Backup and restore is done by container sidecar.
+
+#### Create PVC
+
+Save to file pvc.yaml:
+```yaml
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name:
+ namespace:
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 500Gi
+```
+
+Run command:
+```bash
+$ kubectl -n create -f pvc.yaml
+```
+
+#### Configure Jenkins CR
+
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name:
+ namespace:
+spec:
+ master:
+ securityContext:
+ runAsUser: 1000
+ fsGroup: 1000
+ containers:
+ - name: jenkins-master
+ image: jenkins/jenkins:lts
+ - name: backup # container responsible for backup and restore
+ env:
+ - name: BACKUP_DIR
+ value: /backup
+ - name: JENKINS_HOME
+ value: /jenkins-home
+ - name: BACKUP_COUNT
+ value: "3" # keep only the 2 most recent backups
+ image: virtuslab/jenkins-operator-backup-pvc:v0.0.6 # look at backup/pvc directory
+ imagePullPolicy: IfNotPresent
+ volumeMounts:
+ - mountPath: /jenkins-home # Jenkins home volume
+ name: jenkins-home
+ - mountPath: /backup # backup volume
+ name: backup
+ volumes:
+ - name: backup # PVC volume where backups will be stored
+ persistentVolumeClaim:
+ claimName:
+ backup:
+ containerName: backup # container name is responsible for backup
+ action:
+ exec:
+ command:
+ - /home/user/bin/backup.sh # this command is invoked on "backup" container to make backup, for example /home/user/bin/backup.sh , is passed by operator
+ interval: 30 # how often make backup in seconds
+ makeBackupBeforePodDeletion: true # make backup before pod deletion
+ restore:
+ containerName: backup # container name is responsible for restore backup
+ action:
+ exec:
+ command:
+ - /home/user/bin/restore.sh # this command is invoked on "backup" container to make restore backup, for example /home/user/bin/restore.sh , is passed by operator
+ #recoveryOnce: # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored
+```
diff --git a/website/content/en/docs/Getting Started/v0.1.1/customization.md b/website/content/en/docs/Getting Started/v0.1.1/customization.md
new file mode 100644
index 00000000..d5d6ff17
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/customization.md
@@ -0,0 +1,116 @@
+---
+title: "Customization"
+linkTitle: "Customization"
+weight: 3
+date: 2019-08-05
+description: >
+ How to customize Jenkins
+---
+
+Jenkins can be customized using groovy scripts or configuration as code plugin. All custom configuration is stored in
+the **jenkins-operator-user-configuration-** ConfigMap which is automatically created by **jenkins-operator**.
+
+**jenkins-operator** creates **jenkins-operator-user-configuration-** secret where user can store sensitive
+information used for custom configuration. If you have entry in secret named `PASSWORD` then you can use it in
+Configuration as Plugin as `adminAddress: "${PASSWORD}"`.
+
+```
+kubectl get secret jenkins-operator-user-configuration- -o yaml
+
+kind: Secret
+apiVersion: v1
+type: Opaque
+metadata:
+ name: jenkins-operator-user-configuration-
+ namespace: default
+data:
+ SECRET_JENKINS_ADMIN_ADDRESS: YXNkZgo=
+
+```
+
+```
+kubectl get configmap jenkins-operator-user-configuration- -o yaml
+
+apiVersion: v1
+data:
+ 1-configure-theme.groovy: |2
+ import jenkins.*
+ import jenkins.model.*
+ import hudson.*
+ import hudson.model.*
+ import org.jenkinsci.plugins.simpletheme.ThemeElement
+ import org.jenkinsci.plugins.simpletheme.CssTextThemeElement
+ import org.jenkinsci.plugins.simpletheme.CssUrlThemeElement
+
+ Jenkins jenkins = Jenkins.getInstance()
+
+ def decorator = Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class)
+
+ List configElements = new ArrayList<>();
+ configElements.add(new CssTextThemeElement("DEFAULT"));
+ configElements.add(new CssUrlThemeElement("https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css"));
+ decorator.setElements(configElements);
+ decorator.save();
+
+ jenkins.save()
+ 1-system-message.yaml: |2
+ jenkins:
+ systemMessage: "Configuration as Code integration works!!!"
+ adminAddress: "${SECRET_JENKINS_ADMIN_ADDRESS}"
+kind: ConfigMap
+metadata:
+ name: jenkins-operator-user-configuration-
+ namespace: default
+```
+
+When **jenkins-operator-user-configuration-** ConfigMap is updated Jenkins automatically
+runs the **jenkins-operator-user-configuration** Jenkins Job which executes all scripts then
+runs the **jenkins-operator-user-configuration-casc** Jenkins Job which applies Configuration as Code configuration.
+
+## Install Plugins
+
+Edit CR under `spec.master.plugins`:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ master:
+ plugins:
+ - name: simple-theme-plugin
+ version: 0.5.1
+```
+
+Under `spec.master.basePlugins` you can find plugins for valid **jenkins-operator** work:
+
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ master:
+ basePlugins:
+ - name: kubernetes
+ version: 1.18.3
+ - name: workflow-job
+ version: "2.34"
+ - name: workflow-aggregator
+ version: "2.6"
+ - name: git
+ version: 3.12.0
+ - name: job-dsl
+ version: "1.76"
+ - name: configuration-as-code
+ version: "1.29"
+ - name: configuration-as-code-support
+ version: "1.19"
+ - name: kubernetes-credentials-provider
+ version: 0.12.1
+```
+
+You can change version of them.
+
+Then **jenkins-operator** will automatically install plugins after Jenkins master pod restart.
\ No newline at end of file
diff --git a/website/content/en/docs/Getting Started/v0.1.1/deploy-jenkins.md b/website/content/en/docs/Getting Started/v0.1.1/deploy-jenkins.md
new file mode 100644
index 00000000..892f3be3
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/deploy-jenkins.md
@@ -0,0 +1,91 @@
+---
+title: "Deploy Jenkins"
+linkTitle: "Deploy Jenkins"
+weight: 1
+date: 2019-08-05
+description: >
+ Deploy production ready Jenkins Operator manifest
+---
+
+## Deploy Jenkins
+
+Once jenkins-operator is up and running let's deploy actual Jenkins instance.
+Create manifest ie. **jenkins_instance.yaml** with following data and save it on drive.
+
+```bash
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ master:
+ containers:
+ - name: jenkins-master
+ image: jenkins/jenkins:lts
+ imagePullPolicy: Always
+ livenessProbe:
+ failureThreshold: 12
+ httpGet:
+ path: /login
+ port: http
+ scheme: HTTP
+ initialDelaySeconds: 80
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 3
+ httpGet:
+ path: /login
+ port: http
+ scheme: HTTP
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 1
+ resources:
+ limits:
+ cpu: 1500m
+ memory: 3Gi
+ requests:
+ cpu: "1"
+ memory: 500Mi
+ seedJobs:
+ - id: jenkins-operator
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+```
+
+Deploy Jenkins to K8s:
+
+```bash
+kubectl create -f jenkins_instance.yaml
+```
+Watch Jenkins instance being created:
+
+```bash
+kubectl get pods -w
+```
+
+Get Jenkins credentials:
+
+```bash
+kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.user}' | base64 -d
+kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.password}' | base64 -d
+```
+
+Connect to Jenkins (minikube):
+
+```bash
+minikube service jenkins-operator-http- --url
+```
+
+Connect to Jenkins (actual Kubernetes cluster):
+
+```bash
+kubectl port-forward jenkins- 8080:8080
+```
+Then open browser with address `http://localhost:8080`.
+
diff --git a/website/content/en/docs/Getting Started/v0.1.1/diagnostics.md b/website/content/en/docs/Getting Started/v0.1.1/diagnostics.md
new file mode 100644
index 00000000..8bc213d1
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/diagnostics.md
@@ -0,0 +1,42 @@
+---
+title: "Diagnostics"
+linkTitle: "Diagnostics"
+weight: 40
+date: 2019-08-05
+description: >
+ How to deal with jenkins-operator problems
+---
+
+
+Turn on debug in **jenkins-operator** deployment:
+
+```bash
+sed -i 's|\(args:\).*|\1\ ["--debug"\]|' deploy/operator.yaml
+kubectl apply -f deploy/operator.yaml
+```
+
+Watch Kubernetes events:
+
+```bash
+kubectl get events --sort-by='{.lastTimestamp}'
+```
+
+Verify Jenkins master logs:
+
+```bash
+kubectl logs -f jenkins-
+```
+
+Verify jenkins-operator logs:
+
+```bash
+kubectl logs deployment/jenkins-operator
+```
+
+## Troubleshooting
+
+Delete Jenkins master pod and wait for the new one to come up:
+
+```bash
+kubectl delete pod jenkins-
+```
diff --git a/website/content/en/docs/Getting Started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2.md b/website/content/en/docs/Getting Started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2.md
new file mode 100644
index 00000000..5bae084b
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/migration-guide-v1alpha1-to-v1alpha2.md
@@ -0,0 +1,338 @@
+---
+title: "Migration guide from v1alpha1 to v1alpha2"
+linkTitle: "Migration guide from v1alpha1 to v1alpha2"
+weight: 50
+date: 2019-08-05
+description: >
+ How to migrate to new CRD manifest
+---
+
+Please not that **CRD manifests are global**, not namespaced, so every jenkins operator running on the cluster
+will be impacted by the new CRD manifest. Multiple operator instances with different versions *should* continue to work.
+
+## Stop jenkins-operator pod
+
+Run command:
+```bash
+$ kubectl -n scale deployment.apps/jenkins-operator --replicas=0
+deployment.apps/jenkins-operator scaled
+```
+
+Desired state:
+```bash
+$ kubectl -n get po
+No resources found.
+```
+
+## Stop Jenkins master pod
+
+Run command:
+```bash
+$ kubectl -n get po
+NAME READY STATUS RESTARTS AGE
+jenkins-operator- 2/2 Running 0 3m35s
+$ kubectl -n get delete po jenkins-operator-
+pod "jenkins-operator-" deleted
+```
+
+Desired state:
+```bash
+$ kubectl -n get po
+No resources found.
+```
+
+## Save Jenkins CR to jenkins.yaml file
+
+Run command:
+```bash
+$ kubectl -n get jenkins -o yaml > jenkins.yaml
+```
+
+## Modify jenkins.yaml file
+
+Change apiVersion to `apiVersion: jenkins.io/v1alpha2`
+
+New plugin format without dependent plugins:
+
+- `spec.master.basePlugins` example:
+```
+spec:
+ master:
+ basePlugins:
+ - name: a-plugin-name
+ version: "1.0.0"
+ ...
+```
+- `spec.master.plugins` example:
+```
+
+spec:
+ master:
+ plugins:
+ - name: a-plugin-name
+ version: "1.0.0"
+ ...
+```
+
+Move Jenkins `master` container properties to `spec.master.containers[jenkins-master]` (non exhaustive list):
+- `spec.master.image` -> `spec.master.containers[jenkins-master].image`
+- `spec.master.imagePullPolicy` -> `spec.master.containers[jenkins-master].imagePullPolicy`
+- `spec.master.livenessProbe` -> `spec.master.containers[jenkins-master].livenessProbe`
+- `spec.master.readinessProbe` -> `spec.master.containers[jenkins-master].readinessProbe`
+- `spec.master.resources` -> `spec.master.containers[jenkins-master].resources`
+- `spec.master.env` -> `spec.master.containers[jenkins-master].env`
+
+```
+spec:
+ master:
+ containers:
+ - name: jenkins-master
+ image: jenkins/jenkins:lts
+ ...
+```
+
+See also the examples bellow for more details. For even more details please look at the source code.
+Code that defines the data structures can be found [here](v0.1.1/jenkins-v1alpha2-scheme.md)
+
+### Examples
+
+Old format:
+```yaml
+apiVersion: jenkins.io/v1alpha1
+kind: Jenkins
+metadata:
+ name:
+ namespace:
+spec:
+ master:
+ basePlugins:
+ configuration-as-code:1.17:
+ - configuration-as-code-support:1.17
+ git:3.10.0:
+ - apache-httpcomponents-client-4-api:4.5.5-3.0
+ - credentials:2.1.19
+ - display-url-api:2.3.1
+ - git-client:2.7.7
+ - jsch:0.1.55
+ - junit:1.28
+ - mailer:1.23
+ - matrix-project:1.14
+ - scm-api:2.4.1
+ - script-security:1.59
+ - ssh-credentials:1.16
+ - structs:1.19
+ - workflow-api:2.34
+ - workflow-scm-step:2.7
+ - workflow-step-api:2.19
+ job-dsl:1.74:
+ - script-security:1.59
+ - structs:1.19
+ kubernetes-credentials-provider:0.12.1:
+ - credentials:2.1.19
+ - structs:1.19
+ - variant:1.2
+ kubernetes:1.15.5:
+ - apache-httpcomponents-client-4-api:4.5.5-3.0
+ - cloudbees-folder:6.8
+ - credentials:2.1.19
+ - durable-task:1.29
+ - jackson2-api:2.9.9
+ - kubernetes-credentials:0.4.0
+ - plain-credentials:1.5
+ - structs:1.19
+ - variant:1.2
+ - workflow-step-api:2.19
+ workflow-aggregator:2.6:
+ - ace-editor:1.1
+ - apache-httpcomponents-client-4-api:4.5.5-3.0
+ - authentication-tokens:1.3
+ - branch-api:2.5.2
+ - cloudbees-folder:6.8
+ - credentials-binding:1.18
+ - credentials:2.1.19
+ - display-url-api:2.3.1
+ - docker-commons:1.15
+ - docker-workflow:1.18
+ - durable-task:1.29
+ - git-client:2.7.7
+ - git-server:1.7
+ - handlebars:1.1.1
+ - jackson2-api:2.9.9
+ - jquery-detached:1.2.1
+ - jsch:0.1.55
+ - junit:1.28
+ - lockable-resources:2.5
+ - mailer:1.23
+ - matrix-project:1.14
+ - momentjs:1.1.1
+ - pipeline-build-step:2.9
+ - pipeline-graph-analysis:1.10
+ - pipeline-input-step:2.10
+ - pipeline-milestone-step:1.3.1
+ - pipeline-model-api:1.3.8
+ - pipeline-model-declarative-agent:1.1.1
+ - pipeline-model-definition:1.3.8
+ - pipeline-model-extensions:1.3.8
+ - pipeline-rest-api:2.11
+ - pipeline-stage-step:2.3
+ - pipeline-stage-tags-metadata:1.3.8
+ - pipeline-stage-view:2.11
+ - plain-credentials:1.5
+ - scm-api:2.4.1
+ - script-security:1.59
+ - ssh-credentials:1.16
+ - structs:1.19
+ - workflow-api:2.34
+ - workflow-basic-steps:2.16
+ - workflow-cps-global-lib:2.13
+ - workflow-cps:2.69
+ - workflow-durable-task-step:2.30
+ - workflow-job:2.32
+ - workflow-multibranch:2.21
+ - workflow-scm-step:2.7
+ - workflow-step-api:2.19
+ - workflow-support:3.3
+ workflow-job:2.32:
+ - scm-api:2.4.1
+ - script-security:1.59
+ - structs:1.19
+ - workflow-api:2.34
+ - workflow-step-api:2.19
+ - workflow-support:3.3
+ image: jenkins/jenkins:lts
+ imagePullPolicy: Always
+ livenessProbe:
+ failureThreshold: 12
+ httpGet:
+ path: /login
+ port: 8080
+ scheme: HTTP
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ plugins:
+ simple-theme-plugin:0.5.1: []
+ slack:2.24:
+ - workflow-step-api:2.19
+ - credentials:2.1.19
+ - display-url-api:2.3.1
+ - junit:1.28
+ - plain-credentials:1.5
+ - script-security:1.59
+ - structs:1.19
+ - token-macro:2.8
+ readinessProbe:
+ failureThreshold: 12
+ httpGet:
+ path: /login
+ port: 8080
+ scheme: HTTP
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ resources:
+ limits:
+ cpu: 1500m
+ memory: 3Gi
+ requests:
+ cpu: "1"
+ memory: 500Mi
+```
+
+New format:
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name:
+ namespace:
+spec:
+ master:
+ basePlugins:
+ - name: kubernetes
+ version: 1.15.7
+ - name: workflow-job
+ version: "2.32"
+ - name: workflow-aggregator
+ version: "2.6"
+ - name: git
+ version: 3.10.0
+ - name: job-dsl
+ version: "1.74"
+ - name: configuration-as-code
+ version: "1.19"
+ - name: configuration-as-code-support
+ version: "1.19"
+ - name: kubernetes-credentials-provider
+ version: 0.12.1
+ containers:
+ - name: jenkins-master
+ image: jenkins/jenkins:lts
+ imagePullPolicy: Always
+ livenessProbe:
+ failureThreshold: 12
+ httpGet:
+ path: /login
+ port: http
+ scheme: HTTP
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 3
+ httpGet:
+ path: /login
+ port: http
+ scheme: HTTP
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 1
+ resources:
+ limits:
+ cpu: 1500m
+ memory: 3Gi
+ requests:
+ cpu: "1"
+ memory: 500Mi
+ plugins:
+ - name: simple-theme-plugin
+ version: 0.5.1
+ - name: slack
+ version: 2.24
+```
+
+## Update CRD to new version
+
+New version of the Custom Resource definition for the operator needs to be applied:
+-[Jenkins CRD v1alpha2](https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml)
+
+To use default CRD file:
+```
+kubectl -n apply -f https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml
+```
+
+## Update RBAC to new version
+
+New operator version requires updated RBAC permissions:
+
+To use default Role file:
+```
+$ kubectl -n apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/role.yaml
+```
+
+## Deploy new operator manifests
+
+Replace your modified operator configuration file:
+```bash
+$ kubectl -n replace -f jenkins.yaml
+```
+
+Update operator version in the deployment file to `image: virtuslab/jenkins-operator:v0.1.0` and scale up,
+or use the default deployment manifest:
+```
+$ kubectl -n apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/operator.yaml
+```
diff --git a/website/content/en/docs/Getting Started/v0.1.1/scheme.md b/website/content/en/docs/Getting Started/v0.1.1/scheme.md
new file mode 100644
index 00000000..4bf11afd
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.1.1/scheme.md
@@ -0,0 +1,1444 @@
+---
+title: "Scheme"
+linkTitle: "Scheme"
+weight: 40
+date: 2019-08-05
+description: >
+ API Schema definitions for Jenkins CR
+---
+
+{{% pageinfo %}}
+This document contains API scheme for `jenkins-operator` manifest
+{{% /pageinfo %}}
+
+
Entrypoint array. Not executed within a shell.
+The docker image’s ENTRYPOINT is used if this is not provided.
+Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable
+cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax
+can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
+regardless of whether the variable exists or not.
+More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
+
+
+
+
+args
+
+[]string
+
+
+
+(Optional)
+
Arguments to the entrypoint.
+The docker image’s CMD is used if this is not provided.
+Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable
+cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax
+can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
+regardless of whether the variable exists or not.
+More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
+
+
+
+
+workingDir
+
+string
+
+
+
+(Optional)
+
Container’s working directory.
+If not specified, the container runtime’s default will be used, which
+might be configured in the container image.
List of ports to expose from the container. Exposing a port here gives
+the system additional information about the network connections a
+container uses, but is primarily informational. Not specifying a port here
+DOES NOT prevent that port from being exposed. Any port which is
+listening on the default “0.0.0.0” address inside a container will be
+accessible from the network.
List of sources to populate environment variables in the container.
+The keys defined within a source must be a C_IDENTIFIER. All invalid keys
+will be reported as an event when the container is starting. When a key exists in multiple
+sources, the value associated with the last source will take precedence.
+Values defined by an Env with a duplicate key will take precedence.
JenkinsMaster defines the Jenkins master pod attributes and plugins,
+every single change requires a Jenkins master pod restart
+
+
+
+
+
Field
+
Description
+
+
+
+
+
+masterAnnotations
+
+map[string]string
+
+
+
+(Optional)
+
Annotations is an unstructured key value map stored with a resource that may be
+set by external tools to store and retrieve arbitrary metadata. They are not
+queryable and should be preserved when modifying objects.
+More info: http://kubernetes.io/docs/user-guide/annotations
SecurityContext that applies to all the containers of the Jenkins
+Master. As per kubernetes specification, it can be overridden
+for each container individually.
+Defaults to:
+runAsUser: 1000
+fsGroup: 1000
List of containers belonging to the pod.
+Containers cannot currently be added or removed.
+There must be at least one container in a Pod.
+Defaults to:
+- image: jenkins/jenkins:lts
+imagePullPolicy: Always
+livenessProbe:
+failureThreshold: 12
+httpGet:
+path: /login
+port: http
+scheme: HTTP
+initialDelaySeconds: 80
+periodSeconds: 10
+successThreshold: 1
+timeoutSeconds: 5
+name: jenkins-master
+readinessProbe:
+failureThreshold: 3
+httpGet:
+path: /login
+port: http
+scheme: HTTP
+initialDelaySeconds: 30
+periodSeconds: 10
+successThreshold: 1
+timeoutSeconds: 1
+resources:
+limits:
+cpu: 1500m
+memory: 3Gi
+requests:
+cpu: “1”
+memory: 600Mi
Annotations is an unstructured key value map stored with a resource that may be
+set by external tools to store and retrieve arbitrary metadata. They are not
+queryable and should be preserved when modifying objects.
+More info: http://kubernetes.io/docs/user-guide/annotations
+
+
+
+
+labels
+
+map[string]string
+
+
+
+
Route service traffic to pods with label keys and values matching this
+selector. If empty or not present, the service is assumed to have an
+external process managing its endpoints, which Kubernetes will not
+modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.
+Ignored if type is ExternalName.
+More info: https://kubernetes.io/docs/concepts/services-networking/service/
Type determines how the Service is exposed. Defaults to ClusterIP. Valid
+options are ExternalName, ClusterIP, NodePort, and LoadBalancer.
+“ExternalName” maps to the specified externalName.
+“ClusterIP” allocates a cluster-internal IP address for load-balancing to
+endpoints. Endpoints are determined by the selector or if that is not
+specified, by manual construction of an Endpoints object. If clusterIP is
+“None”, no virtual IP is allocated and the endpoints are published as a
+set of endpoints rather than a stable IP.
+“NodePort” builds on ClusterIP and allocates a port on every node which
+routes to the clusterIP.
+“LoadBalancer” builds on NodePort and creates an
+external load-balancer (if supported in the current cloud) which routes
+to the clusterIP.
+More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services—service-types
The port on each node on which this service is exposed when type=NodePort or LoadBalancer.
+Usually assigned by the system. If specified, it will be allocated to the service
+if unused or else creation of the service will fail.
+Default is to auto-allocate a port if the ServiceType of this Service requires one.
+More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
Only applies to Service Type: LoadBalancer
+LoadBalancer will get created with the IP specified in this field.
+This feature depends on whether the underlying cloud-provider supports specifying
+the loadBalancerIP when a load balancer is created.
+This field will be ignored if the cloud-provider does not support the feature.
+
+
+
+
+
+
+Generated with gen-crd-api-reference-docs
+on git commit 37e531a.
+
diff --git a/website/content/en/docs/Getting Started/v0.2.0/_index.md b/website/content/en/docs/Getting Started/v0.2.0/_index.md
new file mode 100644
index 00000000..5106d0b3
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/_index.md
@@ -0,0 +1,17 @@
+---
+title: "v0.2.0"
+linkTitle: "v0.2.0"
+weight: 10
+date: 2019-08-05
+description: >
+ How to work with jenkins-operator latest version
+---
+
+{{% pageinfo %}}
+This document describes a getting started guide for **jenkins-operator** `v0.2.0` and an additional configuration.
+{{% /pageinfo %}}
+
+## First Steps
+
+Prepare your Kubernetes cluster and set up access.
+Once you have running Kubernetes cluster you can focus on installing **jenkins-operator** according to the [Installation](/docs/installation/) guide.
diff --git a/website/content/en/docs/Getting Started/v0.2.0/aks.md b/website/content/en/docs/Getting Started/v0.2.0/aks.md
new file mode 100644
index 00000000..c118a396
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/aks.md
@@ -0,0 +1,24 @@
+---
+title: "AKS"
+linkTitle: "AKS"
+weight: 10
+date: 2019-08-05
+description: >
+ Additional configuration for Azure Kubernetes Service
+---
+
+Azure AKS managed Kubernetes service adds to every pod the following envs:
+
+```yaml
+- name: KUBERNETES_PORT_443_TCP_ADDR
+ value:
+- name: KUBERNETES_PORT
+ value: tcp://
+- name: KUBERNETES_PORT_443_TCP
+ value: tcp://
+- name: KUBERNETES_SERVICE_HOST
+ value:
+```
+
+The operator is aware of it and omits these envs when checking if Jenkins pod envs have been changed. It prevents
+restart Jenkins pod over and over again.
\ No newline at end of file
diff --git a/website/content/en/docs/Getting Started/v0.2.0/configuration.md b/website/content/en/docs/Getting Started/v0.2.0/configuration.md
new file mode 100644
index 00000000..90a1b3c8
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/configuration.md
@@ -0,0 +1,308 @@
+---
+title: "Configuration"
+linkTitle: "Configuration"
+weight: 2
+date: 2019-08-05
+description: >
+ How to configure Jenkins with Operator
+---
+
+## Configure Seed Jobs and Pipelines
+
+Jenkins operator uses [job-dsl][job-dsl] and [kubernetes-credentials-provider][kubernetes-credentials-provider] plugins for configuring jobs
+and deploy keys.
+
+## Prepare job definitions and pipelines
+
+First you have to prepare pipelines and job definition in your GitHub repository using the following structure:
+
+```
+cicd/
+├── jobs
+│ └── build.jenkins
+└── pipelines
+ └── build.jenkins
+```
+
+**cicd/jobs/build.jenkins** it's a job definition:
+
+```
+#!/usr/bin/env groovy
+
+pipelineJob('build-jenkins-operator') {
+ displayName('Build jenkins-operator')
+
+ definition {
+ cpsScm {
+ scm {
+ git {
+ remote {
+ url('https://github.com/jenkinsci/kubernetes-operator.git')
+ credentials('jenkins-operator')
+ }
+ branches('*/master')
+ }
+ }
+ scriptPath('cicd/pipelines/build.jenkins')
+ }
+ }
+}
+```
+
+**cicd/jobs/build.jenkins** it's an actual Jenkins pipeline:
+
+```
+#!/usr/bin/env groovy
+
+def label = "build-jenkins-operator-${UUID.randomUUID().toString()}"
+def home = "/home/jenkins"
+def workspace = "${home}/workspace/build-jenkins-operator"
+def workdir = "${workspace}/src/github.com/jenkinsci/kubernetes-operator/"
+
+podTemplate(label: label,
+ containers: [
+ containerTemplate(name: 'jnlp', image: 'jenkins/jnlp-slave:alpine'),
+ containerTemplate(name: 'go', image: 'golang:1-alpine', command: 'cat', ttyEnabled: true),
+ ],
+ envVars: [
+ envVar(key: 'GOPATH', value: workspace),
+ ],
+ ) {
+
+ node(label) {
+ dir(workdir) {
+ stage('Init') {
+ timeout(time: 3, unit: 'MINUTES') {
+ checkout scm
+ }
+ container('go') {
+ sh 'apk --no-cache --update add make git gcc libc-dev'
+ }
+ }
+
+ stage('Dep') {
+ container('go') {
+ sh 'make dep'
+ }
+ }
+
+ stage('Test') {
+ container('go') {
+ sh 'make test'
+ }
+ }
+
+ stage('Build') {
+ container('go') {
+ sh 'make build'
+ }
+ }
+ }
+ }
+}
+```
+
+## Configure Seed Jobs
+
+Jenkins Seed Jobs are configured using `Jenkins.spec.seedJobs` section from your custom resource manifest:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ seedJobs:
+ - id: jenkins-operator
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+```
+
+**jenkins-operator** will automatically discover and configure all seed jobs.
+
+You can verify if deploy keys were successfully configured in Jenkins **Credentials** tab.
+
+
+
+You can verify if your pipelines were successfully configured in Jenkins Seed Job console output.
+
+
+
+If your GitHub repository is **private** you have to configure SSH or username/password authentication.
+
+### SSH authentication
+
+#### Generate SSH Keys
+
+There are two methods of SSH private key generation:
+
+```bash
+$ openssl genrsa -out 2048
+```
+
+or
+
+```bash
+$ ssh-keygen -t rsa -b 2048
+$ ssh-keygen -p -f -m pem
+```
+
+Then copy content from generated file.
+
+#### Public key
+
+If you want to upload your public key to your Git server you need to extract it.
+
+If key was generated by `openssl` then you need to type this to extract public key:
+
+```bash
+$ openssl rsa -in -pubout > .pub
+```
+
+If key was generated by `ssh-keygen` the public key content is located in .pub and there is no need to extract public key
+
+#### Configure SSH authentication
+
+Configure seed job like:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ seedJobs:
+ - id: jenkins-operator-ssh
+ credentialType: basicSSHUserPrivateKey
+ credentialID: k8s-ssh
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git
+```
+
+and create Kubernetes Secret(name of secret should be the same from `credentialID` field):
+
+```
+apiVersion: v1
+kind: Secret
+metadata:
+ name: k8s-ssh
+stringData:
+ privateKey: |
+ -----BEGIN RSA PRIVATE KEY-----
+ MIIJKAIBAAKCAgEAxxDpleJjMCN5nusfW/AtBAZhx8UVVlhhhIKXvQ+dFODQIdzO
+ oDXybs1zVHWOj31zqbbJnsfsVZ9Uf3p9k6xpJ3WFY9b85WasqTDN1xmSd6swD4N8
+ ...
+ username: github_user_name
+```
+
+### Username & password authentication
+
+Configure seed job like:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ seedJobs:
+ - id: jenkins-operator-user-pass
+ credentialType: usernamePassword
+ credentialID: k8s-user-pass
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+```
+
+and create Kubernetes Secret(name of secret should be the same from `credentialID` field):
+
+```
+apiVersion: v1
+kind: Secret
+metadata:
+ name: k8s-user-pass
+stringData:
+ username: github_user_name
+ password: password_or_token
+```
+
+## Pulling Docker images from private repositories
+To pull Docker Image from private repository you can use `imagePullSecrets`.
+
+Please follow the instructions on [creating a secret with a docker config](https://kubernetes.io/docs/concepts/containers/images/?origin_team=T42NTAGHM#creating-a-secret-with-a-docker-config).
+
+### Docker Hub Configuration
+To use Docker Hub additional steps are required.
+
+Edit the previously created secret:
+```bash
+kubectl -n edit secret
+```
+
+The `.dockerconfigjson` key's value needs to be replaced with a modified version.
+
+After modifications it needs to be encoded as Base64 value before setting the `.dockerconfigjson` key:q.
+
+Example config file to modify and use:
+```
+{
+ "auths":{
+ "https://index.docker.io/v1/":{
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ },
+ "auth.docker.io":{
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ },
+ "registry.docker.io":{
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ },
+ "docker.io":{
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ },
+ "https://registry-1.docker.io/v2/": {
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ },
+ "registry-1.docker.io/v2/": {
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ },
+ "registry-1.docker.io": {
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ },
+ "https://registry-1.docker.io": {
+ "username":"user",
+ "password":"password",
+ "email":"yourdockeremail@gmail.com",
+ "auth":"base64 of string user:password"
+ }
+ }
+}
+```
+
+[job-dsl]:https://github.com/jenkinsci/job-dsl-plugin
+[kubernetes-credentials-provider]:https://jenkinsci.github.io/kubernetes-credentials-provider-plugin/
\ No newline at end of file
diff --git a/website/content/en/docs/Getting Started/v0.2.0/configure-backup-and-restore.md b/website/content/en/docs/Getting Started/v0.2.0/configure-backup-and-restore.md
new file mode 100644
index 00000000..7fb75008
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/configure-backup-and-restore.md
@@ -0,0 +1,86 @@
+---
+title: "Configure backup and restore"
+linkTitle: "Configure backup and restore"
+weight: 10
+date: 2019-08-05
+description: >
+ Prevent job history loss
+---
+
+Backup and restore is done by container sidecar.
+
+### PVC
+
+#### Create PVC
+
+Save to file pvc.yaml:
+```yaml
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name:
+ namespace:
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 500Gi
+```
+
+Run command:
+```bash
+$ kubectl -n create -f pvc.yaml
+```
+
+#### Configure Jenkins CR
+
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name:
+ namespace:
+spec:
+ master:
+ securityContext:
+ runAsUser: 1000
+ fsGroup: 1000
+ containers:
+ - name: jenkins-master
+ image: jenkins/jenkins:lts
+ - name: backup # container responsible for backup and restore
+ env:
+ - name: BACKUP_DIR
+ value: /backup
+ - name: JENKINS_HOME
+ value: /jenkins-home
+ - name: BACKUP_COUNT
+ value: "3" # keep only the 2 most recent backups
+ image: virtuslab/jenkins-operator-backup-pvc:v0.0.6 # look at backup/pvc directory
+ imagePullPolicy: IfNotPresent
+ volumeMounts:
+ - mountPath: /jenkins-home # Jenkins home volume
+ name: jenkins-home
+ - mountPath: /backup # backup volume
+ name: backup
+ volumes:
+ - name: backup # PVC volume where backups will be stored
+ persistentVolumeClaim:
+ claimName:
+ backup:
+ containerName: backup # container name is responsible for backup
+ action:
+ exec:
+ command:
+ - /home/user/bin/backup.sh # this command is invoked on "backup" container to make backup, for example /home/user/bin/backup.sh , is passed by operator
+ interval: 30 # how often make backup in seconds
+ makeBackupBeforePodDeletion: true # make backup before pod deletion
+ restore:
+ containerName: backup # container name is responsible for restore backup
+ action:
+ exec:
+ command:
+ - /home/user/bin/restore.sh # this command is invoked on "backup" container to make restore backup, for example /home/user/bin/restore.sh , is passed by operator
+ #recoveryOnce: # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored
+```
diff --git a/website/content/en/docs/Getting Started/v0.2.0/customization.md b/website/content/en/docs/Getting Started/v0.2.0/customization.md
new file mode 100644
index 00000000..dc5b382f
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/customization.md
@@ -0,0 +1,186 @@
+---
+title: "Customization"
+linkTitle: "Customization"
+weight: 3
+date: 2019-08-05
+description: >
+ How to customize Jenkins
+---
+
+Jenkins can be customized using groovy scripts or [configuration as code plugin](https://github.com/jenkinsci/configuration-as-code-plugin).
+By using [ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/) you can create own **Jenkins** customized configuration.
+Then you must reference the *ConfigMap* in **Jenkins** pod customization file in `spec.groovyScripts` or `spec.configurationAsCode`
+
+For example create *ConfigMap* with name `jenkins-operator-user-configuration`. Then, modify the **Jenkins** manifest to look like this:
+
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ configurationAsCode:
+ configurations:
+ - name: jenkins-operator-user-configuration
+ groovyScripts:
+ configurations:
+ - name: jenkins-operator-user-configuration
+```
+
+Here is example of `jenkins-operator-user-configuration`:
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: jenkins-operator-user-configuration
+data:
+ 1-configure-theme.groovy: |
+ import jenkins.*
+ import jenkins.model.*
+ import hudson.*
+ import hudson.model.*
+ import org.jenkinsci.plugins.simpletheme.ThemeElement
+ import org.jenkinsci.plugins.simpletheme.CssTextThemeElement
+ import org.jenkinsci.plugins.simpletheme.CssUrlThemeElement
+
+ Jenkins jenkins = Jenkins.getInstance()
+
+ def decorator = Jenkins.instance.getDescriptorByType(org.codefirst.SimpleThemeDecorator.class)
+
+ List configElements = new ArrayList<>();
+ configElements.add(new CssTextThemeElement("DEFAULT"));
+ configElements.add(new CssUrlThemeElement("https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-light-green.css"));
+ decorator.setElements(configElements);
+ decorator.save();
+
+ jenkins.save()
+ 1-system-message.yaml: |
+ jenkins:
+ systemMessage: "Configuration as Code integration works!!!"
+```
+
+* *.groovy is Groovy script configuration
+* *.yaml is configuration as code
+
+If you want to correct your configuration you can edit it while **jenkins-operator** is running.
+Jenkins will reconcile and apply new configuration.
+
+### Using secrets inside Groovy script
+
+If you configured `spec.groovyScripts.secret.name`, then this secret is available to use inside map Groovy scripts.
+The secrets are loaded to `secrets` map.
+
+Create a [secret](https://kubernetes.io/docs/concepts/configuration/secret/) with for eg. `jenkins-conf-secrets` name.
+
+```yaml
+kind: Secret
+apiVersion: v1
+type: Opaque
+metadata:
+ name: jenkins-conf-secrets
+ namespace: default
+data:
+ SYSTEM_MESSAGE: SGVsbG8gd29ybGQ=
+```
+
+Then modify the **Jenkins** pod manifest by changing `spec.groovyScripts.secret.name` to `jenkins-conf-secrets`.
+
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ configurationAsCode:
+ configurations:
+ - name: jenkins-operator-user-configuration
+ secret:
+ name: jenkins-conf-secrets
+ groovyScripts:
+ configurations:
+ - name: jenkins-operator-user-configuration
+ secret:
+ name: jenkins-conf-secrets
+```
+
+Now you can test that the secret is mounted by applying this ConfigMap for Groovy script:
+
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: jenkins-operator-user-configuration
+data:
+ 1-system-message.groovy: |
+ import jenkins.*
+ import jenkins.model.*
+ import hudson.*
+ import hudson.model.*
+ Jenkins jenkins = Jenkins.getInstance()
+
+ jenkins.setSystemMessage(secrets["SYSTEM_MESSAGE"])
+ jenkins.save()
+```
+
+Or by applying configuration as code:
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: jenkins-operator-user-configuration
+data:
+ 1-system-message.yaml: |
+ jenkins:
+ systemMessage: ${SYSTEM_MESSAGE}
+```
+
+
+After this, you should see the `Hello world` system message at **Jenkins** homepage.
+
+## Install Plugins
+
+Edit CR under `spec.master.plugins`:
+
+```
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ master:
+ plugins:
+ - name: simple-theme-plugin
+ version: 0.5.1
+```
+
+Under `spec.master.basePlugins` you can find plugins for valid **jenkins-operator** work:
+
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ master:
+ basePlugins:
+ - name: kubernetes
+ version: 1.18.3
+ - name: workflow-job
+ version: "2.34"
+ - name: workflow-aggregator
+ version: "2.6"
+ - name: git
+ version: 3.12.0
+ - name: job-dsl
+ version: "1.76"
+ - name: configuration-as-code
+ version: "1.29"
+ - name: configuration-as-code-support
+ version: "1.19"
+ - name: kubernetes-credentials-provider
+ version: 0.12.1
+```
+
+You can change version of them.
+
+Then **jenkins-operator** will automatically install plugins after Jenkins master pod restart.
diff --git a/website/content/en/docs/Getting Started/v0.2.0/deploy-jenkins.md b/website/content/en/docs/Getting Started/v0.2.0/deploy-jenkins.md
new file mode 100644
index 00000000..e2644db5
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/deploy-jenkins.md
@@ -0,0 +1,89 @@
+---
+title: "Deploy Jenkins"
+linkTitle: "Deploy Jenkins"
+weight: 1
+date: 2019-08-05
+description: >
+ Deploy production ready Jenkins Operator manifest
+---
+
+Once jenkins-operator is up and running let's deploy actual Jenkins instance.
+Create manifest ie. **jenkins_instance.yaml** with following data and save it on drive.
+
+```bash
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ master:
+ containers:
+ - name: jenkins-master
+ image: jenkins/jenkins:lts
+ imagePullPolicy: Always
+ livenessProbe:
+ failureThreshold: 12
+ httpGet:
+ path: /login
+ port: http
+ scheme: HTTP
+ initialDelaySeconds: 80
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 3
+ httpGet:
+ path: /login
+ port: http
+ scheme: HTTP
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 1
+ resources:
+ limits:
+ cpu: 1500m
+ memory: 3Gi
+ requests:
+ cpu: "1"
+ memory: 500Mi
+ seedJobs:
+ - id: jenkins-operator
+ targets: "cicd/jobs/*.jenkins"
+ description: "Jenkins Operator repository"
+ repositoryBranch: master
+ repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
+```
+
+Deploy Jenkins to K8s:
+
+```bash
+kubectl create -f jenkins_instance.yaml
+```
+Watch Jenkins instance being created:
+
+```bash
+kubectl get pods -w
+```
+
+Get Jenkins credentials:
+
+```bash
+kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.user}' | base64 -d
+kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.password}' | base64 -d
+```
+
+Connect to Jenkins (minikube):
+
+```bash
+minikube service jenkins-operator-http- --url
+```
+
+Connect to Jenkins (actual Kubernetes cluster):
+
+```bash
+kubectl port-forward jenkins- 8080:8080
+```
+Then open browser with address `http://localhost:8080`.
+
\ No newline at end of file
diff --git a/website/content/en/docs/Getting Started/v0.2.0/diagnostics.md b/website/content/en/docs/Getting Started/v0.2.0/diagnostics.md
new file mode 100644
index 00000000..8bc213d1
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/diagnostics.md
@@ -0,0 +1,42 @@
+---
+title: "Diagnostics"
+linkTitle: "Diagnostics"
+weight: 40
+date: 2019-08-05
+description: >
+ How to deal with jenkins-operator problems
+---
+
+
+Turn on debug in **jenkins-operator** deployment:
+
+```bash
+sed -i 's|\(args:\).*|\1\ ["--debug"\]|' deploy/operator.yaml
+kubectl apply -f deploy/operator.yaml
+```
+
+Watch Kubernetes events:
+
+```bash
+kubectl get events --sort-by='{.lastTimestamp}'
+```
+
+Verify Jenkins master logs:
+
+```bash
+kubectl logs -f jenkins-
+```
+
+Verify jenkins-operator logs:
+
+```bash
+kubectl logs deployment/jenkins-operator
+```
+
+## Troubleshooting
+
+Delete Jenkins master pod and wait for the new one to come up:
+
+```bash
+kubectl delete pod jenkins-
+```
diff --git a/website/content/en/docs/Getting Started/v0.2.0/migration.md b/website/content/en/docs/Getting Started/v0.2.0/migration.md
new file mode 100644
index 00000000..a07ed8fb
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/migration.md
@@ -0,0 +1,39 @@
+---
+title: "Migration from v0.1.1"
+linkTitle: "Migration from v0.1.1"
+weight: 10
+date: 2019-08-05
+description: >
+ How to migrate from v0.1.1 to v0.2.0
+---
+
+### Added seed job agent
+Now seed jobs are not built by master executors, but by dedicated agent deployed into Kubernetes. We disabled master executors for security reasons.
+
+### Apply Jenkins configuration via Groovy scripts instead of Jenkins jobs
+We have removed hardcoded configuration by **Jenkins** jobs.
+
+In `v0.1.1` **jenkins-operator** configuration was stored in `jenkins-operator-user-configuration-`
+If you want to use `v0.2.0` or newer you must simply write refer to old ConfigMap by modifying CR, for example:
+
+```yaml
+apiVersion: jenkins.io/v1alpha2
+kind: Jenkins
+metadata:
+ name: example
+spec:
+ configurationAsCode:
+ configurations:
+ - name: jenkins-operator-user-configuration-
+ groovyScripts:
+ configurations:
+ - name: jenkins-operator-user-configuration-
+```
+
+**Jenkins** configuration jobs (*Configure Seed Jobs*, *jenkins-operator-base-configuration*, *jenkins-operator-user-configuration*) have been removed from **Jenkins**.
+
+In `v0.1.1` you can see if configuration failed or successfully updated in **Jenkins** UI (job build logs).
+Now, when Jenkins configuration jobs are removed, you must use this command to see if configuration was failed.
+```bash
+$ kubectl -n logs deployment/jenkins-operator
+```
\ No newline at end of file
diff --git a/website/content/en/docs/Getting Started/v0.2.0/scheme.md b/website/content/en/docs/Getting Started/v0.2.0/scheme.md
new file mode 100644
index 00000000..4bf11afd
--- /dev/null
+++ b/website/content/en/docs/Getting Started/v0.2.0/scheme.md
@@ -0,0 +1,1444 @@
+---
+title: "Scheme"
+linkTitle: "Scheme"
+weight: 40
+date: 2019-08-05
+description: >
+ API Schema definitions for Jenkins CR
+---
+
+{{% pageinfo %}}
+This document contains API scheme for `jenkins-operator` manifest
+{{% /pageinfo %}}
+
+
Entrypoint array. Not executed within a shell.
+The docker image’s ENTRYPOINT is used if this is not provided.
+Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable
+cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax
+can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
+regardless of whether the variable exists or not.
+More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
+
+
+
+
+args
+
+[]string
+
+
+
+(Optional)
+
Arguments to the entrypoint.
+The docker image’s CMD is used if this is not provided.
+Variable references $(VAR_NAME) are expanded using the container’s environment. If a variable
+cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax
+can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
+regardless of whether the variable exists or not.
+More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
+
+
+
+
+workingDir
+
+string
+
+
+
+(Optional)
+
Container’s working directory.
+If not specified, the container runtime’s default will be used, which
+might be configured in the container image.
List of ports to expose from the container. Exposing a port here gives
+the system additional information about the network connections a
+container uses, but is primarily informational. Not specifying a port here
+DOES NOT prevent that port from being exposed. Any port which is
+listening on the default “0.0.0.0” address inside a container will be
+accessible from the network.
List of sources to populate environment variables in the container.
+The keys defined within a source must be a C_IDENTIFIER. All invalid keys
+will be reported as an event when the container is starting. When a key exists in multiple
+sources, the value associated with the last source will take precedence.
+Values defined by an Env with a duplicate key will take precedence.
JenkinsMaster defines the Jenkins master pod attributes and plugins,
+every single change requires a Jenkins master pod restart
+
+
+
+
+
Field
+
Description
+
+
+
+
+
+masterAnnotations
+
+map[string]string
+
+
+
+(Optional)
+
Annotations is an unstructured key value map stored with a resource that may be
+set by external tools to store and retrieve arbitrary metadata. They are not
+queryable and should be preserved when modifying objects.
+More info: http://kubernetes.io/docs/user-guide/annotations
SecurityContext that applies to all the containers of the Jenkins
+Master. As per kubernetes specification, it can be overridden
+for each container individually.
+Defaults to:
+runAsUser: 1000
+fsGroup: 1000
List of containers belonging to the pod.
+Containers cannot currently be added or removed.
+There must be at least one container in a Pod.
+Defaults to:
+- image: jenkins/jenkins:lts
+imagePullPolicy: Always
+livenessProbe:
+failureThreshold: 12
+httpGet:
+path: /login
+port: http
+scheme: HTTP
+initialDelaySeconds: 80
+periodSeconds: 10
+successThreshold: 1
+timeoutSeconds: 5
+name: jenkins-master
+readinessProbe:
+failureThreshold: 3
+httpGet:
+path: /login
+port: http
+scheme: HTTP
+initialDelaySeconds: 30
+periodSeconds: 10
+successThreshold: 1
+timeoutSeconds: 1
+resources:
+limits:
+cpu: 1500m
+memory: 3Gi
+requests:
+cpu: “1”
+memory: 600Mi
Annotations is an unstructured key value map stored with a resource that may be
+set by external tools to store and retrieve arbitrary metadata. They are not
+queryable and should be preserved when modifying objects.
+More info: http://kubernetes.io/docs/user-guide/annotations
+
+
+
+
+labels
+
+map[string]string
+
+
+
+
Route service traffic to pods with label keys and values matching this
+selector. If empty or not present, the service is assumed to have an
+external process managing its endpoints, which Kubernetes will not
+modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.
+Ignored if type is ExternalName.
+More info: https://kubernetes.io/docs/concepts/services-networking/service/
Type determines how the Service is exposed. Defaults to ClusterIP. Valid
+options are ExternalName, ClusterIP, NodePort, and LoadBalancer.
+“ExternalName” maps to the specified externalName.
+“ClusterIP” allocates a cluster-internal IP address for load-balancing to
+endpoints. Endpoints are determined by the selector or if that is not
+specified, by manual construction of an Endpoints object. If clusterIP is
+“None”, no virtual IP is allocated and the endpoints are published as a
+set of endpoints rather than a stable IP.
+“NodePort” builds on ClusterIP and allocates a port on every node which
+routes to the clusterIP.
+“LoadBalancer” builds on NodePort and creates an
+external load-balancer (if supported in the current cloud) which routes
+to the clusterIP.
+More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services—service-types
The port on each node on which this service is exposed when type=NodePort or LoadBalancer.
+Usually assigned by the system. If specified, it will be allocated to the service
+if unused or else creation of the service will fail.
+Default is to auto-allocate a port if the ServiceType of this Service requires one.
+More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
Only applies to Service Type: LoadBalancer
+LoadBalancer will get created with the IP specified in this field.
+This feature depends on whether the underlying cloud-provider supports specifying
+the loadBalancerIP when a load balancer is created.
+This field will be ignored if the cloud-provider does not support the feature.
+
+
+
+
+
+
+Generated with gen-crd-api-reference-docs
+on git commit 37e531a.
+
diff --git a/website/content/en/docs/How it works/_index.md b/website/content/en/docs/How it works/_index.md
new file mode 100644
index 00000000..247dcf33
--- /dev/null
+++ b/website/content/en/docs/How it works/_index.md
@@ -0,0 +1,13 @@
+---
+title: "How it works"
+linkTitle: "How it works"
+weight: 8
+date: 2019-08-05
+description: >
+ How Jenkins Operator works
+---
+
+{{% pageinfo %}}
+This document describes a high level overview how jenkins-operator works.
+{{% /pageinfo %}}
+
diff --git a/website/content/en/docs/How it works/architecture-and-design.md b/website/content/en/docs/How it works/architecture-and-design.md
new file mode 100644
index 00000000..321ad698
--- /dev/null
+++ b/website/content/en/docs/How it works/architecture-and-design.md
@@ -0,0 +1,33 @@
+---
+title: "Architecture and design"
+linkTitle: "Architecture and design"
+weight: 1
+date: 2019-08-05
+description: >
+ Jenkins Operator fundamentals
+---
+
+The **jenkins-operator** design incorporates the following concepts:
+- watches any changes of manifests and maintain the desired state according to deployed custom resource manifest
+- implements the main reconciliation loop which consists of two smaller reconciliation loops - base and user
+
+
+
+**Base** reconciliation loop takes care of reconciling base Jenkins configuration, which consists of:
+- Ensure Manifests - monitors any changes in manifests
+- Ensure Jenkins Pod - creates and verifies status of Jenkins master Pod
+- Ensure Jenkins Configuration - configures Jenkins instance including hardening, initial configuration for plugins, etc.
+- Ensure Jenkins API token - generates Jenkins API token and initialized Jenkins client
+
+**User** reconciliation loop takes care of reconciling user provided configuration, which consists of:
+- Ensure Restore Job - creates Restore job and ensures that restore has been successfully performed
+- Ensure Seed Jobs - creates Seed Jobs and ensures that all of them have been successfully executed
+- Ensure User Configuration - executed user provided configuration, like groovy scripts, configuration as code or plugins
+- Ensure Backup Job - creates Backup job and ensures that backup has been successfully performed
+
+
+
+## Operator State
+
+Operator state is kept in custom resource status section, which is used for storing any configuration events or job statuses managed by the operator.
+It helps to maintain or recover desired state even after operator or Jenkins restarts.
\ No newline at end of file
diff --git a/website/content/en/docs/How it works/jenkins-docker-images.md b/website/content/en/docs/How it works/jenkins-docker-images.md
new file mode 100644
index 00000000..c938cf1b
--- /dev/null
+++ b/website/content/en/docs/How it works/jenkins-docker-images.md
@@ -0,0 +1,11 @@
+---
+title: "Jenkins Docker Images"
+linkTitle: "Jenkins Docker Images"
+weight: 10
+date: 2019-08-05
+description: >
+ Jenkins default image details
+---
+
+**jenkins-operator** is fully compatible with **jenkins:lts** docker image and does not introduce any hidden changes there.
+If needed, the docker image can easily be changed in custom resource manifest as long as it supports standard Jenkins file system structure.
\ No newline at end of file
diff --git a/website/content/en/docs/Installation/_index.md b/website/content/en/docs/Installation/_index.md
new file mode 100644
index 00000000..1b04f8da
--- /dev/null
+++ b/website/content/en/docs/Installation/_index.md
@@ -0,0 +1,44 @@
+---
+title: "Installation"
+linkTitle: "Installation"
+weight: 1
+date: 2019-08-05
+description: >
+ How to install Jenkins Operator
+---
+
+{{% pageinfo %}}
+This document describes installation procedure for jenkins-operator. All container images can be found at virtuslab/jenkins-operator
+{{% /pageinfo %}}
+
+## Requirements
+
+To run **jenkins-operator**, you will need:
+
+- running Kubernetes cluster version 1.11+
+
+- kubectl version 1.11+
+
+## Configure Custom Resource Definition
+
+Install Jenkins Custom Resource Definition:
+
+```bash
+kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml
+```
+
+## Deploy jenkins-operator
+
+Apply Service Account and RBAC roles:
+
+```bash
+kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/all-in-one-v1alpha2.yaml
+```
+
+Watch **jenkins-operator** instance being created:
+
+```bash
+kubectl get pods -w
+```
+
+Now **jenkins-operator** should be up and running in `default` namespace.
diff --git a/website/content/en/docs/Security/_index.md b/website/content/en/docs/Security/_index.md
new file mode 100644
index 00000000..83908d98
--- /dev/null
+++ b/website/content/en/docs/Security/_index.md
@@ -0,0 +1,99 @@
+---
+title: "Security"
+linkTitle: "Security"
+weight: 50
+date: 2019-08-05
+description: >
+ Jenkins security and hardening out of the box
+---
+
+By default **jenkins-operator** performs an initial security hardening of Jenkins instance via groovy scripts to prevent any security gaps.
+
+## Jenkins Access Control
+
+Currently **jenkins-operator** generates a username and random password and stores them in a Kubernetes Secret.
+However any other authorization mechanisms are possible and can be done via groovy scripts or configuration as code plugin.
+For more information take a look at [getting-started#jenkins-customization](v0.1.1/getting-started.md#jenkins-customisation).
+
+Any change to Security Realm or Authorization requires that user called `jenkins-operator` must have admin rights
+because **jenkins-operator** calls Jenkins API.
+
+## Jenkins Hardening
+
+The list below describes all the default security setting configured by the **jenkins-operator**:
+- basic settings - use `Mode.EXCLUSIVE` - Jobs must specify that they want to run on master node
+- enable CSRF - Cross Site Request Forgery Protection is enabled
+- disable usage stats - Jenkins usage stats submitting is disabled
+- enable master access control - Slave To Master Access Control is enabled
+- disable old JNLP protocols - `JNLP3-connect`, `JNLP2-connect` and `JNLP-connect` are disabled
+- disable CLI - CLI access of `/cli` URL is disabled
+- configure kubernetes-plugin - secure configuration for Kubernetes plugin
+
+If you would like to dig a little bit into the code, take a look [here](../pkg/controller/jenkins/configuration/base/resources/base_configuration_configmap.go).
+
+## Jenkins API
+
+The **jenkins-operator** generates and configures Basic Authentication token for Jenkins go client and stores it in a Kubernetes Secret.
+
+## Kubernetes
+
+Kubernetes API permissions are limited by the following roles:
+- [jenkins-operator role](../deploy/role.yaml)
+- [Jenkins Master role](../pkg/controller/jenkins/configuration/base/resources/rbac.go)
+
+Since **jenkins-operator** must be able to grant permission for its' deployed Jenkins masters to spawn pods (the `Jenkins Master role` above),
+the operator itself requires permission to create RBAC resources (the `jenkins-operator role` above).
+Deployed this way, any subject which may create a Pod (including a Jenkins job) may
+assume the `jenkins-operator` role by using its' ServiceAccount, create RBAC rules, and thus escape its granted permissions.
+Any namespace to which the `jenkins-operator` is deployed must be considered to implicitly grant all
+possible permissions to any subject which can create a Pod in that namespace.
+
+To mitigate this issue **jenkins-operator** should be deployed in one namespace and the Jenkins CR should be created in separate namespace.
+To achieve it change watch namespace in https://github.com/jenkinsci/kubernetes-operator/blob/master/deploy/operator.yaml#L25
+
+## Setup Jenkins Operator and Jenkins in separated namespaces
+
+You need to create two namespaces, for example we'll call them **jenkins** for Jenkins and **jenkins-operator** for Jenkins Operator.
+```bash
+$ kubectl create ns jenkins-operator
+$ kubectl create ns jenkins
+```
+
+Next, apply the RBAC manifests for **jenkins-operator** namespace
+```bash
+$ kubectl -n jenkins-operator apply -f deploy/service_account.yaml
+$ kubectl -n jenkins-operator apply -f deploy/role_binding.yaml
+```
+
+Create file role_binding_jenkins.yaml in `deploy` folder:
+```yaml
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: jenkins-operator
+ namespace: jenkins
+subjects:
+- kind: ServiceAccount
+ name: jenkins-operator
+ namespace: jenkins-operator
+roleRef:
+ kind: Role
+ name: jenkins-operator
+ apiGroup: rbac.authorization.k8s.io
+```
+
+Then, apply RBAC rules for **jenkins** namespace
+```bash
+$ kubectl -n jenkins apply -f deploy/role.yaml
+$ kubectl -n jenkins apply -f role_binding_jenkins.yaml
+```
+
+Finally, you must create operator pod by:
+```bash
+$ kubectl -n jenkins -n jenkins-operator apply -f deploy/operator.yaml
+```
+
+
+## Report a Security Vulnerability
+
+If you find a vulnerability or any misconfiguration in Jenkins, please report it in the [issues](https://github.com/jenkinsci/kubernetes-operator/issues).
\ No newline at end of file
diff --git a/website/content/en/docs/_index.md b/website/content/en/docs/_index.md
new file mode 100755
index 00000000..4c967933
--- /dev/null
+++ b/website/content/en/docs/_index.md
@@ -0,0 +1,14 @@
+
+---
+title: "Documentation"
+linkTitle: "Documentation"
+weight: 20
+date: 2019-09-03
+menu:
+ main:
+ weight: 20
+---
+
+{{% pageinfo %}}
+This project was originally developed by [VirtusLab](https://virtuslab.com) and the following [CONTRIBUTORS](https://github.com/jenkinsci/kubernetes-operator/graphs/contributors).
+{{% /pageinfo %}}
diff --git a/website/content/en/search.md b/website/content/en/search.md
new file mode 100644
index 00000000..e3690fd5
--- /dev/null
+++ b/website/content/en/search.md
@@ -0,0 +1,6 @@
+---
+title: Search Results
+layout: search
+
+---
+
diff --git a/website/deploy.sh b/website/deploy.sh
new file mode 100755
index 00000000..a2c28f6b
--- /dev/null
+++ b/website/deploy.sh
@@ -0,0 +1,17 @@
+#Copyright 2018 Google LLC
+#
+#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
+#
+# https://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.
+#
+rm -rf public/
+HUGO_ENV="production" hugo --gc || exit 1
+s3deploy -source=public/ -region=eu-west-1 -bucket=bep.is -distribution-id=E8OKNT7W9ZYZ2 -path temp/td
diff --git a/website/layouts/404.html b/website/layouts/404.html
new file mode 100644
index 00000000..378b7367
--- /dev/null
+++ b/website/layouts/404.html
@@ -0,0 +1,10 @@
+{{ define "main"}}
+
+
+
Not found
+
Oops! This page doesn't exist. Try going back to our home page.
+
+
You can learn how to make a 404 page like this in Custom 404 Pages.
+
+
+{{ end }}
diff --git a/website/layouts/docs/baseof.html b/website/layouts/docs/baseof.html
new file mode 100644
index 00000000..abad9e04
--- /dev/null
+++ b/website/layouts/docs/baseof.html
@@ -0,0 +1,27 @@
+
+
+
+ {{ partial "head.html" . }}
+ {{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}
+
+
+
+ {{ partial "navbar.html" . }}
+
+
+
+
+
+ {{ partial "sidebar.html" . }}
+
+
+ {{ if not .Site.Params.ui.breadcrumb_disable }}{{ partial "breadcrumb.html" . }}{{ end }}
+ {{ block "main" . }}{{ end }}
+
+
+
+ {{ partial "footer.html" . }}
+
+ {{ partial "scripts.html" . }}
+
+
\ No newline at end of file
diff --git a/website/layouts/partials/navbar.html b/website/layouts/partials/navbar.html
new file mode 100644
index 00000000..1bdba6cc
--- /dev/null
+++ b/website/layouts/partials/navbar.html
@@ -0,0 +1,22 @@
+{{ $cover := .HasShortcode "blocks/cover" }}
+
diff --git a/website/layouts/partials/page-meta-links.html b/website/layouts/partials/page-meta-links.html
new file mode 100644
index 00000000..e69de29b
diff --git a/website/package-lock.json b/website/package-lock.json
new file mode 100644
index 00000000..343386c1
--- /dev/null
+++ b/website/package-lock.json
@@ -0,0 +1,2802 @@
+{
+ "name": "tech-doc-hugo",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "^1.0.1",
+ "glob-to-regexp": "^0.3.0"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "^1.0.1"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async-each": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "9.4.6",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.6.tgz",
+ "integrity": "sha512-Yp51mevbOEdxDUy5WjiKtpQaecqYq9OqZSL04rSoCiry7Tc5I9FEyo3bfxiTJc1DfHeKwSFCUYbBAiOQ2VGfiw==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.4.1",
+ "caniuse-lite": "^1.0.30000929",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "postcss": "^7.0.13",
+ "postcss-value-parser": "^3.3.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "7.0.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz",
+ "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "browserslist": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz",
+ "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30000929",
+ "electron-to-chromium": "^1.3.103",
+ "node-releases": "^1.1.3"
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30000932",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz",
+ "integrity": "sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "chokidar": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
+ "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "cliui": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.1.1",
+ "strip-ansi": "^4.0.0",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
+ "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.1"
+ }
+ },
+ "color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz",
+ "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==",
+ "dev": true,
+ "requires": {
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.4.3",
+ "minimist": "^1.2.0",
+ "object-assign": "^4.1.0",
+ "os-homedir": "^1.0.1",
+ "parse-json": "^2.2.0",
+ "require-from-string": "^1.1.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "dependency-graph": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz",
+ "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "path-type": "^3.0.0"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.3.108",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.108.tgz",
+ "integrity": "sha512-/QI4hMpAh48a1Sea6PALGv+kuVne9A2EWGd8HrWHMdYhIzGtbhVVHh6heL5fAzGaDnZuPyrlWJRl8WPm4RyiQQ==",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "fast-glob": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+ "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "^2.2.1",
+ "@nodelib/fs.stat": "^1.1.2",
+ "glob-parent": "^3.1.0",
+ "is-glob": "^4.0.0",
+ "merge2": "^1.2.3",
+ "micromatch": "^3.1.10"
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
+ "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "^2.12.1",
+ "node-pre-gyp": "^0.12.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "^3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "minipass": {
+ "version": "2.3.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.2.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.3.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.12.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "needle": "^2.2.1",
+ "nopt": "^4.0.1",
+ "npm-packlist": "^1.1.6",
+ "npmlog": "^4.0.2",
+ "rc": "^1.2.7",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^4"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "^3.0.1",
+ "npm-bundled": "^1.0.1"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.7.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "^1.1.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.3.4",
+ "minizlib": "^1.1.1",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.3",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "globby": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
+ "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "dir-glob": "2.0.0",
+ "fast-glob": "^2.0.2",
+ "glob": "^7.1.2",
+ "ignore": "^3.3.5",
+ "pify": "^3.0.0",
+ "slash": "^1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz",
+ "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "ignore": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+ "dev": true
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "merge2": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz",
+ "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nan": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "node-releases": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz",
+ "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==",
+ "dev": true,
+ "requires": {
+ "semver": "^5.3.0"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0",
+ "lcid": "^1.0.0",
+ "mem": "^1.1.0"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-cli": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-5.0.1.tgz",
+ "integrity": "sha512-yrvWl8axFdiXlJuVQRIHM4qskvl0F4/fWUUIYyYo0RV6lOdB0Vcyt8Rv7lBvtwVuNa0pClz88LgxzT4ZzC7UWA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.1.0",
+ "chokidar": "^2.0.0",
+ "dependency-graph": "^0.7.0",
+ "fs-extra": "^5.0.0",
+ "get-stdin": "^6.0.0",
+ "globby": "^8.0.0",
+ "postcss": "^6.0.1",
+ "postcss-load-config": "^1.1.0",
+ "postcss-reporter": "^5.0.0",
+ "pretty-hrtime": "^1.0.3",
+ "read-cache": "^1.0.0",
+ "yargs": "^11.0.0"
+ }
+ },
+ "postcss-load-config": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz",
+ "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^2.1.0",
+ "object-assign": "^4.1.0",
+ "postcss-load-options": "^1.2.0",
+ "postcss-load-plugins": "^2.3.0"
+ }
+ },
+ "postcss-load-options": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz",
+ "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^2.1.0",
+ "object-assign": "^4.1.0"
+ }
+ },
+ "postcss-load-plugins": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz",
+ "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^2.1.1",
+ "object-assign": "^4.1.0"
+ }
+ },
+ "postcss-reporter": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz",
+ "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1",
+ "lodash": "^4.17.4",
+ "log-symbols": "^2.0.0",
+ "postcss": "^6.0.8"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.3.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
+ "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "semver": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+ "dev": true,
+ "requires": {
+ "atob": "^2.1.1",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "upath": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
+ "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz",
+ "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.1.1",
+ "find-up": "^2.1.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^2.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^9.0.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
+ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ }
+ }
+ }
+}
diff --git a/website/package.json b/website/package.json
new file mode 100644
index 00000000..ce3b9af2
--- /dev/null
+++ b/website/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "tech-doc-hugo",
+ "version": "0.0.1",
+ "description": "Hugo theme for technical documentation.",
+ "main": "none.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/bep/tech-doc-hugo.git"
+ },
+ "author": "",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/bep/tech-doc-hugo/issues"
+ },
+ "homepage": "https://github.com/bep/tech-doc-hugo#readme",
+ "dependencies": {},
+ "devDependencies": {
+ "autoprefixer": "^9.4.6",
+ "postcss-cli": "^5.0.1"
+ }
+}
diff --git a/website/static/favicons/favicon.ico b/website/static/favicons/favicon.ico
new file mode 100644
index 00000000..87111eba
Binary files /dev/null and b/website/static/favicons/favicon.ico differ
diff --git a/website/static/img/jenkins-credentials.png b/website/static/img/jenkins-credentials.png
new file mode 100644
index 00000000..b1017bad
Binary files /dev/null and b/website/static/img/jenkins-credentials.png differ
diff --git a/website/static/img/jenkins-seed.png b/website/static/img/jenkins-seed.png
new file mode 100644
index 00000000..69f4f0c7
Binary files /dev/null and b/website/static/img/jenkins-seed.png differ
diff --git a/website/static/img/jenkins.png b/website/static/img/jenkins.png
new file mode 100644
index 00000000..2c63caac
Binary files /dev/null and b/website/static/img/jenkins.png differ
diff --git a/website/static/img/logo.svg b/website/static/img/logo.svg
new file mode 100644
index 00000000..95018636
--- /dev/null
+++ b/website/static/img/logo.svg
@@ -0,0 +1,6512 @@
+
+
diff --git a/website/static/img/phases.png b/website/static/img/phases.png
new file mode 100644
index 00000000..0e12afc0
Binary files /dev/null and b/website/static/img/phases.png differ
diff --git a/website/static/img/reconcile.png b/website/static/img/reconcile.png
new file mode 100644
index 00000000..e3e22257
Binary files /dev/null and b/website/static/img/reconcile.png differ
diff --git a/website/themes/docsy/.gitignore b/website/themes/docsy/.gitignore
new file mode 100644
index 00000000..7e152f10
--- /dev/null
+++ b/website/themes/docsy/.gitignore
@@ -0,0 +1,6 @@
+
+public/
+resources/
+node_modules/
+tech-doc-hugo
+
diff --git a/website/themes/docsy/.gitmodules b/website/themes/docsy/.gitmodules
new file mode 100644
index 00000000..e28e880c
--- /dev/null
+++ b/website/themes/docsy/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "assets/vendor/bootstrap"]
+ path = assets/vendor/bootstrap
+ url = https://github.com/twbs/bootstrap.git
+[submodule "assets/vendor/Font-Awesome"]
+ path = assets/vendor/Font-Awesome
+ url = https://github.com/FortAwesome/Font-Awesome.git
diff --git a/website/themes/docsy/.s3deploy.yml b/website/themes/docsy/.s3deploy.yml
new file mode 100644
index 00000000..c8985e02
--- /dev/null
+++ b/website/themes/docsy/.s3deploy.yml
@@ -0,0 +1,14 @@
+routes:
+ - route: "^.+\\.(js|css|svg|ttf)$"
+ # cache static assets for 20 years
+ headers:
+ Cache-Control: "max-age=630720000, no-transform, public"
+ gzip: true
+ - route: "^.+\\.(png|jpg)$"
+ headers:
+ Cache-Control: "max-age=630720000, no-transform, public"
+ gzip: true
+ - route: "^.+\\.(html|xml|json)$"
+ gzip: true
+
+
\ No newline at end of file
diff --git a/website/themes/docsy/CONTRIBUTING.md b/website/themes/docsy/CONTRIBUTING.md
new file mode 100644
index 00000000..db177d4a
--- /dev/null
+++ b/website/themes/docsy/CONTRIBUTING.md
@@ -0,0 +1,28 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## Community Guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
diff --git a/website/themes/docsy/LICENSE b/website/themes/docsy/LICENSE
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/website/themes/docsy/LICENSE
@@ -0,0 +1,201 @@
+ 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.
diff --git a/website/themes/docsy/README.md b/website/themes/docsy/README.md
new file mode 100644
index 00000000..f61eff67
--- /dev/null
+++ b/website/themes/docsy/README.md
@@ -0,0 +1,34 @@
+# Docsy
+
+Docsy is a Hugo theme for technical documentation sets, providing simple navigation, site structure, and more.
+
+You can find an example project that uses Docsy in the [Docsy Example Project repo](https://github.com/google/docsy-example). The Docsy Example Project is hosted at [https://testydocsy.netlify.com/](https://testydocsy.netlify.com/), where you can find detailed theme instructions under **Documentation -> Getting Started**.
+
+To use the Docsy theme, you can either:
+
+* Copy and edit the example site’s repo, which will also give you a skeleton structure for your top-level and documentation sections, or
+* Specify the Docsy theme like any other [Hugo theme](https://gohugo.io/themes/installing-and-using-themes/)
+ when creating or updating your site. This gives you all the theme-y goodness but you’ll need to specify your own site structure.
+
+This is not an officially supported Google product. This project is currently maintained.
+
+## Installation and prerequisites
+
+You need a recent version of Hugo to build sites using this theme (preferably 0.45+). If you install from the [release page](https://github.com/gohugoio/hugo/releases), make sure to get the `extended` Hugo version which supports SCSS. Alternatively, on macOS you can install Hugo via Brew.
+
+If you want to do stylesheet changes, you will also need `PostCSS` to create the final assets. You can also install it locally with:
+
+```
+npm install
+````
+
+To use a local version of the theme files, clone the repo using:
+
+```
+git clone --recurse-submodules --depth 1 https://github.com/google/docsy.git
+```
+
+## Theme documentation
+
+Detailed documentation for this theme is in the Docsy Example Project under **Documentation -> Getting Started**.
+The Docsy Example Project is on [GitHub](https://github.com/google/docsy-example) and is hosted at [https://testydocsy.netlify.com/](https://testydocsy.netlify.com/).
diff --git a/website/themes/docsy/assets/icons/logo.png b/website/themes/docsy/assets/icons/logo.png
new file mode 100644
index 00000000..8576e1a5
Binary files /dev/null and b/website/themes/docsy/assets/icons/logo.png differ
diff --git a/website/themes/docsy/assets/icons/logo.svg b/website/themes/docsy/assets/icons/logo.svg
new file mode 100644
index 00000000..971a8531
--- /dev/null
+++ b/website/themes/docsy/assets/icons/logo.svg
@@ -0,0 +1,237 @@
+
+
+
diff --git a/website/themes/docsy/assets/js/base.js b/website/themes/docsy/assets/js/base.js
new file mode 100644
index 00000000..49f27d01
--- /dev/null
+++ b/website/themes/docsy/assets/js/base.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2018 Google LLC
+
+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
+
+ https://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.
+*/
+
+(function($) {
+
+ 'use strict';
+
+ $(function() {
+ $('[data-toggle="tooltip"]').tooltip();
+ $('[data-toggle="popover"]').popover();
+
+ $('.popover-dismiss').popover({
+ trigger: 'focus'
+ })
+ });
+
+
+ function bottomPos(element) {
+ return element.offset().top + element.outerHeight();
+ }
+
+ // Bootstrap Fixed Header
+ $(function() {
+ var promo = $(".js-td-cover");
+ if (!promo.length) {
+ return
+ }
+
+ var promoOffset = bottomPos(promo);
+ var navbarOffset = $('.js-navbar-scroll').offset().top;
+
+ var threshold = Math.ceil($('.js-navbar-scroll').outerHeight());
+ if ((promoOffset - navbarOffset) < threshold) {
+ $('.js-navbar-scroll').addClass('navbar-bg-onscroll');
+ }
+
+
+ $(window).on('scroll', function() {
+ var navtop = $('.js-navbar-scroll').offset().top - $(window).scrollTop();
+ var promoOffset = bottomPos($('.js-td-cover'));
+ var navbarOffset = $('.js-navbar-scroll').offset().top;
+ if ((promoOffset - navbarOffset) < threshold) {
+ $('.js-navbar-scroll').addClass('navbar-bg-onscroll');
+ } else {
+ $('.js-navbar-scroll').removeClass('navbar-bg-onscroll');
+ $('.js-navbar-scroll').addClass('navbar-bg-onscroll--fade');
+ }
+ });
+ });
+
+
+}(jQuery));
diff --git a/website/themes/docsy/assets/js/search.js b/website/themes/docsy/assets/js/search.js
new file mode 100644
index 00000000..83fbb155
--- /dev/null
+++ b/website/themes/docsy/assets/js/search.js
@@ -0,0 +1,43 @@
+/*
+Copyright 2018 Google LLC
+
+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
+
+ https://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.
+*/
+
+(function($) {
+
+ 'use strict';
+
+ var Search = {
+ init: function() {
+ $(document).ready(function() {
+ $(document).on('keypress', '.td-search-input', function(e) {
+ if (e.keyCode !== 13) {
+ return
+ }
+
+ var query = $(this).val();
+ var searchPage = "{{ "search/" | absURL }}?q=" + query;
+ document.location = searchPage;
+
+ return false;
+ });
+
+ });
+ },
+ };
+
+ Search.init();
+
+
+}(jQuery));
diff --git a/website/themes/docsy/assets/scss/_alerts.scss b/website/themes/docsy/assets/scss/_alerts.scss
new file mode 100644
index 00000000..5ce5cc22
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_alerts.scss
@@ -0,0 +1,20 @@
+// Style alert boxes.
+
+.alert {
+ font-weight: $font-weight-medium;
+ background: $white;
+ color: inherit;
+ border-radius: 0;
+
+ @each $color, $value in $theme-colors {
+ &-#{$color} {
+ & .alert-heading {
+ color: $value;
+ }
+
+ border-style: solid;
+ border-color: $value;
+ border-width: 0 0 0 4px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_blog.scss b/website/themes/docsy/assets/scss/_blog.scss
new file mode 100644
index 00000000..b26aec76
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_blog.scss
@@ -0,0 +1,10 @@
+// Blog related styles.
+
+.td-blog {
+ .td-rss-button {
+ position: absolute;
+ top: 5.5rem;
+ right: 1rem;
+ z-index: 22;
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_boxes.scss b/website/themes/docsy/assets/scss/_boxes.scss
new file mode 100644
index 00000000..7fa99fcf
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_boxes.scss
@@ -0,0 +1,127 @@
+// Boxes on the home page and similar.
+.td-box {}
+
+// box-variant creates the main style for a colored section used on the site.
+@mixin box-variant($parent, $color-name, $color-value) {
+ $text-color: color-yiq($color-value);
+ $link-color: mix($blue, $text-color, lightness($color-value));
+ $link-hover-color: rgba($link-color, 0.5) !default;
+
+ #{$parent} {
+ &--#{$color-name} {
+ color: $text-color;
+ background-color: #{$color-value};
+
+ .td-arrow-down {
+ &::before {
+ left: 50%;
+ margin-left: -30px;
+ bottom: -25px;
+ border: {
+ style: solid;
+ width: 25px 30px 0 30px;
+ color: #{$color-value} transparent transparent transparent;
+ };
+ z-index: 3;
+ position: absolute;
+ content: "";
+ }
+ }
+ }
+ }
+
+ // Improve contrast for the links in paragraphs.
+ @include link-variant("#{$parent}--#{$color-name} p > a", $link-color, $link-hover-color, false);
+
+ @if $enable-gradients {
+ @include bg-gradient-variant("#{$parent}--1#{$color-name}#{$parent}--gradient", $color-value);
+ }
+}
+
+// Common min-height modifiers used for boxes.
+@mixin td-box-height-modifiers($parent) {
+ #{$parent} {
+ &--height-auto {}
+
+ &--height-min {
+ min-height: 300px;
+ }
+
+ &--height-med {
+ min-height: 400px;
+ }
+
+ &--height-max {
+ min-height: 500px;
+ }
+
+ &--height-full {
+ min-height: 100vh;
+ }
+
+ @include media-breakpoint-up(md) {
+ &--height-min {
+ min-height: 450px;
+ }
+
+ &--height-med {
+ min-height: 500px;
+ }
+
+ &--height-max {
+ min-height: 650px;
+ }
+ }
+ }
+}
+
+@include td-box-height-modifiers(".td-box");
+
+// Styling for section boxes
+.td-box {
+ .row.section {
+ padding-left: 5rem;
+ padding-right: 5rem;
+ flex-direction: column;
+
+ > table {
+ @extend .table-striped;
+
+ @extend .table-responsive;
+
+ @extend .table;
+ }
+ }
+
+ .row {
+ padding-left: 5rem;
+ padding-right: 5rem;
+ flex-direction: row;
+ }
+}
+// Styling for community page link boxes
+
+.td-box.linkbox {
+ padding: 5rem;
+}
+
+// This allows "painting by numbers"
+@for $i from 1 through length($td-box-colors) {
+ $c: nth($td-box-colors, $i);
+ $name: $i - 1;
+
+ @include box-variant(".td-box", $name, $c);
+}
+
+// Same as above with all the theme color names.
+@each $color, $value in $colors {
+ @include box-variant(".td-box", $color, $value);
+}
+
+@each $color, $value in $theme-colors {
+ @include box-variant(".td-box", $color, $value);
+}
+
+@each $color, $value in $grays {
+ @include box-variant(".td-box", $color, $value);
+}
diff --git a/website/themes/docsy/assets/scss/_breadcrumb.scss b/website/themes/docsy/assets/scss/_breadcrumb.scss
new file mode 100644
index 00000000..e7237a30
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_breadcrumb.scss
@@ -0,0 +1,7 @@
+// Breadcrumb
+
+.breadcrumb {
+ background: none;
+ padding-left: 0;
+ padding-top: 0;
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_buttons.scss b/website/themes/docsy/assets/scss/_buttons.scss
new file mode 100644
index 00000000..4ec13218
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_buttons.scss
@@ -0,0 +1,15 @@
+// Buttons
+
+@if $enable-rounded {
+ .btn {
+ border-radius: 1rem;
+
+ &-lg {
+ border-radius: 2rem;
+ }
+
+ &-sm {
+ border-radius: 1rem;
+ }
+ }
+}
diff --git a/website/themes/docsy/assets/scss/_code.scss b/website/themes/docsy/assets/scss/_code.scss
new file mode 100644
index 00000000..fa297439
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_code.scss
@@ -0,0 +1,54 @@
+// Code formatting.
+
+.td-content {
+ // Highlighted code.
+ .highlight {
+ @extend .card;
+
+ margin: 2rem 0;
+ padding: 1rem;
+ background-color: $gray-100;
+
+ pre, div {
+ background-color: inherit !important;
+ }
+
+ pre {
+ margin: 0;
+ padding: 0;
+ }
+ }
+
+ // Inline code
+ p code, li > code, table code {
+ color: inherit;
+ padding: 0.2em 0.4em;
+ margin: 0;
+ font-size: 85%;
+ word-break: normal;
+ background-color: rgba($black, 0.05);
+ border-radius: $border-radius;
+
+ br {
+ display: none;
+ }
+ }
+
+
+ // Code blocks
+ pre {
+ word-wrap: normal;
+ background-color: $gray-100;
+ padding: $spacer;
+
+
+ > code {
+ padding: 0;
+ margin: 0;
+ font-size: 100%;
+ word-break: normal;
+ white-space: pre;
+ border: 0;
+ }
+ }
+}
diff --git a/website/themes/docsy/assets/scss/_colors.scss b/website/themes/docsy/assets/scss/_colors.scss
new file mode 100644
index 00000000..3f34aa84
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_colors.scss
@@ -0,0 +1,41 @@
+// Add some local palette classes so you can do -bg-warning -text-warning etc. Even -bg-1 if you want to paint by numbers.
+@mixin palette-variant($color-name, $color-value) {
+ $text-color: color-yiq($color-value);
+ $link-color: mix($blue, $text-color, lightness($color-value));
+
+ $link-hover-color: rgba($link-color, .5) !default;
+
+ .-bg-#{$color-name} {
+ color: $text-color;
+ background-color: $color-value;
+ }
+
+ // Make links in paragraphs stand out more.
+ @include link-variant(".-bg-#{$color-name} p > a", $link-color, $link-hover-color, false);
+
+
+ .-text-#{$color-name} {
+ color: $color-value;
+ }
+}
+
+@each $color, $value in $colors {
+ @include palette-variant($color, $value);
+}
+
+@each $color, $value in $theme-colors {
+ @include palette-variant($color, $value);
+}
+
+@each $color, $value in $grays {
+ @include palette-variant($color, $value);
+}
+
+// This allows "painting by numbers", i.e. picking colors by a shortcode Ordianal.
+@for $i from 1 through length($td-box-colors) {
+ $value: nth($td-box-colors, $i);
+ $name: $i - 1;
+ $text-color: color-yiq($value);
+
+ @include palette-variant($name, $value);
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_content.scss b/website/themes/docsy/assets/scss/_content.scss
new file mode 100644
index 00000000..3e72e00e
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_content.scss
@@ -0,0 +1,82 @@
+//
+// Style Markdown content
+//
+
+.td-content {
+ order: 1;
+
+ p, li, td {
+ font-weight: $font-weight-body-text;
+ }
+
+ > h1 {
+ font-weight: $font-weight-bold;
+ margin-bottom: 1rem;
+ }
+
+ > h2 {
+ margin-bottom: 1rem;
+ }
+
+ > h2:not(:first-child) {
+ margin-top: 3rem;
+ }
+
+ > h2 + h3 {
+ margin-top: 1rem;
+ }
+
+ > h3, > h4, > h5, > h6 {
+ margin-bottom: 1rem;
+ margin-top: 2rem;
+ }
+
+ img {
+ @extend .img-fluid;
+ }
+
+ > table {
+ @extend .table-striped;
+
+ @extend .table-responsive;
+
+ @extend .table;
+ }
+
+ > blockquote {
+ padding: 0 0 0 1rem;
+ margin-bottom: $spacer;
+ color: $gray-600;
+ border-left: 6px solid $secondary;
+ }
+
+ > ul li, > ol li {
+ margin-bottom: .25rem;
+ }
+
+ strong {
+ font-weight: $font-weight-bold;
+ }
+
+ > pre, > .highlight, > .lead, > h1, > h2, > ul, > ol, > p, > blockquote, > dl dd, .footnotes, > .alert {
+ @extend .td-max-width-on-larger-screens;
+ }
+
+ .alert:not(:first-child) {
+ margin-top: 2 * $spacer;
+ margin-bottom: 2 * $spacer;
+ }
+
+ .lead {
+ margin-bottom: 1.5rem;
+ }
+}
+
+.td-title {
+ margin-top: 1rem;
+ margin-bottom: .5rem;
+
+ @include media-breakpoint-up(sm) {
+ font-size: 3rem;
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_main-container.scss b/website/themes/docsy/assets/scss/_main-container.scss
new file mode 100644
index 00000000..2dc54eae
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_main-container.scss
@@ -0,0 +1,34 @@
+// The outer page container i.e. common styles for any page.
+.td-outer {
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+}
+
+// The outer page container for the default base template.
+.td-default {
+ main {
+ section:first-of-type {
+ @include media-breakpoint-up(md) {
+ padding-top: 8rem;
+ }
+ }
+
+ section {
+ @extend .td-block-padding;
+ }
+ }
+}
+
+.td-main {
+ flex-grow: 1;
+
+ main {
+ @include media-breakpoint-up(md) {
+ padding-top: 5.5rem;
+ }
+
+
+ padding-bottom: 2rem;
+ }
+}
diff --git a/website/themes/docsy/assets/scss/_nav.scss b/website/themes/docsy/assets/scss/_nav.scss
new file mode 100644
index 00000000..6113f802
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_nav.scss
@@ -0,0 +1,98 @@
+//
+// Main navbar
+//
+
+.td-navbar-cover {
+ background: $primary;
+
+ @include media-breakpoint-up(md) {
+ background: transparent !important;
+
+ .nav-link {
+ text-shadow: 1px 1px 2px $dark;
+ }
+
+ }
+
+ &.navbar-bg-onscroll .nav-link {
+ text-shadow: none;
+ }
+}
+
+.navbar-bg-onscroll {
+ background: $primary !important;
+ opacity: inherit;
+}
+
+.td-navbar {
+ background: $primary;
+ min-height: 4rem;
+ margin: 0;
+ z-index: 32;
+
+ @include media-breakpoint-up(md) {
+ position: fixed;
+ top: 0;
+ width: 100%;
+ }
+
+
+ .navbar-brand {
+ text-transform: none;
+ text-align: middle;
+
+ .nav-link {
+ display: inline-block;
+ margin-right: -30px;
+ }
+
+ svg {
+ display: inline-block;
+ margin: 0 10px;
+ height: 30px;
+ }
+ }
+
+ .nav-link {
+ text-transform: none;
+ font-weight: $font-weight-bold;
+ }
+
+ .td-search-input {
+ border: none;
+
+ @include placeholder {
+ color: $navbar-dark-color;
+ }
+ }
+
+ .dropdown {
+ min-width: 100px;
+ }
+
+ @include media-breakpoint-down(md) {
+ padding-right: .5rem;
+ padding-left: .75rem;
+
+ .td-navbar-nav-scroll {
+ max-width: 100%;
+ height: 2.5rem;
+ margin-top: .25rem;
+ overflow: hidden;
+ font-size: .875rem;
+
+ .nav-link {
+ padding-right: .25rem;
+ padding-left: 0;
+ }
+
+ .navbar-nav {
+ padding-bottom: 2rem;
+ overflow-x: auto;
+ white-space: nowrap;
+ -webkit-overflow-scrolling: touch;
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_pageinfo.scss b/website/themes/docsy/assets/scss/_pageinfo.scss
new file mode 100644
index 00000000..1144db9d
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_pageinfo.scss
@@ -0,0 +1,18 @@
+.pageinfo {
+ font-weight: $font-weight-medium;
+ background: $gray-100;
+ color: inherit;
+ border-radius: 0;
+ margin: 2rem;
+ padding: 1.5rem;
+ padding-bottom: 0.5rem;
+
+ @each $color, $value in $theme-colors {
+ &-#{$color} {
+
+ border-style: solid;
+ border-color: $value;
+ }
+ }
+
+}
diff --git a/website/themes/docsy/assets/scss/_search.scss b/website/themes/docsy/assets/scss/_search.scss
new file mode 100644
index 00000000..ef257d4b
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_search.scss
@@ -0,0 +1,16 @@
+// Search
+
+.td-search-input {
+ background: transparent;
+
+ &.form-control:focus {
+ border-color: lighten($primary, 60%);
+ box-shadow: 0 0 0 2px lighten($primary, 30%);
+ }
+
+ @if $enable-rounded {
+ border-radius: 1rem;
+ }
+
+ font-family: "Font Awesome 5 Free", $font-family-base;
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_sidebar-toc.scss b/website/themes/docsy/assets/scss/_sidebar-toc.scss
new file mode 100644
index 00000000..96e7abbb
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_sidebar-toc.scss
@@ -0,0 +1,57 @@
+//
+// Right side toc
+//
+.td-toc {
+ border-left: 1px solid $border-color;
+
+ @supports (position: sticky) {
+ position: sticky;
+ top: 4rem;
+ height: calc(100vh - 10rem);
+ overflow-y: auto;
+ }
+
+ order: 2;
+ padding-top: 0.75rem;
+ padding-bottom: 1.5rem;
+ vertical-align: top;
+
+ a {
+ display: block;
+ font-weight: $font-weight-light;
+ padding-bottom: .25rem;
+ }
+
+ li {
+ list-style: none;
+ display: block;
+ }
+
+ li li {
+ margin-left: 0.5rem;
+ }
+
+ .td-page-meta {
+ a {
+ font-weight: $font-weight-medium;
+ }
+ }
+
+ #TableOfContents {
+ // Hugo's ToC is a mouthful, this can be used to style the top level h2 entries.
+ > ul > li > ul > li > a {}
+
+ a {
+ color: $gray-600;
+
+ &:hover {
+ color: $blue;
+ text-decoration: none;
+ }
+ }
+ }
+
+ ul {
+ padding-left: 0;
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_sidebar-tree.scss b/website/themes/docsy/assets/scss/_sidebar-tree.scss
new file mode 100644
index 00000000..3eef1c4b
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_sidebar-tree.scss
@@ -0,0 +1,132 @@
+//
+// Left side navigation
+//
+.td-sidebar-nav {
+ padding-right: 0.5rem;
+ margin-right: -15px;
+ margin-left: -15px;
+
+ @include media-breakpoint-up(md) {
+ @supports (position: sticky) {
+ max-height: calc(100vh - 10rem);
+ overflow-y: auto;
+ }
+ }
+
+
+ @include media-breakpoint-up(md) {
+ display: block !important;
+ }
+
+
+ &__section {
+ li {
+ list-style: none;
+ }
+
+ ul {
+ padding: 0;
+ margin: 0;
+ }
+
+ @include media-breakpoint-up(md) {
+ & > ul {
+ padding-left: .5rem;
+ }
+ }
+
+
+ padding-left: 0;
+ }
+
+ &__section-title {
+ display: block;
+ font-weight: $font-weight-medium;
+
+ .active {
+ font-weight: $font-weight-bold;
+ }
+
+ a {
+ color: $gray-900;
+ }
+ }
+
+ .td-sidebar-link {
+ display: block;
+ padding-bottom: 0.375rem;
+
+ &__page {
+ color: $gray-700;
+ font-weight: $font-weight-light;
+ }
+ }
+
+ a {
+ &:hover {
+ color: $blue;
+ text-decoration: none;
+ }
+
+ &.active {
+ font-weight: $font-weight-bold;
+ }
+ }
+
+ .dropdown {
+ a {
+ color: $gray-700;
+ }
+
+ .nav-link {
+ padding: 0 0 1rem;
+ }
+ }
+}
+
+.td-sidebar {
+ @include media-breakpoint-up(md) {
+ padding-top: 4rem;
+ background-color: $td-sidebar-bg-color;
+ padding-right: 1rem;
+ border-right: 1px solid $td-sidebar-border-color;
+ }
+
+
+ padding-bottom: 1rem;
+
+ &__toggle {
+ line-height: 1;
+ color: $gray-900;
+ margin: 1rem;
+ }
+
+ &__search {
+ padding: 1rem 15px;
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+
+ &__inner {
+ order: 0;
+
+ @include media-breakpoint-up(md) {
+ @supports (position: sticky) {
+ position: sticky;
+ top: 4rem;
+ z-index: 10;
+ height: calc(100vh - 6rem);
+ }
+ }
+
+
+ @include media-breakpoint-up(xl) {
+ flex: 0 1 320px;
+ }
+
+
+ .td-search-box {
+ width: 100%;
+ }
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/_styles_project.scss b/website/themes/docsy/assets/scss/_styles_project.scss
new file mode 100644
index 00000000..ab68a884
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_styles_project.scss
@@ -0,0 +1,7 @@
+/*
+
+Nothing defined here. The Hugo project that uses this theme can override Bootstrap by adding a file to:
+
+assets/scss/_styles_project.scss
+
+*/
diff --git a/website/themes/docsy/assets/scss/_variables.scss b/website/themes/docsy/assets/scss/_variables.scss
new file mode 100644
index 00000000..4c99baed
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_variables.scss
@@ -0,0 +1,131 @@
+/*
+
+Bootstrap variables overrides for theme.
+See https://github.com/twbs/bootstrap/pull/23260
+*/
+
+@fa-font-path : "../webfonts";
+
+// Bootstrap flags. For more, see https://getbootstrap.com/docs/4.0/getting-started/theming/
+$enable-gradients: true;
+$enable-rounded: true;
+$enable-shadows: true;
+
+// Theme flags.
+
+$td-enable-google-fonts: true;
+
+// Theme colors
+
+$primary: #30638E !default;
+$primary-light: lighten($primary, 75%) !default;
+$secondary: #FFA630 !default;
+$success: #3772FF !default;
+$info: #C0E0DE !default;
+$warning: #ED6A5A !default;
+$danger: #ED6A5A !default;
+$white: #fff !default;
+$light: #D3F3EE !default;
+
+$dark: #403F4C !default;
+$blue: #72A1E5 !default;
+$orange: #BA5A31 !default;
+$gray-100: #f8f9fa !default;
+$gray-200: #eee !default;
+$gray-300: #dee2e6 !default;
+$gray-400: #ccc !default;
+$gray-500: #adb5bd !default;
+$gray-600: #888 !default;
+$gray-700: #495057 !default;
+$gray-800: #333 !default;
+$gray-900: #222 !default;
+$black: #000 !default;
+
+$code-color: darken($secondary, 20%) !default;
+
+// UI element colors
+
+$border-color: $gray-300 !default;
+$td-sidebar-bg-color: rgba($primary, 0.03) !default;
+$td-sidebar-border-color: $border-color !default;
+
+// Background colors for the sections on home page etc. It is a paint by number system, starting at 0, where the number is taken from the shortcode's ordinal
+// if not provided by the user.
+// These colors are all part of the theme palette, but the mix is fairly random to create variation. This can be overridden by the project if needed.
+$td-box-colors: $dark, $primary, $secondary, $info, $primary-light, $gray-600, $success, $warning, $dark, $danger, $primary, $secondary, $primary-light, $info;
+
+$link-color: darken($blue, 15%) !default;
+$link-decoration: none !default;
+$link-hover-color: darken($link-color, 15%) !default;
+$link-hover-decoration: none !default;
+
+// Fonts
+
+$google_font_name: "Open Sans" !default;
+$google_font_family: "Open+Sans:300,300i,400,400i,700,700i" !default;
+$web-font-path: "https://fonts.googleapis.com/css?family=#{$google_font_family}";
+
+$td-fonts-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+
+@if $td-enable-google-fonts {
+ $td-fonts-serif: prepend($td-fonts-serif, "#{$google_font_name}");
+}
+
+$font-family-sans-serif: $td-fonts-serif !default;
+
+$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
+$font-family-base: $font-family-sans-serif !default;
+$font-size-base: 1rem !default;
+
+// Font weights
+
+$font-weight-light: 300 !default;
+$font-weight-normal: 400 !default;
+$font-weight-medium: 500 !default;
+$font-weight-bold: 700 !default;
+
+$font-weight-body-text: $font-weight-normal !default;
+$headings-font-weight: $font-weight-medium !default;
+
+// Heading sizes
+
+$h1-font-size: $font-size-base * 2.25 !default;
+$h2-font-size: $font-size-base * 2 !default;
+$h3-font-size: $font-size-base * 1.5 !default;
+$h4-font-size: $font-size-base * 1.35 !default;
+$h5-font-size: $font-size-base * 1.15 !default;
+$h6-font-size: $font-size-base !default;
+
+// Display styles
+
+$display1-weight: $font-weight-bold !default;
+$display2-weight: $font-weight-bold !default;
+$display3-weight: $font-weight-bold !default;
+$display4-weight: $font-weight-bold !default;
+$display1-size: 3rem !default;
+$display2-size: 2.5rem !default;
+$display3-size: 2rem !default;
+$display4-size: 1.75rem !default;
+
+// Space
+
+$spacer: 1rem;
+$td-block-space-top-base: 4 * $spacer;
+$td-block-space-bottom-base: 4 * $spacer;
+
+// Pagination
+
+$pagination-color: $gray-600 !default;
+$pagination-border-color: rgba($black, 0.1) !default;
+$pagination-active-border-color: darken($primary, 5%) !default;
+$pagination-disabled-color: $gray-300 !default;
+
+// Navbar
+
+$navbar-dark-color: rgba($white, 0.75) !default;
+$navbar-dark-hover-color: rgba($white, 0.5) !default;
+$navbar-dark-active-color: $white !default;
+$navbar-dark-disabled-color: rgba($white, 0.25) !default;
+
+// The yiq lightness value that determines when the lightness of color changes from "dark" to "light".
+$yiq-contrasted-threshold: 200 !default;
diff --git a/website/themes/docsy/assets/scss/_variables_project.scss b/website/themes/docsy/assets/scss/_variables_project.scss
new file mode 100644
index 00000000..387082dc
--- /dev/null
+++ b/website/themes/docsy/assets/scss/_variables_project.scss
@@ -0,0 +1,7 @@
+/*
+
+Nothing defined here. The Hugo project that uses this theme can override theme variables by adding a file to:
+
+assets/scss/_variables_project.scss
+
+*/
diff --git a/website/themes/docsy/assets/scss/blocks/_blocks.scss b/website/themes/docsy/assets/scss/blocks/_blocks.scss
new file mode 100644
index 00000000..1e374678
--- /dev/null
+++ b/website/themes/docsy/assets/scss/blocks/_blocks.scss
@@ -0,0 +1,7 @@
+@import "cover";
+
+.td-bg-arrow {
+ &-wrapper {
+ position: relative;
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/blocks/_cover.scss b/website/themes/docsy/assets/scss/blocks/_cover.scss
new file mode 100644
index 00000000..f1f0422e
--- /dev/null
+++ b/website/themes/docsy/assets/scss/blocks/_cover.scss
@@ -0,0 +1,19 @@
+// A cover block is a full size cover with a fixed background for smaller screens.
+
+@include td-box-height-modifiers(".td-cover-block");
+
+.td-cover-logo {
+ margin-right: 0.5em;
+}
+
+.td-cover-block {
+ position: relative;
+ padding-top: 5rem;
+ padding-bottom: 5rem;
+ background: {
+ repeat: no-repeat;
+ position: 50% 0;
+ size: cover;
+ };
+
+}
diff --git a/website/themes/docsy/assets/scss/main.scss b/website/themes/docsy/assets/scss/main.scss
new file mode 100644
index 00000000..b47cfa0e
--- /dev/null
+++ b/website/themes/docsy/assets/scss/main.scss
@@ -0,0 +1,60 @@
+@import "support/functions";
+@import "variables_project";
+@import "variables";
+@import "support/mixins";
+
+@import "../vendor/bootstrap/scss/bootstrap";
+
+@import "../vendor/Font-Awesome//web-fonts-with-css/scss/fontawesome.scss";
+@import "../vendor/Font-Awesome//web-fonts-with-css/scss/fa-solid.scss";
+@import "../vendor/Font-Awesome//web-fonts-with-css/scss/fa-brands.scss";
+
+@import "support/utilities";
+@import "colors";
+@import "boxes";
+@import "blog";
+@import "code";
+@import "nav";
+@import "sidebar-tree";
+@import "sidebar-toc";
+@import "buttons";
+@import "breadcrumb";
+@import "alerts";
+@import "content";
+@import "search";
+@import "main-container";
+@import "blocks/blocks";
+@import "section-index";
+@import "pageinfo";
+
+@if $td-enable-google-fonts {
+ @import url($web-font-path);
+}
+
+footer {
+ min-height: 150px;
+
+ @include media-breakpoint-down(md) {
+ min-height: 200px;
+ }
+}
+
+// Adjust anchors vs the fixed menu.
+@include media-breakpoint-up(md) {
+ .td-offset-anchor:target {
+ display: block;
+ position: relative;
+ top: -4rem;
+ visibility: hidden;
+ }
+
+ h2[id]:before, h3[id]:before, h4[id]:before, h5[id]:before {
+ display: block;
+ content: " ";
+ margin-top: -5rem;
+ height: 5rem;
+ visibility: hidden;
+ }
+}
+
+@import "styles_project";
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/section-index.scss b/website/themes/docsy/assets/scss/section-index.scss
new file mode 100644
index 00000000..e00b0045
--- /dev/null
+++ b/website/themes/docsy/assets/scss/section-index.scss
@@ -0,0 +1,18 @@
+.section-index {
+
+ .entry {
+ padding: .75rem;
+ }
+
+ h5 {
+ margin-bottom: 0;
+
+ a {
+ font-weight: 700;
+ }
+ }
+
+ p {
+ margin-top: 0;
+ }
+}
diff --git a/website/themes/docsy/assets/scss/support/_functions.scss b/website/themes/docsy/assets/scss/support/_functions.scss
new file mode 100644
index 00000000..2b641f09
--- /dev/null
+++ b/website/themes/docsy/assets/scss/support/_functions.scss
@@ -0,0 +1,21 @@
+// Common functions.
+
+@function prepend($list, $value) {
+ @return join($value, $list);
+}
+
+
+
+// See https://www.sitepoint.com/using-sass-build-color-palettes/
+@function color-diff($a, $b) {
+ $sat: saturation($a) - saturation($b);
+ $lig: lightness($a) - lightness($b);
+ $fn-sat: if($sat > 0, 'desaturate', 'saturate');
+ $fn-lig: if($lig > 0, 'darken', 'lighten');
+
+ @return (
+ adjust-hue: -(hue($a) - hue($b)),
+ #{$fn-sat}: abs($sat),
+ #{$fn-lig}: abs($lig)
+ );
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/support/_mixins.scss b/website/themes/docsy/assets/scss/support/_mixins.scss
new file mode 100644
index 00000000..8fcbd7fd
--- /dev/null
+++ b/website/themes/docsy/assets/scss/support/_mixins.scss
@@ -0,0 +1,49 @@
+// Some simple mixins.
+
+@mixin bg-gradient-variant($parent, $color) {
+ #{$parent} {
+ background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;
+ }
+}
+
+@mixin link-variant($parent, $color, $hover-color, $underline: false) {
+ #{$parent} {
+ color: $color;
+
+ @if $underline {
+ text-decoration: underline;
+ }
+
+ @include hover-focus {
+ color: $hover-color;
+ }
+ }
+}
+
+@mixin optional-at-root($sel) {
+ @at-root #{if(not &, $sel, selector-append(&, $sel))} {
+ @content;
+ }
+}
+
+// placeholder allows styling of the placeholder used in search input etc.
+@mixin placeholder {
+ @include optional-at-root("::-webkit-input-placeholder") {
+ @content;
+ }
+
+
+ @include optional-at-root(":-moz-placeholder") {
+ @content;
+ }
+
+
+ @include optional-at-root("::-moz-placeholder") {
+ @content;
+ }
+
+
+ @include optional-at-root(":-ms-input-placeholder") {
+ @content;
+ }
+}
\ No newline at end of file
diff --git a/website/themes/docsy/assets/scss/support/_utilities.scss b/website/themes/docsy/assets/scss/support/_utilities.scss
new file mode 100644
index 00000000..ce9bc2e2
--- /dev/null
+++ b/website/themes/docsy/assets/scss/support/_utilities.scss
@@ -0,0 +1,82 @@
+// Mixins
+
+@mixin optional-at-root($sel) {
+ @at-root #{if(not &, $sel, selector-append(&, $sel))} {
+ @content;
+ }
+}
+
+@mixin placeholder {
+ @include optional-at-root("::-webkit-input-placeholder") {
+ @content;
+ }
+
+
+ @include optional-at-root(":-moz-placeholder") {
+ @content;
+ }
+
+
+ @include optional-at-root("::-moz-placeholder") {
+ @content;
+ }
+
+
+ @include optional-at-root(":-ms-input-placeholder") {
+ @content;
+ }
+}
+
+// Common util classes.
+
+.td-border-top {
+ border: none;
+ border-top: 1px solid #eee;
+}
+
+.td-border-none {
+ border: none;
+}
+
+.td-block-padding {
+ padding-top: $td-block-space-top-base ;
+ padding-bottom: $td-block-space-bottom-base;
+
+ @include media-breakpoint-up(md) {
+ padding-top: $td-block-space-top-base * 1.25;
+ padding-bottom: $td-block-space-bottom-base * 1.25;
+ }
+}
+
+.td-overlay {
+ position: relative;
+
+ &::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ &--dark::after {
+ background-color: rgba($dark, 0.3);
+ }
+
+ &--light::after {
+ background-color: rgba($light, 0.3);
+ }
+
+ &__inner {
+ position: relative;
+ z-index: 1;
+ }
+}
+
+.td-max-width-on-larger-screens {
+ @include media-breakpoint-up(lg) {
+ max-width: 80%;
+ }
+
+}
\ No newline at end of file
diff --git a/website/themes/docsy/config.toml b/website/themes/docsy/config.toml
new file mode 100644
index 00000000..e9bf6001
--- /dev/null
+++ b/website/themes/docsy/config.toml
@@ -0,0 +1,13 @@
+# This the theme configuration.
+# Allowed configuration in a theme is (currently):
+# params (global and per language)
+# menu (global and per language)
+# outputformats and mediatypes
+
+
+[params]
+time_format_blog = "Monday, January 02, 2006"
+time_format_default = "January 2, 2006"
+# Sections to publish in the main RSS feed.
+rss_sections = ["blog"]
+
diff --git a/website/themes/docsy/i18n/en.toml b/website/themes/docsy/i18n/en.toml
new file mode 100644
index 00000000..f30fe940
--- /dev/null
+++ b/website/themes/docsy/i18n/en.toml
@@ -0,0 +1,43 @@
+
+
+# UI strings. Buttons and similar.
+
+[ui_pager_prev]
+other = "Previous"
+
+[ui_pager_next]
+other = "Next"
+
+[ui_read_more]
+other = "Read more"
+
+[ui_search]
+other = "Search this site…"
+
+# Used in sentences such as "Posted in News"
+[ui_in]
+other = "in"
+
+# Footer text
+[footer_all_rights_reserved]
+other = "All Rights Reserved"
+
+[footer_privacy_policy]
+other = "Privacy Policy"
+
+
+# Post (blog, articles etc.)
+[post_byline_by]
+other = "By"
+[post_created]
+other = "Created"
+[post_last_mod]
+other = "Last modified"
+[post_edit_this]
+other = "Edit this page"
+[post_create_issue]
+other = "Create documentation issue"
+[post_create_project_issue]
+other = "Create project issue"
+[post_posts_in]
+other = "Posts in"
diff --git a/website/themes/docsy/i18n/no.toml b/website/themes/docsy/i18n/no.toml
new file mode 100644
index 00000000..5ee7b20f
--- /dev/null
+++ b/website/themes/docsy/i18n/no.toml
@@ -0,0 +1,43 @@
+
+
+# UI strings. Buttons and similar.
+
+[ui_pager_prev]
+other = "Forrige"
+
+[ui_pager_next]
+other = "Neste"
+
+[ui_read_more]
+other = "Les mer"
+
+[ui_search]
+other = "Søk på nettstedet…"
+
+# Used in sentences such as "Posted in News"
+[ui_in]
+other = "i"
+
+# Footer text
+[footer_all_rights_reserved]
+other = "Alle retter er reservert"
+
+[footer_privacy_policy]
+other = "Privacy Policy"
+
+
+# Post (blog, articles etc.)
+[post_byline_by]
+other = "Av"
+[post_created]
+other = "Opprettet"
+[post_last_mod]
+other = "Sist endret"
+[post_edit_this]
+other = "Endre denne siden"
+[post_create_issue]
+other = "Opprett dokumentasjon sak"
+[post_create_project_issue]
+other = "Opprett prosjekt sak"
+[post_posts_in]
+other = "Poster i"
diff --git a/website/themes/docsy/layouts/_default/baseof.html b/website/themes/docsy/layouts/_default/baseof.html
new file mode 100644
index 00000000..5767a951
--- /dev/null
+++ b/website/themes/docsy/layouts/_default/baseof.html
@@ -0,0 +1,18 @@
+
+
+
+ {{ partial "head.html" . }}
+
+
+
+ {{ partial "navbar.html" . }}
+
+
+{{ end }}
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/blog/single.html b/website/themes/docsy/layouts/blog/single.html
new file mode 100644
index 00000000..00cb3ab9
--- /dev/null
+++ b/website/themes/docsy/layouts/blog/single.html
@@ -0,0 +1,3 @@
+{{ define "main" }}
+{{ .Render "content" }}
+{{ end }}
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/community/list.html b/website/themes/docsy/layouts/community/list.html
new file mode 100644
index 00000000..d66a50ed
--- /dev/null
+++ b/website/themes/docsy/layouts/community/list.html
@@ -0,0 +1,19 @@
+{{ define "main" }}
+
+
+
+
+
+
Join the {{ .Site.Title }} community
+
+
{{ .Site.Title }} is an open source project that anyone in the community can use, improve, and enjoy. We'd love you to join us! Here's a few ways to find out what's happening and get involved.
+
+
+
+{{ partial "community_links.html" . }}
+
+
+{{ .Content }}
+
+
+{{ end }}
diff --git a/website/themes/docsy/layouts/docs/baseof.html b/website/themes/docsy/layouts/docs/baseof.html
new file mode 100644
index 00000000..108ea7a4
--- /dev/null
+++ b/website/themes/docsy/layouts/docs/baseof.html
@@ -0,0 +1,30 @@
+
+
+
+ {{ partial "head.html" . }}
+ {{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}
+
+
+
+ {{ partial "navbar.html" . }}
+
+
+
+
+
+ {{ partial "sidebar.html" . }}
+
+
+ {{ partial "toc.html" . }}
+
+
+ {{ if not .Site.Params.ui.breadcrumb_disable }}{{ partial "breadcrumb.html" . }}{{ end }}
+ {{ block "main" . }}{{ end }}
+
+
+
+ {{ partial "footer.html" . }}
+
+ {{ partial "scripts.html" . }}
+
+
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/docs/list.html b/website/themes/docsy/layouts/docs/list.html
new file mode 100644
index 00000000..71224780
--- /dev/null
+++ b/website/themes/docsy/layouts/docs/list.html
@@ -0,0 +1,17 @@
+{{ define "main" }}
+
+
{{ .Title }}
+ {{ with .Params.description }}
{{ . | markdownify }}
{{ end }}
+ {{ .Content }}
+ {{ partial "section-index.html" . }}
+ {{ if (and (not .Params.hide_feedback) (.Site.Params.ui.feedback.enable) (.Site.GoogleAnalytics)) }}
+ {{ partial "feedback.html" .Site.Params.ui.feedback }}
+
+ {{ end }}
+ {{ if (.Site.DisqusShortname) }}
+
+ {{ partial "disqus-comment.html" . }}
+ {{ end }}
+
{{ partial "page-meta-lastmod.html" . }}
+
+{{ end }}
diff --git a/website/themes/docsy/layouts/docs/single.html b/website/themes/docsy/layouts/docs/single.html
new file mode 100644
index 00000000..00cb3ab9
--- /dev/null
+++ b/website/themes/docsy/layouts/docs/single.html
@@ -0,0 +1,3 @@
+{{ define "main" }}
+{{ .Render "content" }}
+{{ end }}
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/home.html b/website/themes/docsy/layouts/home.html
new file mode 100644
index 00000000..b2e137af
--- /dev/null
+++ b/website/themes/docsy/layouts/home.html
@@ -0,0 +1,5 @@
+{{ define "main" }}
+{{ with .Content }}
+{{ . }}
+{{ end }}
+{{ end }}
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/partials/breadcrumb.html b/website/themes/docsy/layouts/partials/breadcrumb.html
new file mode 100644
index 00000000..0403f6a5
--- /dev/null
+++ b/website/themes/docsy/layouts/partials/breadcrumb.html
@@ -0,0 +1,18 @@
+
+{{ define "breadcrumbnav" }}
+{{ if .p1.Parent }}
+{{ if not .p1.Parent.IsHome }}
+{{ template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 ) }}
+{{ end }}
+{{ else if not .p1.IsHome }}
+{{ template "breadcrumbnav" (dict "p1" .p1.Site.Home "p2" .p2 ) }}
+{{ end }}
+{{ $isActive := eq .p1 .p2 }}
+
+{{ end }}
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/partials/community_links.html b/website/themes/docsy/layouts/partials/community_links.html
new file mode 100644
index 00000000..48d64584
--- /dev/null
+++ b/website/themes/docsy/layouts/partials/community_links.html
@@ -0,0 +1,29 @@
+{{ $links := .Site.Params.links }}
+
+
+
+
Learn and Connect
+
Using or want to use {{ .Site.Title }}? Find out more here:
+{{ with index $links "user"}}
+{{ template "community-links-list" . }}
+{{ end }}
+
+
+
Develop and Contribute
+
If you want to get more involved by contributing to {{ .Site.Title }}, join us here:
+{{ with index $links "developer"}}
+{{ template "community-links-list" . }}
+{{ end }}
+
diff --git a/website/themes/docsy/layouts/partials/scripts.html b/website/themes/docsy/layouts/partials/scripts.html
new file mode 100644
index 00000000..7267b339
--- /dev/null
+++ b/website/themes/docsy/layouts/partials/scripts.html
@@ -0,0 +1,13 @@
+
+
+
+{{ $jsBase := resources.Get "js/base.js" }}
+{{ $jsSearch := resources.Get "js/search.js" | resources.ExecuteAsTemplate "js/search.js" .Site.Home }}
+{{ $js := (slice $jsBase $jsSearch) | resources.Concat "js/main.js" }}
+{{ if .Site.IsServer }}
+
+{{ else }}
+{{ $js := $js | minify | fingerprint }}
+
+{{ end }}
+{{ partial "hooks/body-end.html" . }}
diff --git a/website/themes/docsy/layouts/partials/search-input.html b/website/themes/docsy/layouts/partials/search-input.html
new file mode 100644
index 00000000..883ca3c3
--- /dev/null
+++ b/website/themes/docsy/layouts/partials/search-input.html
@@ -0,0 +1,3 @@
+{{ with .Site.Params.gcs_engine_id }}
+
+{{ end }}
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/partials/section-index.html b/website/themes/docsy/layouts/partials/section-index.html
new file mode 100644
index 00000000..06d08938
--- /dev/null
+++ b/website/themes/docsy/layouts/partials/section-index.html
@@ -0,0 +1,29 @@
+
+ {{ $pages := (where .Site.Pages "Section" .Section).ByWeight }}
+ {{ $parent := .Page }}
+ {{ if $parent.Params.no_list }}
+ {{/* If no_list is true we don't show a list of subpages */}}
+ {{ else if $parent.Params.simple_list }}
+ {{/* If simple_list is true we show a bulleted list of subpages */}}
+
+ {{ range $pages }}
+ {{ if eq .Parent $parent }}
+
+ {{ else }}
+ {{/* Otherwise we show a nice formatted list of subpages with page descriptions */}}
+
+ {{ range $pages }}
+ {{ if eq .Parent $parent }}
+
diff --git a/website/themes/docsy/layouts/partials/sidebar-tree.html b/website/themes/docsy/layouts/partials/sidebar-tree.html
new file mode 100644
index 00000000..a3eeb2a4
--- /dev/null
+++ b/website/themes/docsy/layouts/partials/sidebar-tree.html
@@ -0,0 +1,47 @@
+{{/* We cache this partial for bigger sites and set the active class client side. */}}
+{{ $shouldDelayActive := ge (len .Site.Pages) 2000 }}
+
+ {{ if not .Site.Params.ui.sidebar_search_disable }}
+
+ {{ end }}
+
+
+
diff --git a/website/themes/docsy/layouts/shortcodes/blocks/link-down.html b/website/themes/docsy/layouts/shortcodes/blocks/link-down.html
new file mode 100644
index 00000000..63958663
--- /dev/null
+++ b/website/themes/docsy/layouts/shortcodes/blocks/link-down.html
@@ -0,0 +1,7 @@
+{{ with .Parent }}
+{{ $id := $.Get "id" | default (printf "td-block-%d" ( add .Ordinal 1 )) }}
+{{ $color := $.Get "color" | default "blue" }}
+
+{{ else }}
+{{ errorf "The link-down shortcode is supposed to be nested inside a shortcode"}}
+{{ end }}
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/shortcodes/blocks/section.html b/website/themes/docsy/layouts/shortcodes/blocks/section.html
new file mode 100644
index 00000000..d5897f64
--- /dev/null
+++ b/website/themes/docsy/layouts/shortcodes/blocks/section.html
@@ -0,0 +1,12 @@
+{{ $_hugo_config := `{ "version": 1 }` }}
+{{ $col_id := .Get "color" | default .Ordinal }}
+{{ $height := .Get "height" | default "auto" }}
+{{ $type := .Get "type" | default "" }}
+
+
+
+
+ {{ .Inner | markdownify}}
+
+
+
diff --git a/website/themes/docsy/layouts/shortcodes/imgproc.html b/website/themes/docsy/layouts/shortcodes/imgproc.html
new file mode 100644
index 00000000..bb80a850
--- /dev/null
+++ b/website/themes/docsy/layouts/shortcodes/imgproc.html
@@ -0,0 +1,21 @@
+{{ $original := .Page.Resources.GetMatch (printf "**%s*" (.Get 0)) }}
+{{ $command := .Get 1 }}
+{{ $options := .Get 2 }}
+{{ if eq $command "Fit"}}
+{{ .Scratch.Set "image" ($original.Fit $options) }}
+{{ else if eq $command "Resize"}}
+{{ .Scratch.Set "image" ($original.Resize $options) }}
+{{ else if eq $command "Fill"}}
+{{ .Scratch.Set "image" ($original.Fill $options) }}
+{{ else }}
+{{ errorf "Invalid image processing command: Must be one of Fit, Fill or Resize."}}
+{{ end }}
+{{ $image := .Scratch.Get "image" }}
+
+
+ {{ with .Inner }}
+
+
{{ . }}{{ with $image.Params.byline }} {{ . | html }}{{ end }}
+
+ {{ end }}
+
\ No newline at end of file
diff --git a/website/themes/docsy/layouts/shortcodes/pageinfo.html b/website/themes/docsy/layouts/shortcodes/pageinfo.html
new file mode 100644
index 00000000..303f8c5f
--- /dev/null
+++ b/website/themes/docsy/layouts/shortcodes/pageinfo.html
@@ -0,0 +1,5 @@
+{{ $_hugo_config := `{ "version": 1 }` }}
+{{ $color := .Get "color" | default "primary" }}
+
+{{ .Inner }}
+
diff --git a/website/themes/docsy/layouts/shortcodes/readfile.md b/website/themes/docsy/layouts/shortcodes/readfile.md
new file mode 100644
index 00000000..117c7e87
--- /dev/null
+++ b/website/themes/docsy/layouts/shortcodes/readfile.md
@@ -0,0 +1,8 @@
+{{$file := .Get "file"}}
+{{- if eq (.Get "markdown") "true" -}}
+{{- $file | readFile | markdownify -}}
+{{- else if (.Get "highlight") -}}
+{{- highlight ($file | readFile) (.Get "highlight") "" -}}
+{{- else -}}
+{{ $file | readFile | safeHTML }}
+{{- end -}}
diff --git a/website/themes/docsy/netlify.toml b/website/themes/docsy/netlify.toml
new file mode 100644
index 00000000..c6ca3f13
--- /dev/null
+++ b/website/themes/docsy/netlify.toml
@@ -0,0 +1,7 @@
+[build]
+ publish = "userguide/public"
+ command = "git submodule update -f --init && cd userguide && npm install postcss-cli && hugo --themesDir ../.."
+
+[build.environment]
+ HUGO_VERSION = "0.55.6"
+ HUGO_THEME = "repo"
diff --git a/website/themes/docsy/postcss.config.js b/website/themes/docsy/postcss.config.js
new file mode 100644
index 00000000..13d64ecc
--- /dev/null
+++ b/website/themes/docsy/postcss.config.js
@@ -0,0 +1,32 @@
+/*
+Copyright 2018 Google LLC
+
+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
+
+ https://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.
+*/
+
+module.exports = {
+ plugins: {
+ autoprefixer: {
+ browsers: [
+ "Android 2.3",
+ "Android >= 4",
+ "Chrome >= 20",
+ "Firefox >= 24",
+ "Explorer >= 8",
+ "iOS >= 6",
+ "Opera >= 12",
+ "Safari >= 6"
+ ]
+ }
+ },
+}
diff --git a/website/themes/docsy/static/favicons/android-144x144.png b/website/themes/docsy/static/favicons/android-144x144.png
new file mode 100755
index 00000000..8851c09a
Binary files /dev/null and b/website/themes/docsy/static/favicons/android-144x144.png differ
diff --git a/website/themes/docsy/static/favicons/android-192x192.png b/website/themes/docsy/static/favicons/android-192x192.png
new file mode 100755
index 00000000..94b2ad2d
Binary files /dev/null and b/website/themes/docsy/static/favicons/android-192x192.png differ
diff --git a/website/themes/docsy/static/favicons/android-36x36.png b/website/themes/docsy/static/favicons/android-36x36.png
new file mode 100755
index 00000000..7ec5cf65
Binary files /dev/null and b/website/themes/docsy/static/favicons/android-36x36.png differ
diff --git a/website/themes/docsy/static/favicons/android-48x48.png b/website/themes/docsy/static/favicons/android-48x48.png
new file mode 100755
index 00000000..419a445a
Binary files /dev/null and b/website/themes/docsy/static/favicons/android-48x48.png differ
diff --git a/website/themes/docsy/static/favicons/android-72x72.png b/website/themes/docsy/static/favicons/android-72x72.png
new file mode 100755
index 00000000..230b18fd
Binary files /dev/null and b/website/themes/docsy/static/favicons/android-72x72.png differ
diff --git a/website/themes/docsy/static/favicons/android-96x196.png b/website/themes/docsy/static/favicons/android-96x196.png
new file mode 100755
index 00000000..8cc69897
Binary files /dev/null and b/website/themes/docsy/static/favicons/android-96x196.png differ
diff --git a/website/themes/docsy/static/favicons/apple-touch-icon-180x180.png b/website/themes/docsy/static/favicons/apple-touch-icon-180x180.png
new file mode 100755
index 00000000..03d0b513
Binary files /dev/null and b/website/themes/docsy/static/favicons/apple-touch-icon-180x180.png differ
diff --git a/website/themes/docsy/static/favicons/favicon-1024.png b/website/themes/docsy/static/favicons/favicon-1024.png
new file mode 100644
index 00000000..920f1072
Binary files /dev/null and b/website/themes/docsy/static/favicons/favicon-1024.png differ
diff --git a/website/themes/docsy/static/favicons/favicon-16x16.png b/website/themes/docsy/static/favicons/favicon-16x16.png
new file mode 100755
index 00000000..ce918ee3
Binary files /dev/null and b/website/themes/docsy/static/favicons/favicon-16x16.png differ
diff --git a/website/themes/docsy/static/favicons/favicon-256.png b/website/themes/docsy/static/favicons/favicon-256.png
new file mode 100644
index 00000000..ebd3f8c9
Binary files /dev/null and b/website/themes/docsy/static/favicons/favicon-256.png differ
diff --git a/website/themes/docsy/static/favicons/favicon-32x32.png b/website/themes/docsy/static/favicons/favicon-32x32.png
new file mode 100755
index 00000000..e95c80ad
Binary files /dev/null and b/website/themes/docsy/static/favicons/favicon-32x32.png differ
diff --git a/website/themes/docsy/static/favicons/favicon.ico b/website/themes/docsy/static/favicons/favicon.ico
new file mode 100755
index 00000000..216330ff
Binary files /dev/null and b/website/themes/docsy/static/favicons/favicon.ico differ
diff --git a/website/themes/docsy/static/favicons/pwa-192x192.png b/website/themes/docsy/static/favicons/pwa-192x192.png
new file mode 100755
index 00000000..94b2ad2d
Binary files /dev/null and b/website/themes/docsy/static/favicons/pwa-192x192.png differ
diff --git a/website/themes/docsy/static/favicons/pwa-512x512.png b/website/themes/docsy/static/favicons/pwa-512x512.png
new file mode 100755
index 00000000..89258a4e
Binary files /dev/null and b/website/themes/docsy/static/favicons/pwa-512x512.png differ
diff --git a/website/themes/docsy/static/favicons/tile150x150.png b/website/themes/docsy/static/favicons/tile150x150.png
new file mode 100755
index 00000000..3d0c7604
Binary files /dev/null and b/website/themes/docsy/static/favicons/tile150x150.png differ
diff --git a/website/themes/docsy/static/favicons/tile310x150.png b/website/themes/docsy/static/favicons/tile310x150.png
new file mode 100755
index 00000000..ed890428
Binary files /dev/null and b/website/themes/docsy/static/favicons/tile310x150.png differ
diff --git a/website/themes/docsy/static/favicons/tile310x310.png b/website/themes/docsy/static/favicons/tile310x310.png
new file mode 100755
index 00000000..67172b30
Binary files /dev/null and b/website/themes/docsy/static/favicons/tile310x310.png differ
diff --git a/website/themes/docsy/static/favicons/tile70x70.png b/website/themes/docsy/static/favicons/tile70x70.png
new file mode 100755
index 00000000..31413a2b
Binary files /dev/null and b/website/themes/docsy/static/favicons/tile70x70.png differ
diff --git a/website/themes/docsy/static/webfonts/fa-brands-400.eot b/website/themes/docsy/static/webfonts/fa-brands-400.eot
new file mode 100644
index 00000000..9c3f23f7
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-brands-400.eot differ
diff --git a/website/themes/docsy/static/webfonts/fa-brands-400.svg b/website/themes/docsy/static/webfonts/fa-brands-400.svg
new file mode 100644
index 00000000..94bf39be
--- /dev/null
+++ b/website/themes/docsy/static/webfonts/fa-brands-400.svg
@@ -0,0 +1,1131 @@
+
+
+
+
diff --git a/website/themes/docsy/static/webfonts/fa-brands-400.ttf b/website/themes/docsy/static/webfonts/fa-brands-400.ttf
new file mode 100644
index 00000000..397a4216
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-brands-400.ttf differ
diff --git a/website/themes/docsy/static/webfonts/fa-brands-400.woff b/website/themes/docsy/static/webfonts/fa-brands-400.woff
new file mode 100644
index 00000000..201203d4
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-brands-400.woff differ
diff --git a/website/themes/docsy/static/webfonts/fa-brands-400.woff2 b/website/themes/docsy/static/webfonts/fa-brands-400.woff2
new file mode 100644
index 00000000..aa1a3361
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-brands-400.woff2 differ
diff --git a/website/themes/docsy/static/webfonts/fa-regular-400.eot b/website/themes/docsy/static/webfonts/fa-regular-400.eot
new file mode 100644
index 00000000..18733ca5
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-regular-400.eot differ
diff --git a/website/themes/docsy/static/webfonts/fa-regular-400.svg b/website/themes/docsy/static/webfonts/fa-regular-400.svg
new file mode 100644
index 00000000..155e263b
--- /dev/null
+++ b/website/themes/docsy/static/webfonts/fa-regular-400.svg
@@ -0,0 +1,471 @@
+
+
+
+
diff --git a/website/themes/docsy/static/webfonts/fa-regular-400.ttf b/website/themes/docsy/static/webfonts/fa-regular-400.ttf
new file mode 100644
index 00000000..9ed2581b
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-regular-400.ttf differ
diff --git a/website/themes/docsy/static/webfonts/fa-regular-400.woff b/website/themes/docsy/static/webfonts/fa-regular-400.woff
new file mode 100644
index 00000000..2e2a00f0
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-regular-400.woff differ
diff --git a/website/themes/docsy/static/webfonts/fa-regular-400.woff2 b/website/themes/docsy/static/webfonts/fa-regular-400.woff2
new file mode 100644
index 00000000..5657c1a0
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-regular-400.woff2 differ
diff --git a/website/themes/docsy/static/webfonts/fa-solid-900.eot b/website/themes/docsy/static/webfonts/fa-solid-900.eot
new file mode 100644
index 00000000..58c85e19
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-solid-900.eot differ
diff --git a/website/themes/docsy/static/webfonts/fa-solid-900.svg b/website/themes/docsy/static/webfonts/fa-solid-900.svg
new file mode 100644
index 00000000..281ab15c
--- /dev/null
+++ b/website/themes/docsy/static/webfonts/fa-solid-900.svg
@@ -0,0 +1,2235 @@
+
+
+
+
diff --git a/website/themes/docsy/static/webfonts/fa-solid-900.ttf b/website/themes/docsy/static/webfonts/fa-solid-900.ttf
new file mode 100644
index 00000000..ed714085
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-solid-900.ttf differ
diff --git a/website/themes/docsy/static/webfonts/fa-solid-900.woff b/website/themes/docsy/static/webfonts/fa-solid-900.woff
new file mode 100644
index 00000000..f58c4458
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-solid-900.woff differ
diff --git a/website/themes/docsy/static/webfonts/fa-solid-900.woff2 b/website/themes/docsy/static/webfonts/fa-solid-900.woff2
new file mode 100644
index 00000000..8670c4ed
Binary files /dev/null and b/website/themes/docsy/static/webfonts/fa-solid-900.woff2 differ
diff --git a/website/themes/docsy/userguide/.gitignore b/website/themes/docsy/userguide/.gitignore
new file mode 100644
index 00000000..7e152f10
--- /dev/null
+++ b/website/themes/docsy/userguide/.gitignore
@@ -0,0 +1,6 @@
+
+public/
+resources/
+node_modules/
+tech-doc-hugo
+
diff --git a/website/themes/docsy/userguide/.gitmodules b/website/themes/docsy/userguide/.gitmodules
new file mode 100644
index 00000000..a1524f2c
--- /dev/null
+++ b/website/themes/docsy/userguide/.gitmodules
@@ -0,0 +1,4 @@
+
+[submodule "themes/docsy"]
+ path = themes/docsy
+ url = https://github.com/google/docsy
diff --git a/website/themes/docsy/userguide/CONTRIBUTING.md b/website/themes/docsy/userguide/CONTRIBUTING.md
new file mode 100644
index 00000000..db177d4a
--- /dev/null
+++ b/website/themes/docsy/userguide/CONTRIBUTING.md
@@ -0,0 +1,28 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## Community Guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
diff --git a/website/themes/docsy/userguide/LICENSE b/website/themes/docsy/userguide/LICENSE
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/website/themes/docsy/userguide/LICENSE
@@ -0,0 +1,201 @@
+ 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.
diff --git a/website/themes/docsy/userguide/README.md b/website/themes/docsy/userguide/README.md
new file mode 100644
index 00000000..9a6db02b
--- /dev/null
+++ b/website/themes/docsy/userguide/README.md
@@ -0,0 +1,58 @@
+[Docsy](https://github.com/google/docsy) is a Hugo theme for technical documentation sites, providing easy site navigation, structure, and more. This **Docsy Example Project** uses the Docsy theme, as well as providing a skeleton documentation structure for you to use. You can either copy this project and edit it with your own content, or use the theme in your projects like any other [Hugo theme](https://gohugo.io/themes/installing-and-using-themes/).
+
+This Docsy Example Project is hosted at [https://testydocsy.netlify.com/](https://testydocsy.netlify.com/).
+
+You can find detailed theme instructions in the example project under **Documentation -> Getting Started**.
+
+This is not an officially supported Google product. This project is currently maintained.
+
+## Cloning the Docsy Example Project
+
+The following will give you a project that is set up and ready to use (don't forget to use `--recurse-submodules` or you won't pull down some of the code you need to generate a working site). The `hugo server` command builds and serves the site. If you just want to build the site, run `hugo` instead.
+
+```bash
+git clone --recurse-submodules --depth 1 https://github.com/google/docsy-example.git
+cd docsy-example
+hugo server
+```
+
+The theme is included as a Git submodule:
+
+```bash
+▶ git submodule
+ a053131a4ebf6a59e4e8834a42368e248d98c01d themes/docsy (heads/master)
+```
+
+If you want to do SCSS edits and want to publish these, you need to install `PostCSS` (not needed for `hugo server`):
+
+```bash
+npm install
+```
+
+
+
+## Running the website locally
+
+Once you've cloned the site repo, from the repo root folder, run:
+
+```
+hugo server
+```
+
+Navigate to http://localhost:1313/td/docs/getting-started/ to read the theme documentation.
diff --git a/website/themes/docsy/userguide/assets/scss/_variables_project.scss b/website/themes/docsy/userguide/assets/scss/_variables_project.scss
new file mode 100644
index 00000000..45946bfe
--- /dev/null
+++ b/website/themes/docsy/userguide/assets/scss/_variables_project.scss
@@ -0,0 +1,5 @@
+/*
+Add styles or override variables from the theme here.
+*/
+
+$secondary: #D95040;
diff --git a/website/themes/docsy/userguide/config.toml b/website/themes/docsy/userguide/config.toml
new file mode 100644
index 00000000..f9e95d9a
--- /dev/null
+++ b/website/themes/docsy/userguide/config.toml
@@ -0,0 +1,143 @@
+baseURL = "/"
+title = "Docsy Example"
+
+enableRobotsTXT = true
+
+# Hugo allows theme composition (and inheritance). The precedence is from left to right.
+theme = ["docsy"]
+
+# Will give values to .Lastmod etc.
+enableGitInfo = true
+
+# Language settings
+contentDir = "content/en"
+defaultContentLanguage = "en"
+defaultContentLanguageInSubdir = false
+# Useful when translating.
+enableMissingTranslationPlaceholders = true
+
+disableKinds = ["taxonomy", "taxonomyTerm"]
+
+# Highlighting config
+pygmentsCodeFences = true
+pygmentsUseClasses = false
+# Use the new Chroma Go highlighter in Hugo.
+pygmentsUseClassic = false
+#pygmentsOptions = "linenos=table"
+# See https://help.farbox.com/pygments.html
+pygmentsStyle = "tango"
+
+ # First one is picked as the Twitter card image if not set on page.
+ #images = ["images/project-illustration.png"]
+
+# Configure how URLs look like per section.
+[permalinks]
+blog = "/:section/:year/:month/:day/:slug/"
+
+## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday
+[blackfriday]
+plainIDAnchors = true
+hrefTargetBlank = true
+angledQuotes = false
+latexDashes = true
+
+# Image processing configuration.
+[imaging]
+resampleFilter = "CatmullRom"
+quality = 75
+anchor = "smart"
+
+# Additional menu items
+
+[[menu.main]]
+ name = "Example Site"
+ weight = 40
+ url = "https://goldydocs.netlify.com"
+[[menu.main]]
+ name = "GitHub"
+ weight = 50
+ url = "https://github.com/google/docsy/"
+
+[services]
+[services.googleAnalytics]
+# Comment out the next line to disable GA tracking. Also disables the feature described in [params.ui.feedback].
+id = "UA-00000000-0"
+
+# Language configuration
+
+[languages]
+[languages.en]
+title = "Docsy"
+description = "Docsy does docs"
+languageName ="English"
+# Weight used for sorting.
+weight = 1
+
+# Everything below this are Site Params
+
+[params]
+copyright = "Global Inc"
+privacy_policy = "https://policies.google.com/privacy"
+github_repo = "https://github.com/google/docsy-example"
+time_format_blog = "Monday, January 02, 2006"
+time_format_default = "January 2, 2006"
+# Sections to publish in the main RSS feed.
+rss_sections = ["blog"]
+
+# Google Custom Search Engine ID. Remove or comment out to disable search.
+# gcs_engine_id = "011737558837375720776:fsdu1nryfng"
+
+# User interface configuration
+[params.ui]
+# Enable to show the side bar menu in its compact state.
+sidebar_menu_compact = false
+# Set to true to disable breadcrumb navigation.
+breadcrumb_disable = false
+# Set to false if you don't want to display a logo (/assets/icons/logo.svg) in the top nav bar
+navbar_logo = true
+
+# Adds a H2 section titled "Feedback" to the bottom of each doc. The responses are sent to Google Analytics as events.
+# This feature depends on [services.googleAnalytics] and will be disabled if "services.googleAnalytics.id" is not set.
+# If you want this feature, but occasionally need to remove the "Feedback" section from a single page,
+# add "hide_feedback: true" to the page's front matter.
+[params.ui.feedback]
+enable = true
+# The responses that the user sees after clicking "yes" (the page was helpful) or "no" (the page was not helpful).
+yes = 'Glad to hear it! Please tell us how we can improve.'
+no = 'Sorry to hear that. Please tell us how we can improve.'
+
+[params.links]
+# End user relevant links. These will show up on left side of footer and in the community page if you have one.
+[[params.links.user]]
+ name = "User mailing list"
+ url = "https://example.org/mail"
+ icon = "fa fa-envelope"
+ desc = "Discussion and help from your fellow users"
+[[params.links.user]]
+ name ="Twitter"
+ url = "https://example.org/twitter"
+ icon = "fab fa-twitter"
+ desc = "Follow us on Twitter to get the latest news!"
+[[params.links.user]]
+ name = "Stack Overflow"
+ url = "https://example.org/stack"
+ icon = "fab fa-stack-overflow"
+ desc = "Practical questions and curated answers"
+# Developer relevant links. These will show up on right side of footer and in the community page if you have one.
+[[params.links.developer]]
+ name = "GitHub"
+ url = "https://github.com/google/docsy"
+ icon = "fab fa-github"
+ desc = "Development takes place here!"
+[[params.links.developer]]
+ name = "Slack"
+ url = "https://example.org/slack"
+ icon = "fab fa-slack"
+ desc = "Chat with other project developers"
+[[params.links.developer]]
+ name = "Developer mailing list"
+ url = "https://example.org/mail"
+ icon = "fa fa-envelope"
+ desc = "Discuss development issues around the project"
+
+
diff --git a/website/themes/docsy/userguide/content/en/_index.html b/website/themes/docsy/userguide/content/en/_index.html
new file mode 100644
index 00000000..b7069c9a
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/_index.html
@@ -0,0 +1,45 @@
++++
+title = "Docsy"
+linkTitle = "Docsy"
+
++++
+
+{{< blocks/cover title="Welcome to Docsy!" image_anchor="top" height="full" color="orange" >}}
+
A Hugo theme for creating great technical documentation sites
+
+ {{< blocks/link-down color="info" >}}
+
+
+{{< /blocks/cover >}}
+
+
+{{% blocks/lead color="primary" %}}
+Docsy is a theme for the Hugo static site generator that's specifically designed for technical documentation sets. Our aim is to help you get a working documentation site up and running as easily as possible, so you can concentrate on creating great content for your users.
+{{% /blocks/lead %}}
+
+{{< blocks/section color="dark" type="features">}}
+{{% blocks/feature icon="fa-lightbulb" title="See Docsy in action!" url="/docs/examples/" %}}
+As well as our example site, there's a growing number of projects using Docsy for their doc sites.
+{{% /blocks/feature %}}
+
+
+{{% blocks/feature icon="fab fa-github" title="Contributions welcome!" url="https://github.com/google/docsy" %}}
+We do a [Pull Request](https://github.com/google/docsy/pulls) contributions workflow on **GitHub**. New users are always welcome!
+{{% /blocks/feature %}}
+
+
+{{% blocks/feature icon="fab fa-twitter" title="Follow us on Twitter!" url="https://twitter.com/[something]" %}}
+Find out about new features and how our users are using Docsy.
+{{% /blocks/feature %}}
+
+
+{{< /blocks/section >}}
+
diff --git a/website/themes/docsy/userguide/content/en/about/_index.md b/website/themes/docsy/userguide/content/en/about/_index.md
new file mode 100644
index 00000000..be60ce8f
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/about/_index.md
@@ -0,0 +1,137 @@
+---
+title: About Docsy
+linkTitle: About
+menu:
+ main:
+ weight: 10
+layout: docs
+---
+
+{{% blocks/cover title="About Docsy" height="auto" %}}
+
+Docsy is a pre-configured Hugo theme that provides the core features and behaviors needed to create a technical documentation site. Use Docsy to set up your documentation website, including an optional Blog section, and then spend your time focusing on authoring technical content. Depending on how you choose to configure Docsy and whether you use a hosting service that supports continuous builds, you can even just add your Markdown or HTML content file into a folder on your source repository, and then sit back while it automatically gets added to your site - complete with updated menus.
+
+Read on to find out more, or visit our [documentation](/docs/) to get started!
+{{% /blocks/cover %}}
+
+{{% blocks/section type="section" color="primary" %}}
+## So what’s a technical documentation site?
+
+A technical documentation site is a website that your users can visit to find the documentation for your technical project. Your documentation set contains all the information you think your users might need to engage with your project, from overviews that help them understand what the project is for, to instructions for specific tasks. Depending on the size of the project, a documentation set can be a page or two or an entire “book” with different types of information.
+
+**Most users don’t want to have to spend much time looking at docs - they want to try your great project!** So how do you make sure your technical documentation set gives users what they need to easily understand your project and get things done? We think a good technical documentation set should be:
+
+* **Reliable**: Is it true?
+* **Comprehensive**: Does it have all the information your target users might need?
+* **Well-organized and navigable**: Can the user find the information they need? Are similar types of information (all the information about a feature, all your reference information) grouped together?
+
+If you have users around the world, you might also want to provide your content in multiple languages, and if you have an open source project, you’ll probably want your users to be able to contribute to the docs.
+
+Once you have your content, you use a technical documentation site to publish your technical documentation set online for your users. In addition to your documentation, your site might also contain material like contact information, a blog, or information about how to contribute to the project.
+{{% /blocks/section %}}
+
+{{% blocks/section type="section" color="white" %}}
+## How does Docsy help?
+
+Particularly when working with open source projects, it can be difficult to figure out how to turn all your product knowledge into a website that helps and engages your users. **Enter Docsy!**
+
+Docsy gives you a theme for the [Hugo](https://gohugo.io/) static site generator, an established open source tool that builds ready-to-serve websites from a set of theme and content files. The Docsy theme provides you with useful stuff for a technical documentation site that *isn’t* your own content:
+
+
+
+
Page layouts optimized for different content types
+
+
Navigation, page menus, headers, landing pages, blog snippets, feedback links - you just provide the content.
+
+
+
+
Autogenerated navigation
+
+
Organize your docs in logical folders and get instantly updated navigation to help your users find them.
+
+
+
+
Language switchers
+
+
Builds on Hugo’s multi-language support to make it easy to create a site in multiple languages.
+
+
+
+
Feedback, contribution, and contact links
+
+
Let your users file issues and edit docs with a single click, or follow contact links to join you on Slack, Twitter, or mailing lists.
+
+
+
+
Custom shortcodes
+
+
Reusable snippets of HTML you can use to create alerts, image boxes, landing page blocks, and more.
+
+
+
+
Easy customization
+
+
Use the theme as-is for a basic, clean design, or update a file or two to get your own look.
+
+
+
+
Simple previews and deployment
+
+
Because Docsy is a Hugo theme, you get all the advantages of building with Hugo - simple, fast local previews, and, depending on your deployment options, continuous deployment from Github or other Git providers.
+
+
+
+
+### Simple authoring and publishing
+
+Author your content in the Markdown or HTML and then immediately test it with Hugo's local server. Once you are ready to
+publish, add that content to your project and deploy it to your site using any of Hugo’s supported options.
+[Learn more...](/docs/deployment/)
+
+### Built-in integration with common tools
+
+The Docsy template currently includes built-in integration with the following tools:
+
+* [**GitHub**](https://github.com): Get in-page links directly to your GitHub repo and provide your users with a
+ convenient pathway to providing feedback, opening issues, and even suggesting changes through Pull Requests.
+* [**Google Analytics**](https://analytics.google.com/analytics/web/): Easily connect your Google Analytics account to your
+ site.
+* [**Google Custom Search**](https://cse.google.com/cse/): Use Google Custom Search for in-site search queries, or
+ configure your site to search the web.
+
+### Make it your own
+
+You can configure the Docsy theme as much or as little as you like, anything from changing the colours and images to adding your own type of page layout. [Learn more...](docs/adding-content/lookandfeel/)
+
+### Get organized
+
+We believe a well-organized documentation set can really help your users find the information they need, when they need it - whether it’s a “Hello World” tutorial when they’re starting out or a single core task they need to do to finish a complicated app. We also believe that having well-organized docs help you create comprehensive docs, as it’s easier to see when you’re missing something important. [Learn more...](/docs/organizing/)
+
+Docsy also provides autogenerated site navigation based on how you organize your source files, so once you’ve organized your docs in folders in Github or other source control, you’ve got menus for your users to quickly reach the doc they need. [Learn more...](/docs/adding-content/navigation/)
+
+
+### Keep up to date
+
+Spend time setting up your technical documentation site once, and then focus on what you do best. We work closely with
+the Hugo team and have individuals actively maintaining the Docsy theme. You can easily get and
+apply Docsy updates to your site, as well as open feature requests to improve the
+template, or even add new behaviors. [Learn more...](/docs/updating/)
+
+
+### Focus on great content
+
+Because Docsy helps you create and serve a well-organized, navigable technical documentation set, it frees you up to create and maintain great reliable, comprehensive content that your users can enjoy and trust.
+{{% /blocks/section %}}
+{{% blocks/section type="section" color="primary" %}}
+## What's next for Docsy?
+
+Docsy is an open source project and we love getting patches and contributions to make Docsy and its docs even better. We hope to continue to make improvements to the theme along with the Docsy community.
+
+Visit our [Issues](https://github.com/google/docsy/issues) to see what we're currently working on. If there's something you'd like to see in Docsy, please create an issue yourself - or assign yourself an issue if you'd like to fix or add something! See our [contribution guidelines](/docs/contribution-guidelines/) for more information.
+
+You can find out how to update your site to the latest version of Docsy in [Keeping the theme up to date](/docs/updating/).
+{{% /blocks/section %}}
+
+
+
+
diff --git a/website/themes/docsy/userguide/content/en/about/featured-background.jpg b/website/themes/docsy/userguide/content/en/about/featured-background.jpg
new file mode 100644
index 00000000..c9d8846d
Binary files /dev/null and b/website/themes/docsy/userguide/content/en/about/featured-background.jpg differ
diff --git a/website/themes/docsy/userguide/content/en/community/_index.md b/website/themes/docsy/userguide/content/en/community/_index.md
new file mode 100644
index 00000000..cdade163
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/community/_index.md
@@ -0,0 +1,8 @@
+---
+title: Community
+menu:
+ main:
+ weight: 40
+---
+
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/Shortcodes/index.md b/website/themes/docsy/userguide/content/en/docs/Adding content/Shortcodes/index.md
new file mode 100644
index 00000000..cbccd4d3
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Adding content/Shortcodes/index.md
@@ -0,0 +1,226 @@
+---
+title: "Docsy Shortcodes"
+linkTitle: "Docsy Shortcodes"
+date: 2017-01-05
+weight: 5
+description: >
+ Use Docsy's Hugo shortcodes to quickly build site pages.
+resources:
+- src: "**spruce*.jpg"
+ params:
+ byline: "Photo: Bjørn Erik Pedersen / CC-BY-SA"
+---
+
+Rather than writing all your site pages from scratch, Hugo lets you define and use [shortcodes](https://gohugo.io/content-management/shortcodes/). These are reusable snippets of content that you can include in your pages, often using HTML to create effects that are difficult or impossible to do in simple Markdown. Shortcodes can also have parameters that let you, for example, add your own text to a fancy shortcode text box. As well as Hugo's [built-in shortcodes](https://gohugo.io/content-management/shortcodes/), Docsy provides some shortcodes of its own to help you build your pages.
+
+## Shortcode blocks
+
+The theme comes with a set of custom **Page Block** shortcodes that can be used to compose landing pages, about pages, and similar.
+
+These blocks share some common parameters:
+
+height
+: A pre-defined height of the block container. One of `min`, `med`, `max`, `full`, or `auto`. Setting it to `full` will fill the Viewport Height, which can be useful for landing pages.
+
+color
+: The block will be assigned a color from the theme palette if not provided, but you can set your own if needed. You can use all of Bootstrap's color names, theme color names or a grayscale shade. Some examples would be `primary`, `white`, `dark`, `warning`, `light`, `success`, `300`, `blue`, `orange`. This will become the **background color** of the block, but text colors will adapt to get proper contrast.
+
+### blocks/cover
+
+The **blocks/cover** shortcode creates a landing page type of block that fills the top of the page.
+
+```html
+{{* blocks/cover title="Welcome!" image_anchor="center" height="full" color="primary" */>}}
+
+{{* /blocks/cover */>}}
+```
+
+Note that the relevant shortcode parameters above will have sensible defaults, but is included here for completeness.
+
+{{% alert title="Hugo Tip" %}}
+> Using the bracket styled shortcode delimiter, `>}}`, tells Hugo that the inner content is HTML/plain text and needs no further processing. Changing the delimiter to `%}}` means Hugo will treat the content as Markdown. You can use both styles in your pages.
+{{% /alert %}}
+
+
+| Parameter | Default | Description |
+| ---------------- |------------| ------------|
+| title | | The main display title for the block. |
+| image_anchor | |
+| height | | See above.
+| color | | See above.
+
+
+To set the background image, place an image with the word "background" in the name in the page's [Page Bundle](/docs/adding-content/content/#page-bundles). For example, in our the example site the background image in the home page's cover block is [`featured-background.jpg`](https://github.com/google/docsy-example/tree/master/content/en), in the same directory.
+
+{{% alert title="Tip" %}}
+If you also include the word **featured** in the image name, e.g. `my-featured-background.jpg`, it will also be used as the Twitter Card image when shared.
+{{% /alert %}}
+
+For available icons, see [Font Awesome](https://fontawesome.com/icons?d=gallery&m=free).
+
+### blocks/lead
+
+The **blocks/lead** block shortcode is a simple lead/title block with centred text and an arrow down pointing to the next section.
+
+```go-html-template
+{{%/* blocks/lead color="dark" */%}}
+TechOS is the OS of the future.
+
+Runs on **bare metal** in the **cloud**!
+{{%/* /blocks/lead */%}}
+```
+
+| Parameter | Default | Description |
+| ---------------- |------------| ------------|
+| height | | See above.
+| color | | See above.
+
+### blocks/section
+
+The **blocks/section** shortcode is meant as a general-purpose content container. It comes in two "flavors", one for general content and one with styling more suitable for wrapping a horizontal row of feature sections.
+
+The example below shows a section wrapping 3 feature sections.
+
+
+```go-html-template
+{{* blocks/section color="dark" */>}}
+{{%/* blocks/feature icon="fa-lightbulb" title="Fastest OS **on the planet**!" */%}}
+The new **TechOS** operating system is an open source project. It is a new project, but with grand ambitions.
+Please follow this space for updates!
+{{%/* /blocks/feature */%}}
+{{%/* blocks/feature icon="fab fa-github" title="Contributions welcome!" url="https://github.com/gohugoio/hugo" */%}}
+We do a [Pull Request](https://github.com/gohugoio/hugo/pulls) contributions workflow on **GitHub**. New users are always welcome!
+{{%/* /blocks/feature */%}}
+{{%/* blocks/feature icon="fab fa-twitter" title="Follow us on Twitter!" url="https://twitter.com/GoHugoIO" */%}}
+For announcement of latest features etc.
+{{%/* /blocks/feature */%}}
+{{* /blocks/section */>}}
+```
+
+| Parameter | Default | Description |
+| ---------------- |------------| ------------|
+| height | | See above.
+| color | | See above.
+| type | | Specify "section" if you want a general container, omit this parameter if you want this section to contain a horizontal row of features.
+
+### blocks/feature
+
+```go-html-template
+
+{{%/* blocks/feature icon="fab fa-github" title="Contributions welcome!" url="https://github.com/gohugoio/hugo" */%}}
+We do a [Pull Request](https://github.com/gohugoio/hugo/pulls) contributions workflow on **GitHub**. New users are always welcome!
+{{%/* /blocks/feature */%}}
+
+```
+
+| Parameter | Default | Description |
+| ---------------- |------------| ------------|
+| title | | The title to use.
+| url | | The URL to link to.
+| icon | | The icon class to use.
+
+
+### blocks/link-down
+
+The **blocks/link-down** shortcode creates a navigation link down to the next section. It's meant to be used in combination with the other blocks shortcodes.
+
+```go-html-template
+
+
+ {{* blocks/link-down color="info" */>}}
+
+```
+
+| Parameter | Default | Description |
+| ---------------- |------------| ------------|
+| color | info | See above.
+
+## Shortcode helpers
+
+### alert
+
+The **alert** shortcode creates an alert block that can be used to display notices or warnings.
+
+```go-html-template
+{{%/* alert title="Warning" color="warning" */%}}
+This is a warning.
+{{%/* /alert */%}}
+
+```
+
+Renders to:
+
+{{% alert title="Warning" color="warning" %}}
+This is a warning.
+{{% /alert %}}
+
+| Parameter | Default | Description |
+| ---------------- |------------| ------------|
+| color | primary | One of the theme colors, eg `primary`, `info`, `warning` etc.
+
+### pageinfo
+
+The **pageinfo** shortcode creates a text box that you can use to add banner information for a page: for example, letting users know that the page contains placeholder content, that the content is deprecated, or that it documents a beta feature.
+
+```go-html-template
+{{%/* pageinfo color="primary" */%}}
+This is placeholder content.
+{{%/* /pageinfo */%}}
+
+```
+
+Renders to:
+
+{{% pageinfo color="primary" %}}
+This is placeholder content
+{{% /pageinfo %}}
+
+| Parameter | Default | Description |
+| ---------------- |------------| ------------|
+| color | primary | One of the theme colors, eg `primary`, `info`, `warning` etc.
+
+
+### imgproc
+
+The **imgproc** shortcode finds an image in the current [Page Bundle](/docs/adding-content/content/#page-bundles) and scales it given a set of processing instructions.
+
+
+```go-html-template
+{{* imgproc spruce Fill "400x450" */>}}
+Norway Spruce Picea abies shoot with foliage buds.
+{{* /imgproc */>}}
+```
+
+{{< imgproc spruce Fill "400x450" >}}
+Norway Spruce Picea abies shoot with foliage buds.
+{{< /imgproc >}}
+
+The example above has also a byline with photo attribution added. When using illustrations with a free license from [WikiMedia](https://commons.wikimedia.org/) and simlilar, you will in most situations need a way to attribute the author or licensor. You can add metadata to your page resources in the page front matter. The `byline` param is used by convention in this theme:
+
+
+```yaml
+resources:
+- src: "**spruce*.jpg"
+ params:
+ byline: "Photo: Bjørn Erik Pedersen / CC-BY-SA"
+```
+
+
+| Parameter | Description |
+| ----------------: |------------|
+| 1 | The image filename or enough of it to identify it (we do Glob matching)
+| 2 | Command. One of `Fit`, `Resize` or `Fill`. See [Image Processing Methods](https://gohugo.io/content-management/image-processing/#image-processing-methods).
+| 3 | Processing options, e.g. `400x450`. See [Image Processing Options](https://gohugo.io/content-management/image-processing/#image-processing-methods).
+
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/Shortcodes/spruce.jpg b/website/themes/docsy/userguide/content/en/docs/Adding content/Shortcodes/spruce.jpg
new file mode 100644
index 00000000..8ba2188b
Binary files /dev/null and b/website/themes/docsy/userguide/content/en/docs/Adding content/Shortcodes/spruce.jpg differ
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/_index.md b/website/themes/docsy/userguide/content/en/docs/Adding content/_index.md
new file mode 100644
index 00000000..05ee9534
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Adding content/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Content and Customization"
+linkTitle: "Content and Customization"
+weight: 3
+description: >
+ How to add content to and customize your Docsy site.
+---
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/content.md b/website/themes/docsy/userguide/content/en/docs/Adding content/content.md
new file mode 100644
index 00000000..a725deeb
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Adding content/content.md
@@ -0,0 +1,250 @@
+---
+title: "Adding Content"
+linkTitle: "Adding Content"
+weight: 1
+description: >
+ Add different types of content to your Docsy site.
+---
+
+So you've got a new Hugo website with Docsy, now it's time to add some content! This page tells you how to use the theme to add and structure your site content.
+
+## Content sections and templates
+
+Hugo builds your site pages using the content files you provide plus any templates provided by your site's theme. These templates (or *"layouts"* in Hugo terminology) include things like your page's headers, footers, navigation, and links to stylesheets: essentially, everything except your page's specific content. The templates in turn can be made up of *partials*: little reusable snippets of HTML for page elements like headers, search boxes, and more.
+
+Because most technical documentation sites have different sections for different types of content, the Docsy theme comes with the following templates for top-level site sections that you might need:
+
+* `docs` is for pages in your site's Documentation section.
+* `blog` is for pages in your site's Blog.
+* `community` is for your site's Community page.
+
+It also provides a default "landing page" type of template with the site header and footer, but no left nav, that you can use for any other section: in our example site it's used for the site home page and the About page.
+
+Each top-level section in your site corresponds to a directory in your site content root (typically `content/` or `content/en/`). Hugo automatically applies the appropriate template depending on which section folder the content is in, though you can override this by explicitly specifying a template or content type for a particular page. For example, this page is in the `docs` subdirectory of the site's content root directory `content/en/`, so Hugo automatically applies the `docs` template. If you've copied the example site, you already have appropriately named top-level section directories for using Docsy's templates, each with an index page ( `_index.md` or `index.html`) page for users to land on. These top-level sections also appear in the example site's [top-level menu](/docs/adding-content/navigation/#top-level-menu).
+
+### Custom sections
+
+If you've copied the example site and *don't* want to use one of the provided content sections, just delete the appropriate content subdirectory. Similarly, if you want to add a top-level section, just add a new subdirectory, though you'll need to specify the layout or content type explicitly in the [frontmatter](#page-frontmatter) of each page if you want to use any existing Docsy template other than the default one. For example, if you create a new directory `content/en/`**`amazing`** and want one or more pages in that custom section to use Docsy's `docs` template, you add `layout: docs` to the frontmatter of each page:
+
+```yaml
+---
+title: "My amazing new section"
+weight: 1
+layout: docs
+description: >
+ A special section with a docs layout.
+---
+```
+
+Alternatively, create your own page template for your new section in your project's `layouts` directory based on one of the existing templates.
+
+You can find out much more about how Hugo page layouts work in [Hugo Templates](https://gohugo.io/templates/). The rest of this page tells you about how to add content and use each of Docsy's templates.
+
+## Page frontmatter
+
+Each page file in a Hugo site has metadata frontmatter that tells Hugo about the page. You specify page frontmatter in TOML, YAML, or JSON (our example site and this site use YAML). Use the frontmatter to specify the page title, description, creation date, link title, template, menu weighting, and even any resources such as images used by the page. You can see a complete list of possible page frontmatter in [Front Matter](https://gohugo.io/content-management/front-matter/).
+
+For example, here's the frontmatter for this page:
+
+```
+---
+title: "Adding Content"
+linkTitle: "Adding Content"
+weight: 1
+description: >
+ How to add content to your Docsy site.
+---
+```
+
+The minimum frontmatter you need to provide is a title: everything else is up to you! (though if you leave out the page weight your [navigation](/docs/adding-content/navigation) may get a little disorganized).
+
+
+## Page contents and markup
+
+By default you create pages in a Docsy site as simple [Markdown or HTML files](https://gohugo.io/content-management/formats/) with [page frontmatter](#page-frontmatter), as described above. Hugo currently uses [BlackFriday](https://github.com/russross/blackfriday) as its default Markdown parser.
+
+In addition to your marked-up text, you can also use Hugo and Docsy's [shortcodes](/docs/adding-content/shortcodes): reusable chunks of HTML that you can use to quickly build your pages. Find out more about shortcodes in [Docsy Shortcodes](/docs/adding-content/shortcodes).
+
+{{% alert title="Note" color="info" %}}
+Hugo also supports adding content using other markups using [external parsers as helpers](https://gohugo.io/content-management/formats/#additional-formats-through-external-helpers). For example, you can add content in RST using `rst2html` as an external parser (though be aware this does not support all flavors of RST, such as Sphinx RST). Similarly, you can use `asciidoctor` to parse Asciidoc files, or `pandoc` for other formats.
+
+External parsers may not be suitable for use with all deployment options, as you'll need to install the external parser and run Hugo yourself to generate your site (so, for example, you won't be able to use [Netlify's continuous deployment feature](/docs/deployment/#deployment-with-netlify)). In addition, adding an external parser may cause performance issues building larger sites.
+{{% /alert %}}
+
+### Working with links
+
+Hugo and Blackfriday let you specify links using normal Markdown syntax, though remember that you need to specify links relative to your site's root URL, and that relative URLs are left unchanged by Hugo in your site's generated HTML.
+
+Alternatively you can use Hugo's helper [`ref` and `relref` shortcodes](https://gohugo.io/content-management/cross-references/) for creating internal links that resolve to the correct URL. However, be aware this means your links will not appear as links at all if a user views your page outside your generated site, for example using the rendered Markdown feature in GitHub's web UI.
+
+You can find (or add!) tips and gotchas for working with Hugo links in [Hugo Tips](/docs/best-practices/site-guidance).
+
+### Content style
+
+We don't mandate any particular style for your page contents. However, if you'd like some guidance on how to write and format clear, concise technical documentation, we recommend the [Google Developer Documentation Style Guide](https://developers.google.com/style/), particularly the [Style Guide Highlights](https://developers.google.com/style/highlights).
+
+## Page bundles
+
+You can create site pages as standalone files in their section or subsection directory, or as folders where the content is in the folder's index page. Creating a folder for your page lets you [bundle](https://gohugo.io/content-management/page-bundles/) images and other resources together with the content.
+
+You can see examples of both approaches in this and our example site. For example, the source for this page is just a standalone file `/content/en/docs/adding-content.md`. However the source for [Docsy Shortcodes](/docs/adding-content/shortcodes/) in this site lives in `/content/en/docs/adding-content/shortcodes/index.md`, with the image resource used by the page in the same `/shortcodes/` directory. In Hugo terminology, this is called a *leaf bundle* because it's a folder containing all the data for a single site page without any child pages (and uses `index.md` without an underscore).
+
+You can find out much more about managing resources with Hugo bundles in [Page Bundles](https://gohugo.io/content-management/page-bundles/).
+
+## Adding docs and blog posts
+
+The template you'll probably use most often is the [`docs` template](https://github.com/google/docsy/blob/master/layouts/docs/baseof.html) (as used in this page) or the very similar [`blog` template](https://github.com/google/docsy/blob/master/layouts/blog/baseof.html). Both these templates include:
+
+* a left nav
+* GitHub links (populated from your site config) for readers to edit the page or create issues
+* a page menu
+
+as well as the common header and footer used by all your site's pages. Which template is applied depends on whether you've added the content to the `blog` or `docs` content directory. You can find out more about how the nav and page menu are created in [Navigation and Search](/docs/adding-content/navigation/).
+
+### Organizing your documentation
+
+While Docsy's top-level sections let you create site sections for different types of content, you may also want to organize your docs content within your `docs` section. For example, this site's `docs` section directory has multiple subdirectories for **Getting Started**, **Content and Customization**, and so on. Each subdirectory has an `_index.md` (it could also be an `_index.html`), which acts as a section index page and tells Hugo that the relevant directory is a subsection of your docs.
+
+Docsy's `docs` layout gives you a left nav pane with an autogenerated nested menu based on your `docs` file structure. Each standalone page or subsection `_index.md` or `_index.html` page in the `docs/` directory gets a top level menu item, using the link name and `weight` metadata from the page or index.
+
+To add docs to a subsection, just add your page files to the relevant subdirectory. Any pages that you add to a subsection in addition to the subsection index page will appear in a submenu (look to the left to see one in action!), again ordered by page `weight`. Find out more about adding Docsy's navigation metadata in [Navigation and Search](/docs/adding-content/navigation/)
+
+If you've copied the example site, you'll already have some suggested subdirectories in your `docs` directory, with guidance for what types of content to put in them and some example Markdown pages. You can find out more about organizing your content with Docsy in [Organizing Your Content](/docs/organizing/).
+
+#### Docs section landing pages
+
+By default a docs section landing page (the `_index.md` or `_index.html` in the section directory) uses a layout that adds a formatted list of links to the pages in the section, with their frontmatter descriptions. The [Content and Customization](/docs/adding-content/) landing page in this site is a good example.
+
+To display a simple bulleted list of links to the section's pages instead, specify `simple_list: true` in the landing page's frontmatter:
+
+```
+---
+title: "Simple List Page"
+simple_list: true
+weight: 20
+---
+```
+
+To display no links at all, specify `no_list: true` in the landing page's frontmatter:
+
+```
+---
+title: "No List Page"
+no_list: true
+weight: 20
+---
+```
+
+### Organizing your blog posts
+
+Docsy's `blog` layout also gives you a left nav menu (like the `docs` layout), and a list-type index page for your blog that's applied to `/blog/_index.md` and automatically displays snippets of all your recent posts in reverse chronological order.
+
+To create different blog categories to organize your posts, create subfolders in `blog/`. For instance, in our [example site](https://github.com/google/docsy-example/tree/master/content/en/blog) we have `news` and `releases`. Each category needs to have its own `_index.md` or `_index.html` landing page file specifying the category title for it to appear properly in the left nav and top-level blog landing page. Here's the index page for `releases`:
+
+```
+---
+title: "New Releases"
+linkTitle: "Releases"
+weight: 20
+---
+```
+
+To add author and date information to blog posts, add them to the page frontmatter:
+
+```
+---
+date: 2018-10-06
+title: "Easy documentation with Docsy"
+linkTitle: "Announcing Docsy"
+description: "The Docsy Hugo theme lets project maintainers and contributors focus on content, not on reinventing a website infrastructure from scratch"
+author: Riona MacNamara
+resources:
+- src: "**.{png,jpg}"
+ title: "Image #:counter"
+ params:
+ byline: "Photo: Riona MacNamara / CC-BY-CA"
+---
+```
+
+If you've copied the example site and you don't want a blog section, or want to link to an external blog instead, just delete the `blog` subdirectory.
+
+
+## Working with top-level landing pages.
+
+Docsy's [default page template](https://github.com/google/docsy/blob/master/layouts/docs/baseof.html) has no left nav and is useful for creating a home page for your site or other "landing" type pages.
+
+### Customizing the example site pages
+
+If you've copied the example site, you already have a simple site landing page in `content/en/_index.html`. This is made up of Docsy's provided Hugo shortcode [page blocks](/docs/adding-content/shortcodes).
+
+To customize the large landing image, which is in a [cover](#blocks-cover) block, replace the `content/en/featured-background.jpg` file in your project with your own image (it can be called whatever you like as long as it has `background` in the file name). You can remove or add as many blocks as you like, as well as adding your own custom content.
+
+The example site also has an About page in `content/en/about/_index.html` using the same Docsy template. Again, this is made up of [page blocks](/docs/adding-content/shortcodes), including another background image in `content/en/about/featured-background.jpg`. As with the site landing page, you can replace the image, remove or add blocks, or just add your own content.
+
+### Building your own landing pages
+
+If you've just used the theme, you can still use all Docsy's provided [page blocks](/docs/adding-content/shortcodes) (or any other content you want) to build your own landing pages in the same file locations.
+
+## Adding a community page
+
+The `community` landing page template has boilerplate content that's automatically filled in with the project name and community links specified in `config.toml`, providing your users with quick links to resources that help them get involved in your project. The same links are also added by default to your site footer.
+
+```toml
+[params.links]
+# End user relevant links. These will show up on left side of footer and in the community page if you have one.
+[[params.links.user]]
+ name = "User mailing list"
+ url = "https://example.org/mail"
+ icon = "fa fa-envelope"
+ desc = "Discussion and help from your fellow users"
+[[params.links.user]]
+ name ="Twitter"
+ url = "https://example.org/twitter"
+ icon = "fab fa-twitter"
+ desc = "Follow us on Twitter to get the latest news!"
+[[params.links.user]]
+ name = "Stack Overflow"
+ url = "https://example.org/stack"
+ icon = "fab fa-stack-overflow"
+ desc = "Practical questions and curated answers"
+# Developer relevant links. These will show up on right side of footer and in the community page if you have one.
+[[params.links.developer]]
+ name = "GitHub"
+ url = "https://github.com/google/docsy"
+ icon = "fab fa-github"
+ desc = "Development takes place here!"
+[[params.links.developer]]
+ name = "Slack"
+ url = "https://example.org/slack"
+ icon = "fab fa-slack"
+ desc = "Chat with other project developers"
+[[params.links.developer]]
+ name = "Developer mailing list"
+ url = "https://example.org/mail"
+ icon = "fa fa-envelope"
+ desc = "Discuss development issues around the project"
+```
+
+If you're creating your own site and want to add a page using this template, add a `/community/_index.md` file in your content root directory. If you've copied the example site and *don't* want a community page, just delete the `/content/en/community/` directory in your project repo.
+
+## Adding static content
+
+You may want to serve some non-Hugo-built content along with your site: for example, if you have generated reference docs using Doxygen, Javadoc, or other doc generation tools.
+
+To add static content to be served "as-is", just add the content as a folder and/or files in your site's `static` directory. When your site is deployed, content in this directory is served at the site root path. So, for example, if you have added content at `/static/reference/cpp/`, users can access that content at `http://{server-url}/reference/cpp/` and you can link to pages in this directory from other pages at `/reference/cpp/{file name}`.
+
+You can also use this directory for other files used by your project, including image files. You can find out more about serving static files, including configuring multiple directories for static content, in [Static Files](https://gohugo.io/content-management/static-files/).
+
+## RSS feeds
+
+Hugo will, by default, create an RSS feed for the home page and any section. For the main RSS feed you can control which sections to include by setting a site param in your `config.toml`. This is the default configuration:
+
+```toml
+rss_sections = ["blog"]
+```
+To disable all RSS feeds, add the following to your `config.toml`:
+
+```toml
+disableKinds = ["RSS"]
+```
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/feedback.md b/website/themes/docsy/userguide/content/en/docs/Adding content/feedback.md
new file mode 100644
index 00000000..62df817c
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Adding content/feedback.md
@@ -0,0 +1,133 @@
+---
+title: "Analytics and User Feedback"
+date: 2019-06-05
+weight: 7
+description: >
+ Add Google Analytics tracking to your site, use the "was this page helpful?" widget data, disable the widget on a single
+ page or all pages, and change the response text.
+---
+
+## Adding Analytics
+
+The Docsy theme contains built-in support for [Google Analytics](https://analytics.google.com/analytics/web/) via Hugo's [internal template](https://gohugo.io/templates/internal/#google-analytics), which is included in the theme. Once you set Analytics up as described below, usage information for your site (such as page views) is sent to your Google Analytics account.
+
+### Setup
+
+1. Ensure you have [set up a Google Analytics property](https://support.google.com/analytics/answer/1042508) for your site: this gives you an Analytics ID to add to your config, which Docsy in turn adds to all your site's pages.
+1. Open `config.toml`.
+1. Enable Google Analytics by setting the Tracking ID property to your site's Analytics ID.
+
+ [services.googleAnalytics]
+ id = "UA-00000000-0"
+
+1. Save and close `config.toml`.
+1. Ensure that your site is built with `HUGO_ENV="production"`, as Docsy only adds Analytics tracking to production-ready sites. You can specify this variable as a command line flag to Hugo:
+
+ ```
+ $ env HUGO_ENV="production" hugo
+ ```
+
+ Alternatively, if you're using Netlify, you can specify it as a Netlify [deployment setting](https://www.netlify.com/docs/continuous-deployment/#build-environment-variables) in `netlify.toml` or the Netlify UI, along with the Hugo version.
+
+
+## User Feedback
+
+By default Docsy puts a "was this page helpful?" feedback widget at the bottom of every
+documentation page, as shown in Figure 1.
+
+
+
+ Figure 1. The feedback widget, outlined in red
+
+
+After clicking **Yes** the user should see a response like Figure 2. You can configure the
+response text in `config.toml`.
+
+
+
+
+ Figure 2. An example Yes response
+
+
+
+### How is this data useful?
+
+When you have a lot of documentation, and not enough time to update it all, you can use the
+"was this page helpful?" feedback data to help you decide which pages to prioritize. In general,
+start with the pages with a lot of pageviews and low ratings. "Low ratings" in this context
+means the pages where users are clicking **No** --- the page wasn't helpful --- more often than
+**Yes** --- the page was helpful. You can also study your highly-rated pages to develop hypotheses
+around why your users find them helpful.
+
+In general, you can develop more certainty around what patterns your users find helpful or
+unhelpful if you introduce isolated changes in your documentation whenever possible. For example,
+suppose that you find a tutorial that no longer matches the product. You update the instructions,
+check back in a month, and the score has improved. You now have a correlation between up-to-date
+instructions and higher ratings. Or, suppose you study your highly-rated pages and discover that
+they all start with code samples. You find 10 other pages with their code samples at the bottom,
+move the samples to the top, and discover that each page's score has improved. Since
+this was the only change you introduced on each page, it's more reasonable to believe that
+your users find code samples at the top of pages helpful. The scientific method, applied to
+technical writing, in other words!
+
+### Setup
+
+1. Open `config.toml`.
+1. Ensure that Google Analytics is enabled, as described [above](#setup).
+1. Set the response text that users see after clicking **Yes** or **No**.
+
+ [params.ui.feedback]
+ enable = true
+ yes = 'Glad to hear it! Please tell us how we can improve.'
+ no = 'Sorry to hear that. Please tell us how we can improve.'
+1. Save and close `config.toml`.
+
+### Access the feedback data
+
+This section assumes basic familiarity with Google Analytics. For example, you should know how
+to check pageviews over a certain time range and navigate between accounts if you have access to
+multiple documentation sites.
+
+1. Open Google Analytics.
+1. Open **Behavior** > **Events** > **Overview**.
+1. In the **Event Category** table click the **Helpful** row. Click **view full report** if
+ you don't see the **Helpful** row.
+1. Click **Event Label**. You now have a page-by-page breakdown of ratings.
+
+Here's what the 4 columns represent:
+
+* **Total Events** is the total number of times that users clicked *either* **Yes** or **No**.
+* **Unique Events** provides a rough indication of how frequenly users are rating your pages per
+ session. For example, suppose your **Total Events** is 5000, and **Unique Events** is 2500.
+ This means that you have 2500 users who are rating 2 pages per session.
+* **Event Value** isn't that useful.
+* **Avg. Value** is the aggregated rating for that page. The value is always between 0
+ and 1. When users click **No** a value of 0 is sent to Google Analytics. When users click
+ **Yes** a value of 1 is sent. You can think of it as a percentage. If a page has an
+ **Avg. Value** of 0.67, it means that 67% of users clicked **Yes** and 33% clicked **No**.
+
+[events]: https://developers.google.com/analytics/devguides/collection/analyticsjs/events
+[PR]: https://github.com/google/docsy/pull/1/files
+
+The underlying Google Analytics infrastructure that stores the "was this page helpful?" data is
+called [Events][events]. See [docsy pull request #1][PR] to see exactly
+what happens when a user clicks **Yes** or **No**. It's just a `click` event listener that
+fires the Google Analytics JavaScript function for logging an Event, disables the **Yes** and
+**No** buttons, and shows the response text.
+
+### Disable feedback on a single page
+
+Add `hide_feedback: true` to the page's front matter.
+
+### Disable feedback on all pages
+
+Set `params.ui.feedback.enable` to `false` in `config.toml`:
+
+ [params.ui.feedback]
+ enable = false
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/iconsimages.md b/website/themes/docsy/userguide/content/en/docs/Adding content/iconsimages.md
new file mode 100644
index 00000000..b54aeecd
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Adding content/iconsimages.md
@@ -0,0 +1,75 @@
+---
+title: "Logos and Images"
+linkTitle: "Logos and Images"
+date: 2017-01-05
+weight: 6
+description: >
+ Add and customize logos, icons, and images in your project.
+---
+
+## Add your logo
+
+Add your project logo as `assets/icons/logo.svg` in your project. This overrides the default Docsy logo in the theme. If you don't want a project logo, set `navbar_logo` to `false` (or delete the variable) in your `config.toml`:
+
+```
+navbar_logo = false
+```
+
+If you decide at a later stage that you'd like to add a logo to your navbar, you can set the parameter to `true`:
+
+```
+navbar_logo = true
+```
+
+{{% alert title="Tip" %}}
+Your logo is included in the default Docsy navbar as an inline SVG with the following CSS styling (from [`_nav.scss`](https://github.com/google/docsy/blob/master/assets/scss/_nav.scss)):
+
+```
+svg {
+ display: inline-block;
+ margin: 0 10px;
+ height: 30px;
+}
+```
+
+To ensure your logo displays correctly, you may want to resize it, ensure it doesn't have height and width attributes so that its size is fully responsive, or override the default styling with your own CSS.
+{{% /alert %}}
+
+## Add your favicons
+
+The easiest way to do this is to create a set of favicons via http://cthedot.de/icongen (which lets you create a huge range of icon sizes and options from a single image) and/or https://favicon.io/, and put them in your site project's `static/favicons` directory. This will override the default favicons from the theme.
+
+Note that https://favicon.io/ doesn't create as wide a range of sizes as Icongen but *does* let you quickly create favicons from text: if you want to create text favicons you can use this site to generate them, then use Icongen to create more sizes (if necessary) from your generated `.png` file.
+
+If you have special favicon requirements, you can create your own `layouts/partials/favicons.html` with your links.
+
+## Add images
+
+### Landing pages
+
+Docsy's [`blocks/cover` shortcode](/docs/adding-content/shortcodes/#blocks-cover) make it easy to add large cover images to your landing pages. The shortcode looks for an image with the word "background" in the name inside the landing page's [Page Bundle](https://gohugo.io/content-management/page-bundles/) - so, for example, if you've copied the example site, the landing page image in `content/en/_index.html` is `content/en/featured-background.jpg`.
+
+You specify the preferred display height of a cover block container (and hence its image) using the block's `height` parameter. For a full viewport height, use `full`:
+
+```html
+{{* blocks/cover title="Welcome to the Docsy Example Project!" image_anchor="top" height="full" color="orange" */>}}
+...
+{{* /blocks/cover */>}}
+```
+
+For a shorter image, as in the example site's About page, use one of `min`, `med`, `max` or `auto` (the actual height of the image):
+
+```html
+{{* blocks/cover title="About the Docsy Example" image_anchor="bottom" height="min" */>}}
+...
+{{* /blocks/cover */>}}
+```
+
+### Other pages
+
+To add inline images to other pages, use the [`imgproc` shortcode](/docs/adding-content/shortcodes/#imgproc). Alternatively, if you prefer, just use regular Markdown or HTML images and add your image files to your project's `static` directory. You can find out more about using this directory in [Adding static content](/docs/adding-content/content/#adding-static-content).
+
+## Images used on this site
+
+Images used as background images in this site are in the [public domain](https://commons.wikimedia.org/wiki/User:Bep/gallery#Wed_Aug_01_16:16:51_CEST_2018) and can be used freely. The porridge image in the example site is by iha31 from Pixabay
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/lookandfeel.md b/website/themes/docsy/userguide/content/en/docs/Adding content/lookandfeel.md
new file mode 100644
index 00000000..d104805d
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Adding content/lookandfeel.md
@@ -0,0 +1,127 @@
+---
+title: "Look and Feel"
+linkTitle: "Look and Feel"
+date: 2017-01-05
+weight: 2
+description: >
+ Customize colors, fonts, and more for your site.
+---
+
+By default, a site using Docsy has the theme's default fonts, colors, and general look and feel. However, if you want your own color scheme (and you probably will!) you can very easily override the theme defaults with your own project-specific values - Hugo will look in your project files first when looking for information to build your site. Also because Docsy uses Bootstrap 4 and SCSS for styling, you can override just single values in its special SCSS project variables file, or do more serious customization by creating your own versions of entire SCSS files.
+
+## Color palette and other styles
+
+To quickly change your site's colors, add SCSS variable project overrides to `assets/scss/_variables_project.scss`. A simple example changing the primary and secondary color to two shades of purple:
+
+```scss
+$primary: #390040;
+$secondary: #A23B72;
+```
+
+* See `assets/scss/_variables.scss` in the theme for color variables etc. that can be set to change the look and feel.
+* Also see available variables in Bootstrap 4: https://getbootstrap.com/docs/4.0/getting-started/theming/ and https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss
+
+The theme has features suchs as rounded corners and gradient backgrounds enabled by default. These can also be toggled in your project variables file:
+
+```scss
+$enable-gradients: true;
+$enable-rounded: true;
+$enable-shadows: true;
+```
+
+{{% alert title="Tip" %}}
+PostCSS (autoprefixing of CSS browser-prefixes) is not enabled when running in server mode (it is a little slow), so Chrome is the recommended choice for development.
+{{% /alert %}}
+
+Also note that any SCSS import will try the project before the theme, so you can -- as one example -- create your own `_assets/scss/_content.scss` and get full control over how your Markdown content is styled.
+
+## Fonts
+
+The theme uses [Open Sans](https://fonts.google.com/specimen/Open+Sans) as its primary font. To disable Google Fonts and use a system font, set this SCSS variable in `assets/scss/_variables_project.scss`:
+
+```scss
+$td-enable-google-fonts: false;
+```
+
+To configure another Google Font:
+
+```scss
+$google_font_name: "Open Sans";
+$google_font_family: "Open+Sans:300,300i,400,400i,700,700i";
+```
+
+Note that if you decide to go with a font with different weights (in the built-in configuration this is `300` (light), `400` (medium) and `700` (bold)), you also need to adjust the weight related variables, i.e. variables starting with `$font-weight-`.
+
+## CSS utilities
+
+For documentation of available CSS utility classes, see the [Bootstrap Documentation](https://getbootstrap.com/). This theme adds very little on its own in this area. However, we have added some some color state CSS classes that can be useful in a dynamic context:
+
+* `.-bg-`
+* `.-text-`
+
+You can use these classes, for example, to style your text in an appropriate color when you don't know if the `primary` color is dark or light, to ensure proper color contrast. They are also useful when you receive the color code as a [shortcode](/docs/adding-content/shortcodes/) parameter.
+
+The value of `` can be any of the color names, `primary`, `white`, `dark`, `warning`, `light`, `success`, `300`, `blue`, `orange` etc.
+
+When you use `.-bg-`, the text colors will be adjusted to get proper contrast:
+
+```html
+
Background: Primary
+
Background: Gray 200
+```
+
+
Background: Primary
+
Background: Gray 200
+
+`.-text-` sets the text color only:
+
+```html
+
Text: Blue
+```
+
+
Text: Blue
+
+## Customizing templates
+
+### Add code to head or before body end
+
+If you need to add some code (CSS import or similar) to the `head` section on every page, add a partial to your project:
+
+```
+layouts/partials/hooks/head-end.html
+```
+
+And add the code you need in that file. Your partial code is automatically included at the end of the theme partial [head.html](https://github.com/google/docsy/blob/master/layouts/partials/head.html) (the [theme version](https://github.com/google/docsy/blob/master/layouts/partials/head.html) of `head-end.html` is empty):
+
+
+Similar, if you want to add some code right before the `body` end, create your own version of the following file:
+
+```
+layouts/partials/hooks/body-end.html
+```
+
+Any code in this file is included automatically at the end of the theme partial [`scripts.html`](https://github.com/google/docsy/blob/master/layouts/partials/head.html).
+
+Both `head.html` and `scripts.html` are then used to build Docsy's [base page layout](https://github.com/google/docsy/blob/master/layouts/_default/baseof.html), which is used by all the other page templates:
+
+```html
+
+
+
+ {{ partial "head.html" . }}
+
+
+
+ {{ partial "navbar.html" . }}
+
+
+ {{ partialCached "scripts.html" . }}
+
+
+```
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Adding content/navigation.md b/website/themes/docsy/userguide/content/en/docs/Adding content/navigation.md
new file mode 100644
index 00000000..6542978c
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Adding content/navigation.md
@@ -0,0 +1,105 @@
+---
+title: "Navigation and Search"
+date: 2017-01-05
+weight: 3
+description: >
+ Customize site navigation and search for your Docsy site.
+---
+
+## Top-level menu
+
+The top level menu (the one that appears in the top navigation bar for the entire site) uses your site's [`main` menu](https://gohugo.io/content-management/menus/). All Hugo sites have a `main` menu array of menu entries, accessible via the `.Site.Menus` site variable and populatable via page front matter or your site's `config.toml`.
+
+To add a page or section to this menu, add it to the site's `main` menu in either `config.toml` or in the destination page's front matter (in `_index.md` or `_index.html` for a section, as that's the section landing page). For example, here's how we added the Documentation section landing page to the main menu in this site:
+
+```yaml
+---
+title: "Docsy Documentation"
+linkTitle: "Documentation"
+menu:
+ main:
+ weight: 20
+---
+```
+
+The menu is ordered from left to right by page `weight`. So, for example, a section index or page with `weight: 30` would appear after the Documentation section in the menu, while one with `weight: 10` would appear before it.
+
+If you want to add a link to an external site to this menu, add it in `config.toml`, specifying the `weight`.
+
+```yaml
+[[menu.main]]
+ name = "GitHub"
+ weight = 50
+ url = "https://github.com/google/docsy/"
+```
+
+## Section menu
+
+The section menu, as shown in the left side of the `docs` section, is automatically built from the `content` tree. Like the top-level menu, it is ordered by page or section index `weight` (or by page creation `date` if `weight` is not set), with the page or index's `Title`, or `linkTitle` if different, as its link title in the menu. If a section subfolder has pages other than `_index.md` or `_index.html`, those pages will appear as a submenu, again ordered by `weight`. For example, here's the metadata for this page showing its `weight` and `title`:
+
+```yaml
+---
+title: "Navigation and Search"
+linkTitle: "Navigation and Search"
+date: 2017-01-05
+weight: 3
+description: >
+ Customize site navigation and search for your Docsy site.
+---
+```
+
+To hide a page or section from the menu, set `toc_hide: true` in front matter.
+
+By default, the section menu will show the current section fully expanded all the way down. This may make the left nav too long and difficult to scan for bigger sites. Try setting site param `ui.sidebar_menu_compact = true` in `config.toml`.
+
+## Breadcrumb navigation
+
+Breadcrumb navigation is enabled by default. To disable breadcrumb navigation, set site param `ui.breadcrumb_disable = true` in `config.toml`.
+
+## Configure search
+
+By default Docsy uses a [Google Custom Search Engine](https://cse.google.com/cse/all) to search your site. To enable this feature, you'll first need to make sure that you have built a public production version of your site, as otherwise your site won't be crawled and indexed.
+
+### Setting up site search
+
+1. Deploy your site and ensure that it's built with `HUGO_ENV="production"`, as Google will only crawl and index Docsy sites built with this setting (you probably don't want your not-ready-for-prime-time site to be searchable!). You can specify this variable as a command line flag to Hugo:
+
+ ```
+ $ env HUGO_ENV="production" hugo
+ ```
+
+ Alternatively, if you're using Netlify, you can specify it as a Netlify [deployment setting](https://www.netlify.com/docs/continuous-deployment/#build-environment-variables) in `netlify.toml` or the Netlify UI, along with the Hugo version. It may take a day or so before your site has actual search results available.
+2. Create a Google Custom Search Engine for your deployed site by clicking **New Search Engine** on the [Custom Search page](https://cse.google.com/cse/all) and following the instructions. Make a note of the ID for your new search engine.
+
+### Adding the search page
+
+Once you have your search engine, you can add the feature to your site:
+
+1. Ensure you have a Markdown file in `content/en/search.md` (and one per other languages if needed) to display your search results. It only needs a title and `layout: search`, as in the following example:
+
+ ```
+ ---
+ title: Search Results
+ layout: search
+ ---
+ ```
+
+1. Add your Google Custom Search Engine ID to the site params in `config.toml`. You can add different values per language if needed.
+
+ ```
+ # Google Custom Search Engine ID. Remove or comment out to disable search.
+ gcs_engine_id = "011737558837375720776:fsdu1nryfng"
+ ```
+
+### Disabling search
+
+If you don't specify a Google Custom Search Engine ID for your project, the search box won't appear in your site. If you're using the default `config.toml` from the example site and want to disable search, just comment out or remove the relevant line.
+
+### Disabling the sidebar search box
+
+By default, the search box appears in both the top navigation bar and at the top of the sidebar left navigation pane. If you don't want the sidebar search box, set `sidebar_search_disable` to `true` in `config.toml`:
+
+```
+sidebar_search_disable = true
+```
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Best practices/_index.md b/website/themes/docsy/userguide/content/en/docs/Best practices/_index.md
new file mode 100644
index 00000000..fb1ee788
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Best practices/_index.md
@@ -0,0 +1,8 @@
+---
+title: "Best Practices"
+weight: 9
+description: >
+ Optional guidance and recommendations about organizing, authoring, and managing your technical documentation.
+---
+
+Use this section to learn about some of the best practices around creating technical documentation with Docsy.
diff --git a/website/themes/docsy/userguide/content/en/docs/Best practices/organizing-content.md b/website/themes/docsy/userguide/content/en/docs/Best practices/organizing-content.md
new file mode 100644
index 00000000..247a7de7
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Best practices/organizing-content.md
@@ -0,0 +1,52 @@
+---
+title: "Organizing Your Content"
+linkTitle: "Organizing Your Content"
+weight: 9
+description: >
+ Optional guidance and recommendations on how to organize your documentation site.
+---
+
+If you have a look at our [Example Site](https://goldydocs.netlify.com/about/), you'll see that we've organized
+the Documentation section into a number of subsections, each with some recommendations about what you might put
+in that section.
+
+### Do I need to use this structure?
+
+Absolutely not! The site structure in the Example Site was created to meet the needs of large docsets for large
+products with lots of features, potential tasks, and reference elements. For a simpler docset (like this one!),
+it's fine to just structure your docs around specific features that your users need to know about. Even for larger
+documentation sets, you may find that the structure isn't useful "as is", or that you don't need to use all the
+section types.
+
+We do recommend that (as we've done here) you provide at least:
+
+* An **Overview** of the product (either on the docs landing page or a separate Overview page) that tells the user
+ why they should be interested in your project.
+* A **Getting Started** page.
+* Some **Examples**.
+
+You may also want to create some tasks/how-tos for your project's features. Feel free to copy this Docsy user guide
+site or even just the docs section instead if you like this simpler structure better.
+
+[Learn more about how Hugo and Docsy use folders and other files to organize your site](/docs/adding-content/content/#organizing-your-documentation).
+
+### Why this structure?
+
+We based the Example Site structure on our own experiences creating (and using) large documentation sets for
+different types of project and on user research carried out on some of our bigger sites. In user studies we saw that
+users cared most about and immediately looked for a Get Started or Getting Started section
+(so they could, well, get started), and some examples to explore and copy, so we made those into prominent top-level doc
+sections in our site. Users also wanted to find "recipes" that they could easily look up to perform specific tasks and
+put together to create their own applications or projects, so we suggest that you add this kind of content as Tasks.
+Other content types such as conceptual docs, reference docs, and end-to-end tutorials are less important for all doc sets,
+particularly for smaller projects. We emphasize in our Example Site that these sections are optional.
+
+We hope to improve the Example Site structure further as we learn more about how users interact with technical
+documentation, particularly for Open Source projects.
+
+## Writing style guide
+
+This guide and the example site just address how to organize your documentation content into pages and sections. For some g
+uidance on how to organize and write the content in each page, we recommend the
+[Google Developer Documentation Style Guide](https://developers.google.com/style/), particularly the
+[Style Guide Highlights](https://developers.google.com/style/highlights).
diff --git a/website/themes/docsy/userguide/content/en/docs/Best practices/site-guidance.md b/website/themes/docsy/userguide/content/en/docs/Best practices/site-guidance.md
new file mode 100644
index 00000000..343ad88f
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Best practices/site-guidance.md
@@ -0,0 +1,41 @@
+---
+title: "Hugo Tips"
+linkTitle: "Hugo Tips"
+weight: 9
+description: >
+ Tips for authoring content for your Docsy-themed Hugo site.
+---
+
+As mentioned in the [About](/about') page, Docsy is a pre-configured theme for the [Hugo](https://gohugo.io/) static site
+generator. If you're not already familiar with Hugo and, in particular, its version of Markdown, this page provides some
+useful tips and potential gotchas for adding and editing content for your site. Feel free to add your own!
+
+### Nested lists
+
+Hugo currently uses the [Blackfriday](https://github.com/russross/blackfriday) Markdown processor, which can be
+sensitive when it come to content that's deeply nested in a list. In particular, be aware that
+[this known issue](https://github.com/russross/blackfriday/issues/329) can surface if or when you have multiple authors and
+other contributors who might mix 'tabs' and 'spaces' when indenting lists, or fail to indent properly.
+
+An additional factor here is that because GitHub uses a different Markdown processor, GitHub markdown and the editor UI may
+render some nested lists properly, while Blackfriday might render that same content poorly. For example, the count in a
+numbered list might restart, or your nested content within a list is not indented
+(shows as a peer element instead of a nested child element). You may want to recommend in your contribution guidelines
+([as we do](/docs/contribution-guidelines/#contributing-to-these-docs)) that contributors preview their content with Hugo
+(or use Netlify's preview feature for PRs if that's your chosen deployment tool) to ensure their content renders correctly
+with Blackfriday.
+
+{{% alert title="Tip" %}}
+[Per comments on the known issue](https://github.com/russross/blackfriday/issues/329#issuecomment-277602856), some
+users have found that using 4 spaces instead of a 'tab' results in consistent behavior. For example, consider
+configuring your local editor to use 4 spaces when the **Tab** key is pressed.
+{{% /alert %}}
+
+### Linking
+
+By default, regular relative URLs in links are left unchanged by Hugo (they're still relative links in your site's generated HTML), hence some hardcoded relative links like `[relative cross-link](../../peer-folder/sub-file.md)` might behave unexpectedly compared to how they work on your local file system. You may find it helpful to use some of Hugo's built-in [link shortcodes](https://gohugo.io/content-management/cross-references/#use-ref-and-relref) to avoid broken links in your generated site. For example a `{< ref "filename.md" >}` link in Hugo will actually
+find and automatically link to your file named `filename.md`.
+
+Note, however, that `ref` and `relref` links don't work with `_index` or `index` files (for example, this site's [content landing page](`/docs/adding-content/`)): you'll need to use regular Markdown links to section landing or other index pages. Specify these links relative to the site's root URL, for example: `/docs/adding-content/`.
+
+[Learn more about linking](/docs/adding-content/content/#working-with-links).
diff --git a/website/themes/docsy/userguide/content/en/docs/Contribution guidelines/_index.md b/website/themes/docsy/userguide/content/en/docs/Contribution guidelines/_index.md
new file mode 100644
index 00000000..bf1678bf
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Contribution guidelines/_index.md
@@ -0,0 +1,98 @@
+---
+title: "Contribution Guidelines"
+linkTitle: "Contribution Guidelines"
+weight: 9
+description: >
+ How to contribute to Docsy
+---
+
+Docsy is an open source project and we love getting patches and contributions to make Docsy and its docs even better.
+
+## Contributing to Docsy
+
+The Docsy theme itself lives in .
+
+### Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+### Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+### Previewing your changes
+
+As Docsy is a theme rather than a site, you can't serve the theme directly to check your changes work. Instead use your updated local theme in a local copy of the Docsy example site (copy or make your changes in the `themes/docsy` directory) and [preview](/docs/deployment/) from there.
+
+### Community guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
+
+### Creating issues
+
+Alternatively, if there's something you'd like to see in Docsy (or if you've found something that isn't working the way you'd expect), but you're not sure how to fix it yourself, please create an [issue](https://github.com/google/docsy/issues).
+
+## Contributing to these docs
+
+This user guide is, like our example site, a Docsy site that uses the Hugo static site generator. We welcome updates to the docs!
+
+We use [Netlify](https://www.netlify.com/) to manage the deployment of the site and provide previews of doc updates. The instructions here assume you're familiar with basic GitHub workflows.
+
+### Quick start with Netlify
+
+1. Fork the [Docsy website repo](wherever it goes) on GitHub.
+1. Make your changes and send a pull request (PR).
+1. If you're not yet ready for a review, add "WIP" to the PR name to indicate
+ it's a work in progress. (**Don't** add the Hugo property
+ "draft = true" to the page front matter, because that prevents the
+ auto-deployment of the content preview described in the next point.)
+1. Wait for the automated PR workflow to do some checks. When it's ready,
+ you should see a comment like this: **deploy/netlify — Deploy preview ready!**
+1. Click **Details** to the right of "Deploy preview ready" to see a preview
+ of your updates.
+1. Continue updating your doc and pushing your changes until you're happy with
+ the content.
+1. When you're ready for a review, add a comment to the PR, and remove any
+ "WIP" markers.
+
+### Updating a single page
+
+If you've just spotted something you'd like to change while using the docs, Docsy has a shortcut for you:
+
+1. Click **Edit this page** in the top right hand corner of the page.
+1. If you don't already have an up to date fork of the project repo, you are prompted to get one - click **Fork this repository and propose changes** or **Update your Fork** to get an up to date version of the project to edit. The appropriate page in your fork is displayed in edit mode.
+1. Follow the rest of the [Quick start with Netlify](#quick-start-with-netlify) process above to make and preview your changes.
+
+
+### Previewing your changes locally
+
+If you want to run your own local Hugo server to preview your changes as you work:
+
+1. Follow the instructions in [Getting started](/docs/getting-started) to install Hugo and any other tools you need.
+1. Fork the [Docsy website repo](wherever it goes) repo into your own project, then create a local copy using `git clone`. Don’t forget to use `--recurse-submodules` or you won’t pull down some of the code you need to generate a working site.
+
+ ```
+ git clone --recurse-submodules --depth 1 https://github.com/google/docsy-site.git
+ ```
+
+1. Run `hugo server` in the site root directory. By default your site will be available at http://localhost:1313/. Now that you're serving your site locally, Hugo will watch for changes to the content and automatically refresh your site.
+1. Continue with the usual GitHub workflow to edit files, commit them, push the
+ changes up to your fork, and create a pull request.
+
+### Creating an issue
+
+If there's something you'd like to see in the docs, but you're not sure how to fix it yourself, please create an issue in [this repository](wherever it goes). You can also create an issue about a specific page by clicking the **Create Issue** button in the top right hand corner of the page.
+
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Deployment/_index.md b/website/themes/docsy/userguide/content/en/docs/Deployment/_index.md
new file mode 100644
index 00000000..67165232
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Deployment/_index.md
@@ -0,0 +1,49 @@
+---
+title: "Previews and Deployment"
+linkTitle: "Previews and Deployment"
+weight: 7
+description: >
+ Deploying your Docsy site.
+---
+
+There are multiple possible options for deploying a Hugo site, including Netlify, Firebase Hosting, Bitbucket with Aerobatic, and more; you can read about them all in [Hosting and Deployment](https://gohugo.io/hosting-and-deployment/). Hugo also makes it easy to deploy your site locally for quick previews of your content.
+
+## Serving your site locally
+
+Depending on your deployment choice you may want to serve your site locally during development to preview content changes. To serve your site locally:
+
+1. Ensure you have an up to date local copy of your site files cloned from your repo. Don't forget to use `--recurse-submodules` or you won't pull down some of the code you need to generate a working site.
+
+ ```
+ git clone --recurse-submodules --depth 1 https://github.com/my/example.git
+ ```
+
+ {{% alert title="Note" color="primary" %}}
+If you've just added the theme as a submodule in a local version of your site and haven't committed it to a repo yet, you must get local copies of the theme's own submodules before serving your site.
+
+ git submodule update --init --recursive
+ {{% /alert %}}
+
+1. Ensure you have the tools described in [Installation and Prerequisites](#installation-and-prerequisites) installed on your local machine, including `postcss-cli` (you'll need it to generate the site resources the first time you run the server).
+1. Run the `hugo server` command in your site root. By default your site will be available at http://localhost:1313/.
+
+Now that you're serving your site locally, Hugo will watch for changes to the content and automatically refresh your site. If you have more than one local git branch, when you switch between git branches the local website reflects the files in the current branch.
+
+## Deployment with Netlify
+
+We recommend using [Netlify](https://www.netlify.com/) as a particularly simple way to serve your site from your Git provider (GitHub, GitLab, or BitBucket), with [continuous deployment](https://www.netlify.com/docs/continuous-deployment/), previews of the generated site when you or your users create pull requests against the doc repo, and more. Netlify is free to use for Open Source projects, with premium tiers if you require greater support.
+
+Follow the instructions in [Host on Netlify](https://gohugo.io/hosting-and-deployment/hosting-on-netlify/) to set up a Netlify account (if you don't have one already) and authorize access to your GitHub or other Git provider account. Once you're logged in:
+
+1. Click **New site from Git**.
+1. Click your chosen Git provider, then choose your site repo from your list of repos.
+1. In the **Deploy settings** page:
+ 1. For your **Build command**, specify `cd themes/docsy && git submodule update -f --init && cd ../.. && hugo`. You need to specify this rather than just `hugo` so that Netlify can use the theme's submodules.
+ 1. Click **Show advanced**.
+ 1. In the **Advanced build settings** section, click **New variable**.
+ 1. Specify `HUGO_VERSION` as the **Key** for the new variable, and `0.53` or later as its **Value**.
+1. Click **Deploy site**.
+
+If you have an existing deployment you can view and update the relevant information by selecting the site from your list of sites in Netlify, then clicking **Site settings** - **Build and deploy**. Ensure that **Ubuntu Xenial 16.04** is selected in the **Build image selection** section - if you're creating a new deployment this is used by default. You need to use this image to run the extended version of Hugo.
+
+
diff --git a/website/themes/docsy/userguide/content/en/docs/Examples/_index.md b/website/themes/docsy/userguide/content/en/docs/Examples/_index.md
new file mode 100644
index 00000000..55dd2f28
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Examples/_index.md
@@ -0,0 +1,27 @@
+---
+title: "Examples"
+weight: 8
+description: >
+ Some examples of Docsy in action!
+---
+
+One of the best ways to see what Docsy can do, and learn how to configure a site with it, is to see some real projects. In addition to our provided Docsy Example Project, there are several live sites already using the theme. Please add your own examples once you've got a production site up and running with Docsy!
+
+## Docsy theme examples
+
+Example sites that have low to no customization:
+
+| Site | Repo (if public) |
+|---|---|
+| [This Docsy documentation site](/docs) | https://github.com/google/docsy |
+| "Goldydocs" - a Docsy example site | https://github.com/google/docsy-example |
+| https://www.kubeflow.org/ | https://github.com/kubeflow/website |
+| https://agones.dev/site/ | https://github.com/GoogleCloudPlatform/agones/tree/master/site |
+
+## Customized Docsy examples
+
+Example sites that include a moderate to high amount of customization:
+
+| Site | Repo (if public) |
+|---|---|
+| [Knative](https://knative.dev) | https://github.com/knative/docs and https://github.com/knative/website |
diff --git a/website/themes/docsy/userguide/content/en/docs/Getting started/_index.md b/website/themes/docsy/userguide/content/en/docs/Getting started/_index.md
new file mode 100755
index 00000000..be0b0c32
--- /dev/null
+++ b/website/themes/docsy/userguide/content/en/docs/Getting started/_index.md
@@ -0,0 +1,248 @@
+
+---
+title: "Getting Started"
+linkTitle: "Getting Started"
+weight: 2
+date: 2018-07-30
+description: >
+ This page tells you how to get started with the Docsy theme, including installation and basic configuration.
+---
+
+
+## Prerequisites and installation
+
+### Install Hugo
+
+You need a [recent **extended** version](https://github.com/gohugoio/hugo/releases) (we recommend version 0.53 or later) of [Hugo](https://gohugo.io/) to do local builds and previews of sites (like this one) that use Docsy. If you install from the release page, make sure to get the `extended` Hugo version, which supports [SCSS](https://sass-lang.com/documentation/file.SCSS_FOR_SASS_USERS.html); you may need to scroll down the list of releases to see it.
+
+For comprehensive Hugo documentation, see [gohugo.io](https://gohugo.io/).
+
+#### Linux
+
+Do **not** use `sudo apt-get install hugo`, as it currently doesn't get you the `extended` version.
+
+If you've already installed Hugo, check your version:
+
+```
+hugo version
+```
+If the result is `v0.52` or earlier, or if you don't see `Extended`, you'll need to install the latest version.
+
+1. Go to the [Hugo releases](https://github.com/gohugoio/hugo/releases) page.
+2. In the most recent release, scroll down until you find a list of
+ **Extended** versions.
+3. Download the latest extended version (`hugo_extended_0.5X_Linux-64bit.tar.gz`).
+4. Create a new directory:
+
+ mkdir hugo
+
+5. Extract the files you downloaded to `hugo`.
+
+6. Switch to your new directory:
+
+ cd hugo
+
+7. Install Hugo:
+
+ sudo install hugo /usr/bin
+
+#### macOS
+
+Install Hugo using [Brew](https://gohugo.io/getting-started/installing/#homebrew-macos).
+
+### Install PostCSS
+
+To build or update your site's CSS resources, you also need [`PostCSS`](https://postcss.org/) to create the final assets. If you need to install it, you must have a recent version of [NodeJS](https://nodejs.org/en/) installed on your machine so you can use `npm`, the Node package manager. By default `npm` installs tools under the directory where you run `npm install`:
+
+```
+sudo npm install -D --save autoprefixer
+sudo npm install -D --save postcss-cli
+```
+
+You can also install these tools globally on your computer:
+
+```bash
+sudo npm install -g postcss-cli
+sudo npm install -g autoprefixer
+```
+
+You can find out more about the pros and cons of local and global package installation in [npm Global or Local Packages](https://flaviocopes.com/npm-packages-local-global/).
+
+## Using the theme
+
+To use the Docsy Hugo theme, you have a couple of options:
+
+* **Copy and edit the source for the [Docsy example site](https://github.com/google/docsy-example).** This approach gives you a skeleton structure for your site, with top-level and documentation sections and templates that you can modify as necessary. The example site uses Docsy as a [Git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules), so it's easy to [keep up to date](#keeping-the-theme-up-to-date).
+* **Build your own site using the Docsy theme.** Specify the [Docsy theme](https://github.com/google/docsy) like any other [Hugo theme](https://gohugo.io/themes/) when creating or updating your site. With this option, you'll get Docsy look and feel, navigation, and other features, but you'll need to specify your own site structure.
+
+### Option 1: Clone the Docsy example site
+
+The Example Site gives you a good starting point for building your docs site and is pre-configured to use the Docsy theme
+as a Git submodule. You can clone the Example Site either by:
+
+* [Using the GitHub UI](#using-the-github-ui)
+* [Using the command line](#using-the-command-line)
+
+#### Using the GitHub UI
+
+
+
+Note that the following approach [forks](https://help.github.com/en/articles/fork-a-repo) our repo and so creates a connection in GitHub between your project repo and the Docsy example site project repo - our project will be the "upstream" version of your site project:
+
+1. In the [the Docsy example site's GitHub repo](https://github.com/google/docsy-example), click **Fork** and follow the prompts.
+1. Rename your new fork:
+ 1. Click **Settings**, and type a new name in the **Repository name** field.
+ 1. Click **Rename** to save your changes.
+1. Get the web URL for cloning your site repo by clicking **Clone or download** on its main repo page.
+1. Make your own local working copy of your repo using `git clone`, replacing `https://github.com/my/example.git` with your repo's web URL:
+
+