testing

testing variables

this is a test of the site variables
Current Time is: 2019-12-28 09:23:06 +0000 Pages are:

Unlike Hyde, Hydejack is very opinionated about how you are going to use it.

Features

Features include:

NOTE: This post is outdated and only included for legacy reasons. See the Documentation for up-to-date instructions.

Download

Hydejack is developed on and hosted with GitHub. Head to the GitHub repository for downloads, bug reports, and feature requests.

I love the original Hyde theme, but unfortunately the layout isn’t as great on small screens. Since the sidebar moves to the top, the user has to scroll down just to read the title of a blog post.

By using a drawer component I was able to retain the original two column layout. It’s possible to move the drawer via touch input (with the help of a little JavaScript).

Since the background image contributes to the feel of the page I’m letting it peek over the edge a bit. This also provides a hint to the user that an interaction is possible.

Manual

Configuration

You can configure important aspects of the theme via _config.yml. This includes:

How to Change the Image and Color of a Post

In the manifest of a blog post, simply add an url as image and a CSS color as color:

layout: post
title: Introducing Hydejack
image: https://qwtel.com/hydejack/assets/img/hyde.jpg
color: '#949667'

How to Add a New Tag

Tags are not meant to be used #instagram #style: #food #goodfood #happy #happylife #didimentionfood #yougetthepoint, as each tag requires some setup work. I tend to think of it as categories that can be combined.

  1. Add an entry to _data/tags.yml, where the key represents a slug and provide at least a name value and optionally image, color and description.

    Example /_data/tags.yml:

    mytag:
      name: My Tag
    
  2. Make a new file in the tag folder, using the same name you’ve used as the key / slug and change the tag and permalink entries.

    Example /tag/mytag.md:

    layout: blog-by-tag
    tag: mytag
    permalink: /tag/mytag/
    
  3. Tag your blog posts using the tags key (color and image will only depend on the first tag).

    layout: post
    title: Introducing My New Tag
    tags: [mytag, othertag]
    
  4. (optional) Add the tag to the sidebar, by adding it to sidebar_tags in _config.yml. They will appear in the listed order.

    sidebar_tags: [mytag, othertag]
    

Hydejack v4 adds a lot of social media icons and introduces a new default layout. It also breaks things, hence a new major release number.

Breaking

NOTE: This post is outdated and only included for legacy reasons. See the Documentation for up-to-date instructions.

New features

Design

Fixes

Internal


Get Social Media Impocalypse on GitHub

Hydejack has always featured a JavaScript-heavy sidebar, but other than that, JS has been used sparingly. This changes with this release, which adds a ton of (optional) code that changes the feel of the theme dramatically.

Major

Pages are now loaded and swapped through JavaScript. This has a number of effects. First of all, it looks cool, but the animations aren’t just about aesthetics: They also help to hide the network time of fetching the next page, making the entire site feel faster. At the same time, the FOUC introduced in the last release will no longer occur (except on the initial page load).

See the the migration guide for instructions on how to upgrade.

Minor

Fixes


Get JavaScripten on GitHub

This release makes including third party plugins easier. Until now, the push state approach to loading new pages has been interfering with embedded script tags. This version changes this by simulating the sequential loading of script tags on a fresh page load.

This approach should work in a majority of cases, but can still cause problems with scripts that can’t be added more than once per page. If an issue can’t be resolved, there’s now the option to disable push state by setting disable_push_state: true in config.yml.

What’s happening?

The problem is as follows: When the browser encounters a script tag while parsing a HTML page it will stop (possibly to make a request to fetch an external script) and then execute the code before continuing parsing the page (it’s easy to how this can make your page really slow, but that’s a different topic).

In any case, due of this behavior you can do things like include jQuery, then run code that depends on jQuery in the next script tag:

<script src=".../jquery.js"></script>
<script>
  $('#tabs').someJQueryFunction(); // works
</script>

I’d consider this an anti-pattern for the reason mentioned above, but it remains common and has the advantage of being easy to understand.

However, things break when Hydejack dynamically inserts new content into the page. It works fine for standard markdown content like p tags, but when inserting script tags the browser will execute them immediately and in parallel, because in most cases this is what you’d want. However, this means that $('#tabs').someJQueryFunction(); will run while the HTTP request for jQuery is still in progress — and we get an error that $ isn’t defined, or similar.

From this description the solution should be obvious: Insert the script tags one-by-one, to simulate how they would get executed if it was a fresh page request. In fact this is how Hydejack is now handling things (and thanks to rxjs’ concatMap it was easy to implement), but unfortunately this is not a magic solution that can fix all problems:

But what will “magically” solve all third party script problems, is disabling dynamic page loading altogether, for which there’s now an option. To make this a slightly less bitter pill to swallow, there’s now a CSS-only “intro” animation that looks similar to the dynamic one. Maybe you won’t even notice the difference.

Patch Notes

Minor

Design

Fixes

In this release I’ve added a “Other Projects” section to the bottom of each project page, making it easier for users to navigate through your collection and discover other projects. Also, it’s now possible to display larger (data-) tables that were previously cut off (especially on mobile devices).

For more on how to add tables, see the new section in docs/writing.

Smaller changes include a reduced usage of horizontal lines and a more “semantic” use of hr elements. Specifically, the semantics of the resume layout have been improved. This is best visualized when viewing the page with a text browser like w3m. For example, before 6.4 the skills section looked like

Skills

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Web Development | Level: Master

Keywords:

  • HTML
  • CSS
  • Javascript

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Compression | Level: Master

Keywords:

  • Mpeg
  • MP4
  • GIF

(lots of hrs, skill level as part of the headline 😕)

Now it looks like

Skills

Web Development
    Level: Master
    Keywords:
      □ HTML
      □ CSS
      □ Javascript
Compression
    Level: Master
    Keywords:
      □ Mpeg
      □ MP4
      □ GIF

(using a dl, so that Level -> "Master", Keywords -> ul, …)

There’s many more minor changes and fixes that you can read below.

Patch Notes

Minor

Design

Fixes

This maintenance release includes various quality-of-life improvements, especially when using the gem-based version of the theme. These changes come in handy when using Hydejack for a quick (project-) page: The home layout, which is used when using jekyll new, is now a proper layout that displays a few posts/pages below the regular content, and it is again possible to define an author in _config.yml without setting up a _data directory (for more, see blow).

Version 6.5 also includes smaller design adjustments. Most notably, the default font is now Noto Sans. With the benefit of hindsight, using a serif font in combination with the slab headings feels more like a bug in the design than anything else. However, should you be happy with Noto Serif (the previous default font), there is no need to worry — this only effects the default setting.

For the full patch notes, read on.

Patch Notes

Added

Changed

Design

How to restore the old styles

If you would like to use the old font, add the following to _config.yml:

font_heading: "'Roboto Slab', Helvetica, Arial, sans-serif"
font:         "'Noto Serif', Georgia, serif"
google_fonts: "Roboto+Slab:700|Noto+Serif:400,400i,700,700i"

If you were relying on the default setting for the background image, add the following to _config.yml:

image: /hydejack/assets/img/nap.jpg

Note that you have to replace /hydejack with your baseurl.

To restore the old sidebar, open (or create) _sass/my-inline.scss and add the following:

@media screen { .sidebar-sticky { left: 2rem; max-width: none; } }

To remove the border radius, open (or create) _sass/my-inline.scss and add the following:

.card, .pagination-item { border-radius: 0!important; }

While v7 brings an insane amount of new stuff, the most notable change is the new background image. It is no longer anti-selling the theme. The old image was a blurred version of Napoleon Bonaparte, which was just… weird. I could tell the story of how this came to be, but I’d rather show you the new and improved background image.

New background image

Yes, it’s an aerial shot of a beach (so hot right now).

Hydejack's background image Hydejack’s new background image.

Q: What has this picture to do with Hydejack? Nothing really, I just like how it looks. However: Boat → Pirates → Hijacking → Hydejack (illuminati confirmed)

Even though it is a free image from Unsplash (…), it’s unique in the sense that I’ve modified it so it looks better inside the sidebar. Specifically, I’ve straightened out the beach and rotated the boat so that it sits at a nice 90 degree angle.

For comparison, here is the non-euclidean mess the original photo was. Pretty OCD, I know.

Original photo The original photo before it was “straightened out” by applying Photoshop magic.

New color palette

I’ve extracted the major colors from the background image, which now form Hydejack’s color palette:

Hydejacks's color palette

Hydejack also has a new logo, which is based on the new color palette. It also features the best font on Google Fonts, and probably the world: Roboto Slab (which is to say, I like it a lot).

Hydejack's logo

There should be whitespace between paragraphs. We recommend including a README, or a file with information about your project.

There should be whitespace between paragraphs.

Text can be bold, italic, or strikethrough.

Link to another page.

Header 2

This is a normal paragraph following a header. GitHub is a code hosting platform for version control and collaboration. It lets you and others work together on projects from anywhere.

Header 3

This is a blockquote following a header.

When something is important enough, you do it even if the odds are not in your favor.

// Javascript code with syntax highlighting.
var fun = function lang(l) {
  dateformat.i18n = require('./lang/' + l)
  return true;
}
# Ruby code with syntax highlighting
GitHubPages::Dependencies.gems.each do |gem, version|
  s.add_dependency(gem, "= #{version}")
end

Header 4

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
head1head twothree
okgood swedish fishnice
out of stockgood and plentynice
okgood oreoshmm
okgood zoute dropyumm

There’s a horizontal rule below this.


Here is an unordered list:

And an ordered list:

  1. Item one
  2. Item two
  3. Item three
  4. Item four

And a nested list:

Small image

Large image

Definition lists

Name
Godzilla
Born
1952
Birthplace
Japan
Color
Green
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. Or is it?
The final element.

Hydejack offers a few additional features to markup your markdown. Don’t worry, these are merely CSS classes added with kramdown’s {:...} syntax, so that your content remains compatible with other Jekyll themes.

Large Tables

Default alignedLeft alignedCenter alignedRight alignedDefault alignedLeft alignedCenter alignedRight alignedDefault alignedLeft alignedCenter alignedRight alignedDefault alignedLeft alignedCenter alignedRight aligned
First body partSecond cellThird cellfourth cellFirst body partSecond cellThird cellfourth cellFirst body partSecond cellThird cellfourth cellFirst body partSecond cellThird cellfourth cell
Second linefoostrongbazSecond linefoostrongbazSecond linefoostrongbazSecond linefoostrongbaz
Third linequuxbazbarThird linequuxbazbarThird linequuxbazbarThird linequuxbazbar
Second body   Second body   Second body   Second body   
2 line   2 line   2 line   2 line   
Footer row   Footer row   Footer row   Footer row   

Code blocks

// Example can be run directly in your JavaScript console

// Create a function that takes two arguments and returns the sum of those
// arguments
var adder = new Function("a", "b", "return a + b");

// Call the function
adder(2, 6);
// > 8

Math

Lorem ipsum f(x) = x^2.

\begin{aligned}
  \phi(x,y) &= \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right) \\[2em]
            &= \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j)            \\[2em]
            &= (x_1, \ldots, x_n)
               \left(\begin{array}{ccc}
                 \phi(e_1, e_1)  & \cdots & \phi(e_1, e_n) \\
                 \vdots          & \ddots & \vdots         \\
                 \phi(e_n, e_1)  & \cdots & \phi(e_n, e_n)
               \end{array}\right)
               \left(\begin{array}{c}
                 y_1    \\
                 \vdots \\
                 y_n
               \end{array}\right)
\end{aligned}

Message boxes

NOTE: You can add a message box.

Large text

You can add large text.

Large images

Full-width image

Captions to images

Full-width image A caption to an image.

Large quotes

You can make a quote “pop out”.

Faded text

I’m faded, faded, faded.

After a long wait, Hydejack 8 finally sees the day of its release. It makes Hydejack look more elegant (no more super bold headings) and introduces features that make your site more impressive to first time visitors, while loading faster for repeat visitors.

Cover Pages

The new design doubles down on Hydejack as your personal site. The new Cover Pages let visitors know what you’re about at a glance, showing your logo or profile picture, tagline or description, and selection of social media icons.

Sliding over a cover page will reveal the content below.

Lazy-Loading Images

Using lots of images can severely impact the performance of a site. It can also cause layout quirks when images pop into existence. In Hydejack 8 you have the option to provide width and height information for your images and let Hydejack lazy-load them as readers scroll the page.

Images are loaded as they are scrolled into view.

Better Blog Layout

The blog layout finally catches up to modern design standards and renders a posts’s image as part of the preview, giving it a tastier look that makes visitors more likely to engage.

Hydejack's improved blog layout renders each post's image.

Dark Mode 🌗 (coming soon)

In 8.1, buyers of the PRO version will have access to Dark Mode. At your choosing, it will be enabled by default, enabled based on visitors’ local time, or flipped on by a switch.

Hydejack switches between light and dark mode fluidly.

Offline Support ⚡️

Version 8 introduces experimental offline support. This allows visitors to navigate your site while offline and continue reading articles when connectivity is lost. It also improves loading times for repeat visitors dramatically.

Here you should be able to find everything you need to know to accomplish the most common tasks when blogging with Hydejack. Should you think something is missing, please let me know. Should you discover a mistake in the docs (or a bug in general) feel free to open an issue on GitHub.

NOTE: While this manual tries to be beginner-friendly, as a user of Jekyll it is assumed that you are comfortable running shell commands and editing text files.

Buyers of the PRO version can jump straight to installation for pro buyers, or upgrades for pro buyers.

Getting started

Using Hydejack

Other

This chapter covers advanced topics, such as offline support and custom JS builds. Codings skills are recommended.

Table of Contents

  1. Enabling offline support
    1. How offline storage works
  2. Adding a custom social media icon
    1. Creating the icon font
    2. Adding the platform’s metadata
  3. How CSS is organized in Hydejack
  4. Building the JavaScript

Enabling offline support

Hydejack v8 introduces experimental “cache as you go” offline support. This is implemented via the Service Worker API, a new browser standard that is now supported in the latest versions of all major browsers. However, it is a very powerful feature and should be used with a lot of care.

Enabling this feature requires that your content meets the following criteria:

To enable this feature, create the sw.js file in the root of your project and add the following content:

---
---
importScripts("{\{ '/assets/js/sw.js' | relative_url }\}?t={\{ site.time | date_to_xmlschema }\}");

NOTE: You have to remove the \ after each { and before each }! Alternatively, you can just copy the file from here.

This will load the main service worker script from Hydejack’s assets. The site.time part is necessary to make the service worker “byte different” every time you create a new build of your site, which triggers an update.

In your config.yml under the hydejack key, add the following:

offline:
  enabled: true
  cache_version: 1

The current implementation does not cache resources from external domains. There is now way of knowing if external sites conform to the conditions mentioned above, hence caching can be problematic and result in unexpected behavior.

For example, Google Analytics uses GET requests to send page views, each of which would be cached by the service worker without this policy. Frequently updating images, such as badges would never change.

Gem Version

However, if you include resources that are hosted on another domain and don’t change, you can add the sw-cache query parameter to the URL, e.g.

https://upload.wikimedia.org/wikipedia/commons/b/b1/57_Chevy_210.jpg?sw-cache

This will cause them to be cached like resources from the assets folder.

How offline storage works

Hydejack’s custom service worker implementation stores files for offline use on three different levels:

Shell
The shell files are the core Hydejack files (CSS, JS) that only change between version updates. If you made changes to any of these after enabling offline support, you must force an update by bumping the cache_version number in the config file.
Assets
These are presumed to be immutable. In other words, every file is cached indefinitely. E.g.: If you want to update an image after enabling offline support, add the image under a different name and change the link in the content. Alternatively, you can bump the cache_version, but this will remove all other cached files from the asset cache.
Content
The content cache exploits the fact that your content can’t change between builds, so that it can be stored for offline use until you upload a new build. For now, the entire content cache is discarded every time you publish new content (future versions could cache them based on last modified dates).

Other things to note are that the implementation will always cache the pages listed under legal, as well as the 404.html page, which will be shown when the user is offline.

Adding a custom social media icon

Hydejack includes a number of social media icons by default (in fact, everything that is provided by IcoMoon), but since the landscape is always changing, it is likely that a platform that is important to you will be missing at some point.

NOTE: You can add any platform by simply providing a complete URL. However, a fallback icon will be used.

Creating the icon font

In order to add a custom social media icon you have to use the IcoMoon App (free) to create a custom icon webfont. However, it is important that the generated font include all icons already in use by Hydejack. For this purpose, find the selection.json in assets/icomoon/selection.json and upload it to the app via “Import Icons”. Then, use the app to add your icon(s). Consult the IcoMoon docs for additional help.

Once you’ve created and downloaded the icon font form IconMoon, replace the icomoon folder in assets in its entirety. Keep in mind that future updates of Hydejack will override this folder.

Adding the platform’s metadata

For the second step it is necessary to add the network’s metadata to _data/social.yml. An entry looks like:

deviantart:
  name: DeviantArt
  icon: icon-deviantart
  prepend: "https://"
  append: ".deviantart.com"
name
The name of the network. Used for for the title attribute and screen readers.
icon
The icon CSS class. Can be chosen during the IcoMoon creation process.
prepend
Optional. A string that is prepended to the username to form the link to the profile. If the final URL should be https://<username>.deviantart.com, this would be https://
append
Optional. A string that is appended to the username to form the link to the profile. If the final URL should be https://<username>.deviantart.com, this would be .deviantart.com.

How CSS is organized in Hydejack

Hydejack takes a quite unique approach to CSS, which is motivated by the ability to inline essential CSS rules in a style tag in the <head/> of a page (to increase the loading speed), while serving the rest in a separate file.

The styles are written in SCSS and are located in the _sass folder, which looks like

├── hydejack
│   ├── __inline__
│   ├── __link__
│   ├── _base.pre.scss
│   ├── ...
│   └── _social.pre.scss
├── pooleparty
│   ├── __inline__
│   ├── __link__
│   ├── _base.pre.scss
│   ├── ...
│   └── _type.pre.scss
├── mixins.scss
├── my-inline.scss
├── my-style.scss
├── syntax.scss
└── variables.scss

The style rules are organized alongside components (or rather, topics) like “sidebar” and “footer”. Further, there are two separate frameworks, “pooleparty” and “hydejack”, which grew out of the original Poole and Hyde projects. Poole/party contains more general style rules, while Hyde/jack contains those that more are specific to the theme. However, this separation has blurred over time.

Inside those folders, you will notice the __inline__ and __link__ folders. The unfriendly names are intentional, because their contents are generated by a script and shouldn’t be modified directly. The source files are located in the same folder and end with .pre.scss. They are fully valid SCSS files, but contain comments that mark which lines should be inlined and which should be fetched asynchronously.

The rules are as follows:

The actual splitting happen with the _scripts/build-css.sh script (requires node.js 8+). You can run the script once by using

$ npm run build:css

or rebuild the CSS on every file change

$ npm run watch:css

Note that my-inline.scss and my-style.scss are not affected by this. Also, since all files are valid SCSS, the splitting part is entirely optional. If you would like to build just one regular CSS file, add

hydejack:
  no_inline_css: true

to your config file.

Building the JavaScript

In order to build the JavaScript you need to have node.js installed. Specifically, the npm command needs to be available, which is part of node.js.

NOTE: Building the JavaScript is optional! Hydejack comes with a pre-built, minified hydejack.js file that you can find in part of the theme’s assets.

Before you start, make sure you’ve copied the following files:

When building for the first time (and after each update of Hydejack) you have to run

$ npm install

to fetch all dependencies (and put them in a local folder node_modules), lint the code and write the bundled and minified script into assets/js/hydejack.js.

You can re-build it with

$ npm run build:js

If you want to actively develop the scripts, it is better to run

$ npm run watch:js

which will build a non-minified version of assets/js/hydejack.js after each filechange.

This chapter covers the basics of content creation with Hydejack.

Table of Contents

  1. Adding a page
  2. Adding an entry to the sidebar
    1. Adding a link to an external page to the sidebar
  3. Adding a category or tag
    1. Recap: Categories and tags in Jekyll
    2. Categories and tags in Hydejack
    3. Creating a new category or tag
  4. Adding an about page
  5. Adding a cover page
  6. Customization
    1. Adding custom CSS
    2. Adding custom HTML to the head
    3. Adding custom HTML to the body
  7. Adding a welcome page*
  8. Adding a projects page*
  9. Adding a project*
  10. Adding a resume*
    1. Adding a specialized resume or multiple resumes

Adding a page

You can add generic pages that support markdown content but aren’t blog posts. For example, this documentation is written in markdown, consisting of several generic pages.

To add a page, create a new markdown file and put layout: page in a front matter

---
layout: page
title:  Documentation
---

Now you can add content as you would in a blog post.

Adding an entry to the sidebar

Hydejack’s sidebar can add links to any page within the site. In order for a page to appear in the sidebar, it needs to have a truthy menu value defined in its front matter. The page also needs to have a title, otherwise the entry in the sidebar will be blank.

If you want the link to appear at a particular position, you can set a numeric value to the order key. However, the page is not guaranteed to appear in a specific position when you set a certain number, as it will only be used to sort the pages. The position of a page also depends on the order of all other pages in the sidebar.

If you don’t want to spread the sidebar definitions across multiple markdown files, you can manage them centrally in your config file using front matter defaults, e.g.:

# file: _config.yml
defaults:
  - scope:
      path: blog.md
    values:
      menu: true
      order: 1
  - scope:
      path: projects.md
    values:
      menu: true
      order: 2
  - scope:
      path: resume.md
    values:
      menu: true
      order: 3
  - scope:
      path: about.md
    values:
      menu: true
      order: 4

You can add links to external pages to the sidebar by creating a new markdown file for each entry and adding to the front matter:

---
title: External
redirect_to: https://example.com/
menu: true
order: 5
---

You may combine this with the jekyll-redirect-from plugin to generate a redirect page at the location of the file, but this is optional.

Adding a category or tag

Hydejack allows you to use the list layout to show all posts of a particular category or tag.

Before you start, make sure your config files contains the features_categories and featured_tags collections:

# file: _config.yml
collections:
  featured_categories:
    permalink:         /:name/
    output:            true
  featured_tags:
    permalink:         /tag-:name/
    output:            true

Recap: Categories and tags in Jekyll

Posts in Jekyll can belong to one or more categories, as well as one or more tags. They are defined in a post’s front matter:

---
layout:     post
title:      Welcome to Jekyll
categories: [jekyll, update]
tags:       [jekyll, update]
---

Posts can also be assigned to a category based on their position within the folder structure, e.g.

├── jekyll
│   └── update
│       └── _posts
│           └── 2017-04-07-welcome-to-jekyll.markdown

This will place “Welcome to Jekyll” in the categories jekyll and update.

NOTE: This is now the preferred way of assigning categories in Hydejack, as it makes URLs correspond more naturally to the underlying folder structure.

Whether you use this method or not, categories will always be part of a posts URL, while tags will not.

TypeURL
Categories/jekyll/update/2017-04-07-welcome-to-jekyll/
Tags/2017-04-07-welcome-to-jekyll/

As far as Jekyll is concerned, this is the only difference.

Categories and tags in Hydejack

Categories and tags are displayed by Hydejack below the title, after the date. Categories are displayed with the preposition “in”, while tags are displayed with the preposition “on”, e.g.

TypeTitle
CategoriesWelcome to Jekyll¬ 07 Apr 2017 in Jekyll / Update
TagsWelcome to Jekyll¬ 07 Apr 2017 on Jekyll, Update
BothWelcome to Jekyll¬ 07 Apr 2017 in Jekyll / Update on Jekyll, Update

You can adjust these in _data/string.yml.

Creating a new category or tag

Be default, categories and tags are rendered as plain text. Further steps are necessary if you want them to link to a page that contains a list of all posts that belong to that category or tag.

For each featured category or tag, a file called <category-name>.md or <tag-name>.md has to be created inside the _featured_tags and _featured_categories folders, respectively. Each file in these folders is part of a Jekyll Collection.

The meta data of a category or tag is set in the files front matter, e.g.

---
# file: _featured_categories/hyde.md
layout: list
title:  Hyde
slug:   hyde
description: >
  Hyde is a brazen two-column [Jekyll](http://jekyllrb.com) theme.
  It's based on [Poole](http://getpoole.com), the Jekyll butler.
---
layout
Must be list
title
Used as title of the page, as well as name of the category or tag as part of the line below a blog post’s title. Can be different from the name of the tag or category, as long as slug is identical to the name.
slug
Must be identical to the key used in the blog’s front matter, i.e. if you use categories: [jekyll] the slug must be jekyll. By default, the slug is derived from the title, but here it is recommended that you set it explicitly.
description
A medium-length description, used on the tag or category’s detail page and shown in a message box below the title.
menu
Set to to true if you want the category or tag to appear in the sidebar. For more information, see Adding an entry to the sidebar.

Once the file is created, the page can be found at /category/<categoryname>/ or /tag/<tagname>/.

Adding an about page

About pages are a frequent use case, so Hydejack has a special layout for it. It is a slight modification of the page layout that allows showing the author information by adding the <!--author--> marker somewhere on the page.

To create an about page, make sure layout is set to about. For more on authors, see Adding an author.

---
# file: about.md
layout: about
title:  About
---

Adding a cover page

Hydejack 8 introduces cover pages, i.e. pages witht he sidebar opened, so that it spans the entire screen. This feature is intended for landing pages. To enable it on a page, simply add cover: true to the front matter.

Cover page example

Customization

Adding custom CSS

The quickest and safest way to add custom CSS to Hydejack is via the _sass/my-inline.scss and _sass/my-style.scss files (create the folder/the files if they don’t exist).

To add CSS that gets inlined into the page, i.e. is loaded with the first request, put the CSS rules into my-inline.scss. This is intended for above-the-fold content. Otherwise put the CSS rules into my-style.scss. Note that this distinction has no effect when no_inline_css is enabled.

Adding custom HTML to the head

To add custom HTML elements to the <head> of the document, open _includes/my-head.html (create the folder/the files if they don’t exist) and add your elements there.

Adding custom HTML to the body

To add custom HTML elements to the <body> of the document, open _includes/my-body.html (create the folder/the files if they don’t exist) and add your elements there.

What’s the difference to my-scripts.html?
This file was used in earlier versions of Hydejack to accomplish the same goal. However, there are still instances were you might want to prefer my-scripts.html over my-body.html, as it won’t load scrips on redirect pages and will be ignored by browsers < IE10.

Adding a welcome page*

If you bought the PRO version of Hydejack you have access to the welcome layout. It is intended to showcase your projects and blog posts in a compact way. Technically, it is a modified version of the about layout, so it allows showing the author information where the <!--author--> marker is put. Demo.

You can create a welcome page by creating a new markdown file and setting the layout to welcome in the front matter.

---
# file: index.md
layout: welcome
title:  Welcome
cover:  true
---

Without further configuration, the welcome page will just look like a regular page. To show the two most recent projects, add the <!--projects--> marker to the content. To show the five most recent blog posts, add the <!--posts--> marker to the content.

The welcome layout also supports selecting specific projects and posts, by adding to the front matter, e.g.:

---
# file: index.md
selected_projects:
  - _projects/hydejack-v6.md
  - _projects/hyde-v2.md
more_projects: projects.md
selected_posts:
  - _posts/2017-05-03-javascripten.md
  - _posts/2012-02-07-example-content.md
more_posts: posts.md
featured: true
---
selected_projects
A list of paths to project files that should be displayed below the main content of the page. The paths are relative to the main directory with no leading ./. If no paths are provided, the two most recent projects will be used.
more_projects
The path to the main projects page. The path is relative to the main directory with no leading ./.
selected_projects
A list of paths to blog posts that should be featured on the welcome page. The paths are relative to the main directory with no leading ./. If no paths are provided, the five most recent posts will be used.
more_posts
The path to the main posts page. The path is relative to the main directory with no leading ./.
featured
Optional. When true, project thumbnails will span the full width instead of half. This setting takes precedence over the featured value of individual projects, i.e. it will apply to the entire page.

Adding a projects page*

The projects page will show all projects in a particular collection. First, you need to make sure that you have the projects collection defined in _config.yml:

# file: _config.yml
collections:
  projects:
    permalink: /projects/:path/
    output:    true

Next, add a projects.md to in the root (you can adjust the name/location to match the the permalink of the collection). This file has the projects layout (mind the “s” at the end) and should have a show_collection key, with the name of the collection as a value, e.g.:

---
# file: projects.md
layout:          projects
title:           Projects*
show_collection: projects
featured:        true
---
layout
Must be projects.
title
The title of the page. Note that this name is reused as part of each individual project page (for the link that directs back to the projects page).
show_collection
The name of the collection you want display on this page. Defaults to projects.
featured
Optional. When true, project thumbnails will span the full width, instead of only half. This setting takes precedence over the featured value of individual projects, i.e. it will apply to the entire page.

Adding a project*

Projects are organized using Jekyll Collections. Each project generates an entry on the projects layout (Demo) as well as its own detail page (Demo).

Each project is defined by a file in the _projects directory. The project’s meta information is defined in the file’s front matter. You can also add markdown content. A project’s front matter should look like:

---
# file: _projects/hyde-v2.md
layout:      project
title:       Hyde v2*
date:        2 Jan 2014
screenshot:
  src:       /assets/img/projects/[email protected],25x.jpg
  srcset:
    1920w:   /assets/img/projects/hyde-v2.jpg
    960w:    /assets/img/projects/[email protected],5x.jpg
    480w:    /assets/img/projects/[email protected],25x.jpg
caption:     Hyde is a brazen two-column Jekyll theme.
description: >
  Hyde is a brazen two-column [Jekyll](http://jekyllrb.com) theme.
  It's based on [Poole](http://getpoole.com), the Jekyll butler.
links:
  - title:   Demo
    url:     http://hyde.getpoole.com
  - title:   Source
    url:     https://github.com/poole/hyde
featured:    false
---
layout
Must be set to project
date
Providing a year is the minimum requirement. Used to sort the projects.
screenshot
A 16:9 screenshot of the project.

You can pass an URL to an image, but it is recommended that you provide a src-srcset pair (see example above).

Hydejack will show the screenshot in various sizes, depending on the screen width, so that no specific size will fit all. Instead, it is recommended that you use a mipmap-like approach, providing the image in multiple sizes, each image half the width of the previous one. The src key is a fallback image for browsers that don’t support the srcset attribute. The keys of the srcset hash will be used as descriptors.

For more information on srcset, see the documentation at MDN, or this article from CSS-Tricks.

caption
A short description, shown as part of each “project card” in the projects layout.
description
A medium-length description, used on the project’s detail page as meta description and shown as message box below the screenshot.
links
A list of title-url pairs that link to external resources related to this project.
author
Optional. The author shown below the project, similar to posts.
featured
Optional. When true, the project preview will span the full content width. You can use this for projects that should receive more attention. You can set/override this for an entire page, by setting featured in the front matter (applies to the projects and welcome layout).

Adding a resume*

Hydejack’s PRO version features a generalized resume layout. Demo.

It generates the resume page from a valid JSON Resume, which is good news if you already have a JSON resume. Otherwise, there are various ways of obtaining one:

Once you have a JSON Resume, place it into _data.

To render a resume page, create a new markdown file and set the layout to resume in the front matter:

---
# file: resume.md
layout: resume
title:  Resume
description: >
  A short description of the page for search engines (~150 characters long).
---

NOTE: You can download the final resume.json (minified) from the assets folder. When running locally, you can find it at _site/assets/resume.json.

Adding a specialized resume or multiple resumes

You can add a specialized resume or multiple resumes by adding the resume YAML to the front matter under the resume key. E.g.:

---
# file: resume.md
layout: resume
title:  Resume
description: >
  A short description of the page for search engines (~150 characters long).
resume:
  basics:
    name: "Richard Hendricks"
    label: "Programmer"
    picture: "/assets/icons/icon.png"
  # ...
---

Continue with Writing

This chapters shows how to prepare your Hydejack site for a production build and deployment on 3rd party hosting providers.

Table of Contents

  1. Starter Kit
  2. Preparation
  3. Building locally
  4. Building locally with latent semantic analysis
  5. GitHub Pages

Starter Kit

If you’re using the starter kit, all you have to do is push your repository:

$ git add .
$ git commit "Update"
$ git push origin master

Preparation

Before building, make sure the following is part of your config file:

# file: _config.yml
compress_html:
  comments:  ["<!-- ", " -->"]
  clippings: all
  endings:   all

sass:
  style:     compressed

You can check out jekyll-compress-html and https://jekyllrb.com/docs/assets/#sassscss for details.

Building locally

When building Hydejack it is important to set the environment variable JEKYLL_ENV to production. Otherwise the output will not be minified. Building itself happens via Jekyll’s build command.

$ JEKYLL_ENV=production bundle exec jekyll build

This will generate the finished static files in _site, which can be deployed using the methods outlined in the Jekyll Documentation.

Building locally with latent semantic analysis

By default, related posts are simply the most recent posts. Hydejack modifies this a bit, by showing the most recent posts of the same category or tag. However, the results are still pretty “unrelated”. To provide better results, Jekyll supports latent semantic analysis via classifier-reborn’s Latent Semantic Indexer

To use the LSI, you first have to disable Hydejack’s default behavior, by setting use_lsi: true under the hydejack key in your config file.

# file: _config.yml
hydejack:
  use_lsi: true

Then, you have to run jekyll build with the --lsi flag:

$ JEKYLL_ENV=production bundle exec jekyll build --lsi

Note that this may take a long time. Once it is finished, the generated static files will be located in the _site directory, which can be deployed using the methods outlined in the Jekyll Documentation.

GitHub Pages

To deploy to GitHub Pages, the steps are:

$ cd _site
$ git init # you only need to do this once
$ git remote add origin <github_remote_url> # you only need to do this once
$ git add .
$ git commit -m "Build"
$ git push origin master:<remote_branch>
$ cd ..
github_remote_url
Find this on your repository’s GitHub page.
remote_branch
Either master for “user or organization pages”, or gh-pages for “project pages”

More on user, organization, and project pages.

Continue with Advanced

Once Jekyll is running, you can start with basic configuration by adding various entries to _config.yml. Besides these descriptions, you can also read the annotated config file.

NOTE: When making changes to _config.yml, it is necessary to restart the Jekyll process for changes to take effect.

Table of Contents

  1. Setting url and baseurl
    1. GitHub Pages
  2. Changing accent colors and sidebar images
  3. Changing fonts
    1. Using safe web fonts
  4. Choosing a blog layout
    1. Using the blog layout in a subdirectory
  5. Adding an author
    1. Adding an author’s picture
    2. Adding social media icons
    3. Adding an email, RSS icon or download icon
  6. Enabling comments
  7. Enabling Google Analytics
    1. Using a custom analytics provider
  8. Changing built-in strings
  9. Adding legal documents
  10. Adding custom favicons and app icons
  11. Enabling newsletter boxes*
  12. Enabling Dark Mode*

Setting url and baseurl

The first order of business should be to set the correct url and baseurl values in _config.yml.

The url is the domain of your site, including the protocol (http or https). For this site, it is

# file: _config.yml
url: https://qwtel.com

If your entire Jekyll blog is hosted in a subdirectory of your page, provide the path in baseurl with a leading /, but no trailing /, e.g.

# file: _config.yml
baseurl: /hydejack

Otherwise, provide the empty string ''

GitHub Pages

When hosting on GitHub Pages the url is https://<username>.github.io (unless you are using a custom domain).

The baseurl depends on the kind of page you are hosting.

For for information on the types of pages you can host on GitHub, see the GitHub Help article.

Changing accent colors and sidebar images

Hydejack allows you to choose the background image of the sidebar, as well as the accent color (color of the links, selection and focus outline, etc…) on a per-page, per-category, per-tag, per-author and global basis.

Set the fallback values in _config.yml, which are used should no other rule (page, category, tag, author) apply:

# file: _config.yml
accent_image: /assets/img/sidebar-bg.jpg
accent_color: rgb(79,177,186)

NOTE: I recommend using a blurred image in order for the text to remain readable. If you save a blurred image as JPG, it will also drastically reduce its file size.

The accent_image property also accepts the special value none which will remove the default image.

Hydejack also has a theme_color property. When set, it will change the background color of the sidebar, as well as set the theme_color property in the Web App Manifest. In some browsers, such as Chrome on Android, this will change the color of the browser’s UI components. The property can be overridden on a per-page basis, by setting it in the front matter.

Changing fonts

Hydejack lets you configure the font of regular text and headlines, and it has built-in support for Google Fonts. There are three keys in _config.yml associated with this: font, font_heading and google_fonts. The defaults are:

# file: _config.yml
font:         Noto Sans, Helvetica, Arial, sans-serif
font_heading: Roboto Slab, Helvetica, Arial, sans-serif
google_fonts: Roboto+Slab:700|Noto+Sans:400,400i,700,700i

font and font_heading must be valid CSS font-family values. When using Google Fonts make sure they consist of at least two fonts (everything except the first entry will be used as a fallback until the fonts have completed loading).

The google_fonts key is the string necessary to fetch the fonts from Google. You can get it from the download page at Google Fonts after you’ve selected one or more fonts:

Where to get the google_fonts string

Using safe web fonts

If you prefer not to use Google Fonts and use safe web fonts instead, set no_google_fonts to true:

# file: _config.yml
hydejack:
  no_google_fonts: true

In this case, font and font_heading do not have to contain more than one font. You may also remove the google_fonts key in this case.

Choosing a blog layout

Hydejack features two layouts for showing your blog posts.

In order to use the list layout add the following front-matter to a new markdown file:

---
layout: list
title:  Home
---

If you want to use the blog layout, you need to add jekyll-paginate to your Gemfile and to the plugins list in your config file:

# file: Gemfile
gem "jekyll-paginate"
# file: _config.yml
plugins:
  - jekyll-paginate

You also need to add the paginate and paginate_path keys to your config file, e.g.

# file: _config.yml
paginate:      5
paginate_path: '/page-:num/'

The blog layout needs to be applied to a file with the .html file extension and the paginate_path needs to match the path to the index.html file. To match the paginate_path above, put a index.html with the following front matter in the root directory:

---
# file: index.html
layout: blog
title: Blog
---

For more information see Pagination.

Using the blog layout in a subdirectory

If you want to use the blog layout at a URL like /my-blog/, create the following folder structure:

├── my-blog
│   └── index.html
├── !my-blog.md
└── _config.yml

You can use the same index.html as before:

---
# file: my-blog/index.html
layout: blog
title: Blog
---

(Optional) If you want to add a link to the blog in the sidebar, DO NOT add the menu key to the front matter of my-blog/index.html. Instead, create a new markdown file called !my-blog.md with menu and permalink keys:

---
# file: !my-blog.md
title: My Blog
menu: true
permalink: /my-blog/
sitemap: false
---

Finally, in your config file, make sue the paginate_path matches the permalink:

# file: _config.yml
paginate:      5
paginate_path: /my-blog/page-:num/

Adding an author

At a bare minimum, you should add an author key with a name and email sub-key (used by the feed plugin) to to your config file:

# file: _config.yml
author:
  name:  Florian Klampfer
  email: [email protected]

If you would like the author to be displayed in the about section below a post or project*, add an about key and provide markdown content. I recommend using the YAML pipe | syntax, so you can include multiple paragraphs:

# file: _config.yml
author:
  name:  Florian Klampfer
  email: [email protected]
  about: |
    Hi, I'm Florian or @qwtel...

    This is another paragraph.

Adding an author’s picture

If you’d like for the author’s picture to appear in addition the the about text (see above), you can either use the jekyll-avatar plugin or provide URLs to images manually.

To use the plugin, add it to your Gemfile and the list of plugins in your config file:

# file: Gemfile
gem "jekyll-avatar"
# file: _config.yml
plugins:
  - jekyll-avatar

Run bundle install for the changes to take effect.

Make sure you have provided a GitHub username in your config file (github_username), or to the author key (author.social.github, author.github.username, or author.github). See Adding social media icons for more.

To set an image manually, you have to provide an URL to the author’s picture key:

# file: _config.yml
author:
  picture:  /assets/img/me.jpg

If you’d like to provide multiple versions for screens with different pixel densities, you can provide path and srcset keys instead:

# file: _config.yml
author:
  picture:
    path:   /assets/img/me.jpg
    srcset:
      1x:   /assets/img/me.jpg
      2x:   /assets/img/[email protected]

The keys of the srcset hash will be used as image descriptors. For more information on srcset, see the documentation at MDN, or this article from CSS-Tricks.

Adding social media icons

Hydejack supports a variety of social media icons out of the box. These are defined on a per-author basis, so make sure you’ve followed the steps in Adding an author.

NOTE: If you are using the gem-based version of Hydejack, download social.yml and put it into _data in the root directory. This is necessary because gem-based themes do not support including _data.

You can add a link to a social network by adding an entry to the social key in to an author. It consists of the name of the social network as key and your username within that network as value, e.g.

# file: _config.yml
author:
  social:
    twitter: qwtel
    github:  qwtel

Check out authors.yml to see which networks are available. You can also follow the steps here to add your own social media icons.

You can change the order in which the icons appear by moving lines up or down, e.g.

# file: _config.yml
author:
  social:
    github:  qwtel # now github appears first
    twitter: qwtel

To get an overview of which networks are available and how a typical username in that network looks like, see the included authors.yml.

Should providing a username not produce a correct link for some reason, you can provide a complete URL instead, e.g.

# file: _config.yml
author:
  social:
    youtube: https://www.youtube.com/channel/UCu0PYX_kVANdmgIZ4bw6_kA

NOTE: You can add any platform, even if it’s not defined in social.yml, by providing a complete URL. However, a fallback icon will be used when no icon is available. Supplying your own icons is an advanced topic.

Adding an email, RSS icon or download icon

If you’d like to add an email , RSS , or download icon to the list, add the email, rss, or download key, e.g.:

# file: _config.yml
author:
  social:
    email:    [email protected]
    rss:      https://read.murrielgrace.com/feed.xml # make sure you provide an absolute URL
    download: https://github.com/qwtel/hydejack/archive/v8.1.1.zip

Enabling comments

Hydejack supports comments via Disqus. Before you can add comments to a page you need to register and add your site to Disqus’ admin console. Once you have obtained your “Disqus shortname”, you include it in your config file:

# file: _config.yml
disqus: <disqus shortname>

Now comments can be enabled by adding comments: true to the front matter.

---
layout:   post
title:    Hello World
comments: true
---

You can enable comments for entire classes of pages by using front matter defaults. E.g. to enable comments on all posts, add to your config file:

# file: _config.yml
defaults:
  - scope:
      type: posts
    values:
      comments: true

Enabling Google Analytics

Enabling Google Analytics is as simple as setting the google_analytics key.

# file: _config.yml
google_analytics: UA-XXXXXXXX-X

Conversely, if you want to disable it, you only have to remove the google_analytics key and no GA code will be part of the generated site.

Using a custom analytics provider

If you want to use a different analytics provider, e.g. Matomo, you can add its code snippet to _includes/my-body.html (create if it doesn’t exist). The default file contains example code for using Matomo.

Changing built-in strings

You can change the wording of built-in strings like “Related Posts” or “Read more” in _data/strings.yml.

If you are using the gem-based version the file doesn’t exist, but you can get the default file here.

You will frequently find markers like <!--post_title-->. You can place them freely within your string and they will be replaced with the content they refer to.

You may also use this feature to translate the theme into different languages. In this case you should also set the lang key to your config file, e.g.

# file: _config.yml
lang: cc-ll

where cc is the 2-letter country code and ll specifies a 2-letter location code, e.g.: de-at.

You may also change the strings used for formatting dates and times (look out for the date_formats key), but be aware that the values you provide need to be valid Ruby format directives.

If you have pages for contact data, privacy policy, cookie policy, etc. you can add links to them in the footer by listing them under the legal key in your config file as follows:

legal:
  - title: Impress
    href:  /impress/
  - title: Cookies Policy
    href:  /cookies-policy/

When using Hydejack’s offline feature, the pages listed here will be downloaded and cached when loading the page for the first time.

Adding custom favicons and app icons

By default, Hydejack includes its own favicon, as well as app icons for in five different resolutions.

To change the favicon, place your own favicon.ico into assets/icons/ (create the folder if it doesn’t exist).

To use your own app icons, you need to prepare five square PNG files in the following resolutions, and put them into assets/icons/ (create the folder if it doesn’t exist):

NamePixels
[email protected]576x576
[email protected]384x384
icon.png192x192
[email protected],75x.png144x144
[email protected],5x.png96x96
[email protected],25x.png48x48

Additionally, you can provide tiles for Window 10:

NamePixels
tile-large.png558x588
tile-medium.png270x270
tile-small.png70x70
tile-wide.png558x270

If you don’t want to use PNGs, or want to use different resolutions, you have to provide your own assets/manifest.json (and assets/ieconfig.xml when supporting Window 10). For more on web app manifests, see MDN.

NOTE: In any case, Hydejack expects a assets/icons/icon.png file for use as apple-touch-icon and a assets/icons/favicon.ico for use as shortcut icon.

Enabling newsletter boxes*

To enable showing newsletter subscription boxes below each post and project, provide your Tinyletter username to the tinyletter key in the config file.

# file: _config.yml
tinyletter:  <tinyletter username>

To edit the content of the newsletter box, open _data/strings.yml, and change the entries under the tinyletter key.

If want to use a different mailing provider you can build your own form, and insert it into _includes/my-newsletter.html. The file includes an example form for MailChimp, where you need to fill in site.mailchimp.action and site.mailchimp.hidden_input (you can get these from MailChimp).

To build a completely new from, you can use the same CSS classes as Bootstrap. Note that only form, grid and utility classes are available. Check out Forms by Example for more examples.

Enabling Dark Mode*

Buyers of the PRO version have access to a dark-themed version of Hydejack.

Dark mode can be enabled in config.yml under the hydejack key and has three settings and two adjustments:

hydejack:
  dark_mode:
    dynamic: true
    sunrise: 6
    sunset:  18
    icon:    true
    always:  false

Setting dynamic, will enable dark mode based on the client’s local time (unlike location-based sunset calculations, this approach does not require a permission form the user). You can adjust sunrise and sunset to change when to show the light/dark theme.

Setting icon will show a switch to alternate between the light and dark mode at the top of the page.

Finally, setting always will cause dark mode to become the default theme at all times (combine with dynamic: false).

Continue with Basics /*! * __ __ __ __ * /\ \/\ \ /\ \ __ /\ \ * \ \ \_\ \ __ __ \_\ \ __ /\_\ __ ___ \ \ \/'\ * \ \ _ \ /\ \/\ \ /'_` \ /'__`\ \/\ \ /'__`\ /'___\\ \ , < * \ \ \ \ \\ \ \_\ \ /\ \L\ \ /\ __/ \ \ \ /\ \L\.\_ /\ \__/ \ \ \\`\ * \ \_\ \_\\/`____ \\ \___,_\\ \____\ _\ \ \\ \__/.\_\\ \____\ \ \_\ \_\ * \/_/\/_/ `/___/> \\/__,_ / \/____//\ \_\ \\/__/\/_/ \/____/ \/_/\/_/ * /\___/ \ \____/ * \/__/ \/___/ * * Powered by Hydejack v8.1.1 <https://hydejack.com/> * * * I like it so I'm keeping it. <3 */ body{--code-font-family: Menlo,Monaco,Consolas,monospace;--font-weight: 400;--font-weight-bold: 700;--font-weight-heading: 400;--text-muted: #888;--gray-bg: rgba(0,0,0,0.025);--gray-text: #666;--menu-text: #bbb;--body-color: #333;--body-bg: #fff;--border-color: #ebebeb}.clearfix{content:"";display:table;clear:both}.color-transition,blockquote,.faded,.read-more,figure,.figure,table:not(.highlight) thead,table:not(.highlight) thead+tbody,table:not(.highlight) tbody+tbody,table:not(.highlight) tfoot,table:not(.highlight) tbody tr:nth-child(even) td,table:not(.highlight) tbody tr:nth-child(even) th,table:not(.highlight) tbody tr:nth-child(odd) td,table:not(.highlight) tbody tr:nth-child(odd) th,.footnotes::before,code,.pagination,#_cookies-banner{transition:background-color 1s ease, border-color 1s ease}.no-color-transition{transition:none !important}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}[tabindex="-1"]:focus{outline:none !important}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}a,area,button,[role="button"],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}figure{margin:0 0 1rem}label{display:inline-block;margin-bottom:.25rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none !important}@media print{a:not(.no-print-link)::after{content:" (" attr(href) ") ";font-size:.83em;opacity:0.67}}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6,.heading{text-rendering:optimizeLegibility}h1+h2,.h1+.h2,h1+.h2,.h1+h2,h2+h3,.h2+.h3,h2+.h3,.h2+h3,h3+h4,.h3+.h4,h3+.h4,.h3+h4,h4+h5,.h4+.h5,h4+.h5,.h4+h5,h5+h6,.h5+.h6,h5+.h6,.h5+h6{margin-top:0}dt,strong{font-weight:var(--font-weight-bold)}dd{margin-bottom:.5rem}abbr{font-size:85%;font-weight:var(--font-weight-bold);text-transform:uppercase}abbr[title]{cursor:help;border-bottom:1px dotted var(--border-color)}blockquote{padding:.5rem 1rem;margin:.8rem 0;color:var(--text-muted);border-left:0.25rem solid var(--border-color)}blockquote.lead{font-size:1.2em;margin-top:1.5rem;margin-bottom:1.5rem;border-left-width:0.4rem}blockquote>p:last-child{margin-bottom:0}.heading{font-weight:var(--font-weight-heading)}.fine,figure,.figure{font-size:.83em}.faded,.read-more,figure,.figure{color:var(--text-muted)}.centered,figure,.figure{text-align:center}h1[id],h2[id],h3[id],h4[id],h5[id],h6[id]{position:relative}@media screen{h1[id]>.permalink,h2[id]>.permalink,h3[id]>.permalink,h4[id]>.permalink,h5[id]>.permalink,h6[id]>.permalink{border-bottom:none;opacity:0;width:1.5rem;text-align:center;float:right;transition:opacity 400ms;will-change:opacity}}@media screen and (min-width: 44em){h1[id]>.permalink,h2[id]>.permalink,h3[id]>.permalink,h4[id]>.permalink,h5[id]>.permalink,h6[id]>.permalink{float:none;position:absolute;top:0;left:-1.75rem}}@media print{h1[id]>.permalink,h2[id]>.permalink,h3[id]>.permalink,h4[id]>.permalink,h5[id]>.permalink,h6[id]>.permalink{display:none}}h1[id]:hover>.permalink,h2[id]:hover>.permalink,h3[id]:hover>.permalink,h4[id]:hover>.permalink,h5[id]:hover>.permalink,h6[id]:hover>.permalink{opacity:0.5}h1[id]>.permalink:hover,h1[id]>.permalink:focus,h2[id]>.permalink:hover,h2[id]>.permalink:focus,h3[id]>.permalink:hover,h3[id]>.permalink:focus,h4[id]>.permalink:hover,h4[id]>.permalink:focus,h5[id]>.permalink:hover,h5[id]>.permalink:focus,h6[id]>.permalink:hover,h6[id]>.permalink:focus{opacity:1;transition:opacity 200ms}@media print{h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6,dt{page-break-inside:avoid;break-inside:avoid-page;page-break-after:avoid;break-after:avoid-page}}table:not(.highlight){display:block;vertical-align:top;overflow-x:auto;-webkit-overflow-scrolling:touch}table:not(.highlight) thead{background-color:var(--body-bg)}table:not(.highlight) thead+tbody,table:not(.highlight) tbody+tbody,table:not(.highlight) tfoot{border-top:3px double var(--border-color)}table:not(.highlight) tbody tr:nth-child(even) td,table:not(.highlight) tbody tr:nth-child(even) th{background-color:var(--body-bg)}table:not(.highlight) tbody tr:nth-child(odd) td,table:not(.highlight) tbody tr:nth-child(odd) th{background-color:var(--gray-bg)}@media print{table:not(.highlight){width:100% !important}}table.stretch-table{display:table;width:100% !important;width:calc(100% + 2rem) !important}table.scroll-table{white-space:nowrap}table.flip-table{display:flex;overflow:hidden}table.flip-table thead,table.flip-table thead+tbody,table.flip-table tbody+tbody{border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}table.flip-table thead,table.flip-table tbody{display:flex}table.flip-table thead{flex-shrink:0;min-width:min-content}table.flip-table thead th{padding-left:1rem}table.flip-table tbody{position:relative;overflow-x:auto;overflow-y:hidden;padding-left:1px;-webkit-overflow-scrolling:touch}table.flip-table tr{display:flex;flex-direction:column;min-width:min-content;flex-shrink:0}table.flip-table tr td{border-left:none}table.flip-table tr:first-child td{border-left:1px solid var(--border-color)}table.flip-table tr:last-child td{padding-right:1rem;border-right:1px solid var(--border-color)}table.flip-table td,table.flip-table th{display:block;border-bottom:none}table.flip-table td:first-child,table.flip-table th:first-child{padding-left:.5rem;border-top:none}table.flip-table td:last-child,table.flip-table th:last-child{padding-right:.5rem}@media screen and (max-width: 72em){table.scroll-table-small{white-space:nowrap}table.flip-table-small{display:flex;overflow:hidden}table.flip-table-small thead,table.flip-table-small thead+tbody,table.flip-table-small tbody+tbody{border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}table.flip-table-small thead,table.flip-table-small tbody{display:flex}table.flip-table-small thead{flex-shrink:0;min-width:min-content}table.flip-table-small thead th{padding-left:1rem}table.flip-table-small tbody{position:relative;overflow-x:auto;overflow-y:hidden;padding-left:1px;-webkit-overflow-scrolling:touch}table.flip-table-small tr{display:flex;flex-direction:column;min-width:min-content;flex-shrink:0}table.flip-table-small tr td{border-left:none}table.flip-table-small tr:first-child td{border-left:1px solid var(--border-color)}table.flip-table-small tr:last-child td{padding-right:1rem;border-right:1px solid var(--border-color)}table.flip-table-small td,table.flip-table-small th{display:block;border-bottom:none}table.flip-table-small td:first-child,table.flip-table-small th:first-child{padding-left:.5rem;border-top:none}table.flip-table-small td:last-child,table.flip-table-small th:last-child{padding-right:.5rem}}footer{margin-bottom:2rem}a[href^="#fn:"],a[href^="#fnref:"]{margin-left:.1rem;font-weight:var(--font-weight-bold)}@media screen and (max-width: 73.5em){a[href^="#fn:"],a[href^="#fnref:"]{font-weight:normal}}sup{line-height:1}@media screen and (max-width: 72em){sup[id^="fnref"]{vertical-align:baseline;font-size:inherit}sup[id^="fnref"]>a::before{content:"["}sup[id^="fnref"]>a::after{content:"]"}}.footnotes{margin-top:5rem}.footnotes>ol{color:var(--text-muted)}.footnotes>ol>li{padding:.5rem;margin-left:.5rem}.footnotes>ol>li>p{margin:0}.footnotes>ol>li:focus{outline:none;color:var(--gray-text);background:var(--gray-bg)}.footnotes::before{content:"";display:block;margin:1.5rem 0;border:0;border-top:1px solid var(--border-color)}code,pre{font-family:var(--code-font-family)}code{padding:.25em .5em;background-color:var(--gray-bg);font-size:.85em}.pre-base,pre,article .katex-display,article div.MathJax_Preview{margin-left:-1rem;margin-right:-1rem;padding:1rem;background-color:var(--gray-bg);overflow-x:auto;-webkit-overflow-scrolling:touch;backface-visibility:hidden}@media print{.pre-base,pre,article .katex-display,article div.MathJax_Preview{width:100% !important;page-break-inside:avoid;break-inside:avoid-page}}pre{margin-top:0;display:block;line-height:1.4;font-size:.85em}pre>code{padding:0;color:inherit;background-color:transparent;font-size:1em}pre,.highlight{margin-bottom:2rem}hr.dingbat{border:0}hr.dingbat::after{content:"\2756";display:block;text-align:center;font-size:1.5rem;color:var(--menu-text)}@media print{.comments{display:none}}.read-more{margin-top:2rem;margin-bottom:3rem}.read-more::after{content:" \2192";font-family:"icomoon" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;font-size:smaller;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pagination{width:calc(100% + 2rem);margin:0 -1rem 1rem;color:var(--text-muted);text-align:center}.pagination>ul{list-style:none;padding:0}.pagination-item>*{display:block;padding:.25rem 1rem;border:solid var(--border-color);border-width:1px 0;transition:border-color 1s ease}.pagination-item>a,.pagination-item>a:hover,.pagination-item>a:focus{border-color:var(--border-color) !important}.pagination-item:first-child>*{margin-bottom:-1px}.pagination-item>a:hover,.pagination-item a:focus{background-color:var(--gray-bg);border-bottom:1px solid var(--border-color)}@media (min-width: 23.5em){.pagination{width:100%;margin:3rem 0}.pagination-item>*{float:left;width:50%;border-width:1px}.pagination-item:first-child>*{margin-bottom:0;border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem}.pagination-item:last-child>*{margin-left:-1px;border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem}}body{display:block;position:relative;overflow-x:hidden}hy-push-state,hy-drawer{display:block;overflow:hidden}@media print{html{font-size:11pt}}.fl{float:left}.fr{float:right}.mb4{margin-bottom:4rem}.mb6{margin-bottom:6rem}.mt0{margin-top:0}.mt2{margin-top:2rem}.mt3{margin-top:3rem}.mt4{margin-top:4rem}.pb0{padding-bottom:0}.sixteen-nine{position:relative}.sixteen-nine::before{display:block;content:"";width:100%;padding-top:56.25%}.sixteen-nine>*{position:absolute;top:0;left:0;right:0;bottom:0}.sr-only{display:unset;position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.border{transition:border-color 1s ease}hy-push-state a,.a{transition:color 1s, border-color 250ms}hy-push-state a:hover,.a:hover{text-decoration:none;transition:color 1s, border-color 50ms}hy-push-state a.no-hover,.a.no-hover{transition:none}hy-push-state a.no-hover:hover,.a.no-hover:hover{transition:none}.content .img img{object-fit:cover;object-position:center;background-position:center;background-repeat:no-repeat;background-image:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjkwIiB2aWV3Qm94PSIwIDAgMTYwIDkwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuMDQ4ODI4LCAwLCAwLCAwLjA0Nzk5MSwgNTQuOTk5OTczLCAyMC40MjgxNDgpIj4KICAgIDxwYXRoIGQ9Ik05NTkuODg0IDEyOGMwLjA0MCAwLjAzNCAwLjA4MiAwLjA3NiAwLjExNiAwLjExNnY3NjcuNzdjLTAuMDM0IDAuMDQwLTAuMDc2IDAuMDgyLTAuMTE2IDAuMTE2aC04OTUuNzdjLTAuMDQwLTAuMDM0LTAuMDgyLTAuMDc2LTAuMTE0LTAuMTE2di03NjcuNzcyYzAuMDM0LTAuMDQwIDAuMDc2LTAuMDgyIDAuMTE0LTAuMTE0aDg5NS43N3pNOTYwIDY0aC04OTZjLTM1LjIgMC02NCAyOC44LTY0IDY0djc2OGMwIDM1LjIgMjguOCA2NCA2NCA2NGg4OTZjMzUuMiAwIDY0LTI4LjggNjQtNjR2LTc2OGMwLTM1LjItMjguOC02NC02NC02NHYweiIgc3R5bGU9ImZpbGw6IHJnYigyMjEsIDIyMSwgMjIxKTsiLz4KICAgIDxwYXRoIGQ9Ik04MzIgMjg4YzAgNTMuMDIwLTQyLjk4IDk2LTk2IDk2cy05Ni00Mi45OC05Ni05NiA0Mi45OC05NiA5Ni05NiA5NiA0Mi45OCA5NiA5NnoiIHN0eWxlPSJmaWxsOiByZ2IoMjIxLCAyMjEsIDIyMSk7Ii8+CiAgICA8cGF0aCBkPSJNODk2IDgzMmgtNzY4di0xMjhsMjI0LTM4NCAyNTYgMzIwaDY0bDIyNC0xOTJ6IiBzdHlsZT0iZmlsbDogcmdiKDIyMSwgMjIxLCAyMjEpOyIvPgogIDwvZz4KPC9zdmc+")}hy-img{display:block;position:relative}hy-img .loading{background-color:var(--gray-bg);position:absolute;top:0;left:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center}hy-img .loading>*{color:var(--menu-text);font-size:2rem}hy-img img{animation-duration:1000ms;animation-timing-function:ease;animation-name:fade-img}figure,.figure{margin-bottom:2rem}figure>*:first-child,.figure>*:first-child{margin-bottom:.5rem}@keyframes fade-img{from{opacity:0}to{opacity:1}}.animation-main hy-img img{animation:none !important}hy-drawer{z-index:2}@media screen{hy-drawer{--hy-drawer-width: 100%;--hy-drawer-slide-width: calc(100% - .5rem);--hy-drawer-box-shadow: 0 0 1rem rgba(0, 0, 0, 0.25)}}@media screen and (min-width: 64em){hy-drawer{--hy-drawer-slide-width: calc(100% - 21rem)}}@media screen and (min-width: 1666px){hy-drawer{width:calc(50% - 28rem);--hy-drawer-slide-width: calc(50% + 28rem)}}@media screen{hy-drawer.loaded{position:static}}.sidebar a:hover{border-bottom-color:#fff}hy-drawer.loaded .sidebar{min-height:100%}.sidebar-bg.sidebar-overlay::after{background:-moz-linear-gradient(top, rgba(32,32,32,0) 0%, rgba(32,32,32,0.5) 50%, rgba(32,32,32,0) 100%);background:-webkit-linear-gradient(top, rgba(32,32,32,0) 0%, rgba(32,32,32,0.5) 50%, rgba(32,32,32,0) 100%);background:linear-gradient(to bottom, rgba(32,32,32,0) 0%, rgba(32,32,32,0.5) 50%, rgba(32,32,32,0) 100%)}@media print{.sidebar{display:none}}#_swipe{position:absolute;z-index:4;opacity:0.33;top:5vw;right:5vw;transform:scale(0.67)}@media screen and (min-width: 42em){#_swipe{top:calc(50% - 48px);right:10vw;transform:scale(1)}}@media print{.sidebar-social{display:none}}@media print{.navbar{display:none}}.navbar .loading{display:none}#_navbar{position:absolute;height:0}#_cookies-banner{background-color:var(--body-bg);border-top:1px solid var(--border-color)}@media print{.content{padding-bottom:1rem}}.avatar{display:inline-block;position:relative;z-index:1}.avatar img{width:100%}article .katex-display,article div.MathJax_Preview{padding:2rem;text-align:left}article div.MathJax_Preview{font-family:var(--code-font-family);font-size:.75em;line-height:1.45;white-space:pre;margin-bottom:2rem}article span.MathJax_Preview{font-family:var(--code-font-family);padding:.25em .5em;font-size:.85em;background-color:var(--code-bg)}.MathJax_Preview:empty{display:none;visibility:hidden}main>footer{position:absolute;bottom:0;left:.5rem;right:0;padding:0 1rem;color:var(--text-muted);text-align:center}main>footer>p{margin-bottom:0}@media screen and (min-width: 64em){main>footer{left:0}}@media print{main>footer{position:static;margin-top:5rem}main>footer .legal{display:none}}@media screen{a.external::after,a[href*="//"]:not(.no-mark-external):not(.no-mark)::after,a.no-push-state:not(.no-mark-external):not(.no-mark)::after{content:"\00A0\ea7e";font-family:"icomoon" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;font-size:smaller;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;opacity:0.33;transition:opacity 500ms}a.external:hover::after,a.external:focus::after,a[href*="//"]:not(.no-mark-external):not(.no-mark):hover::after,a[href*="//"]:not(.no-mark-external):not(.no-mark):focus::after,a.no-push-state:not(.no-mark-external):not(.no-mark):hover::after,a.no-push-state:not(.no-mark-external):not(.no-mark):focus::after{opacity:1;transition:opacity 100ms}}@media screen{pre,table:not(.highlight),.katex-display,.break-layout{position:relative;width:calc(100% + 2rem)}}@media screen and (min-width: 38rem){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 50vw - 17rem)}}@media screen and (min-width: 54em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 50vw - 19rem)}}@media screen and (min-width: 64em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100vw - 24rem)}}@media screen and (min-width: 72em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 100vw - 64rem)}}@media screen and (min-width: 90em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 100vw - 71rem)}}@media screen and (min-width: 1666px){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 50vw - 22rem)}}.highlight,pre.highlight{color:#383a42}.highlight .ge{font-style:italic}.highlight .gs{font-weight:700}.highlight .ow{font-weight:700}.highlight .n,.highlight .nf,.highlight .nn,.highlight .o,.highlight .p{color:#383a42}.highlight .c,.highlight .c1,.highlight .cm,.highlight .cp,.highlight .cs{color:#a0a1a7;font-style:italic}.highlight .sr,.highlight .ss{color:#0184bc}.highlight .k,.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:#a626a4}.highlight .l,.highlight .ld,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .sd,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{color:#50a14f}.highlight .nt,.highlight .nx,.highlight .vi{color:#e45649}.highlight .il,.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo,.highlight .na{color:#986801}.highlight .bp,.highlight .nb,.highlight .nc,.highlight .nd,.highlight .ne,.highlight .ni,.highlight .nl,.highlight .no,.highlight .nv,.highlight .py,.highlight .vc,.highlight .vg{color:#c18401}.highlight .gd{color:#ff1414}.highlight .gi{color:#2db448}.highlight .w{color:#f8f8f2}.highlight .cpf{color:navy}.highlight .gu{color:#75715e}.highlight .lineno{color:#9d9d9f;user-select:none}.highlight .ln{color:#9d9d9f;user-select:none}.highlight .ln:after{content:" "}.highlight .hll{color:#383a42;background-color:#e5e5e6}.highlight .hl{color:#383a42;background-color:#e5e5e6}.highlight .language-json .w+.s2{color:#e45649}.highlight .language-json .kc{color:#0184bc}.loading>[class*="icon-"]{display:inline-block;-webkit-animation:rotate 2s infinite linear both;animation:rotate 2s infinite linear both;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}@-webkit-keyframes rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.dl-table a{padding-bottom:0.4rem}.dl-table .btn{margin:1.5rem 0} /*! * __ __ __ __ * /\ \/\ \ /\ \ __ /\ \ * \ \ \_\ \ __ __ \_\ \ __ /\_\ __ ___ \ \ \/'\ * \ \ _ \ /\ \/\ \ /'_` \ /'__`\ \/\ \ /'__`\ /'___\\ \ , < * \ \ \ \ \\ \ \_\ \ /\ \L\ \ /\ __/ \ \ \ /\ \L\.\_ /\ \__/ \ \ \\`\ * \ \_\ \_\\/`____ \\ \___,_\\ \____\ _\ \ \\ \__/.\_\\ \____\ \ \_\ \_\ * \/_/\/_/ `/___/> \\/__,_ / \/____//\ \_\ \\/__/\/_/ \/____/ \/_/\/_/ * /\___/ \ \____/ * \/__/ \/___/ * * Powered by Hydejack v8.1.1 <https://hydejack.com/> * * * I like it so I'm keeping it. <3 */ body{--code-font-family: Menlo,Monaco,Consolas,monospace;--font-weight: 400;--font-weight-bold: 700;--font-weight-heading: 400;--text-muted: #888;--gray-bg: rgba(0,0,0,0.025);--gray-text: #666;--menu-text: #bbb;--body-color: #333;--body-bg: #fff;--border-color: #ebebeb}.clearfix{content:"";display:table;clear:both}.color-transition,blockquote,.faded,.read-more,figure,.figure,table:not(.highlight) thead,table:not(.highlight) thead+tbody,table:not(.highlight) tbody+tbody,table:not(.highlight) tfoot,table:not(.highlight) tbody tr:nth-child(even) td,table:not(.highlight) tbody tr:nth-child(even) th,table:not(.highlight) tbody tr:nth-child(odd) td,table:not(.highlight) tbody tr:nth-child(odd) th,.footnotes::before,code,.pagination,#_cookies-banner{transition:background-color 1s ease, border-color 1s ease}.no-color-transition{transition:none !important}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}[tabindex="-1"]:focus{outline:none !important}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}a,area,button,[role="button"],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}figure{margin:0 0 1rem}label{display:inline-block;margin-bottom:.25rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none !important}@media print{a:not(.no-print-link)::after{content:" (" attr(href) ") ";font-size:.83em;opacity:0.67}}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6,.heading{text-rendering:optimizeLegibility}h1+h2,.h1+.h2,h1+.h2,.h1+h2,h2+h3,.h2+.h3,h2+.h3,.h2+h3,h3+h4,.h3+.h4,h3+.h4,.h3+h4,h4+h5,.h4+.h5,h4+.h5,.h4+h5,h5+h6,.h5+.h6,h5+.h6,.h5+h6{margin-top:0}dt,strong{font-weight:var(--font-weight-bold)}dd{margin-bottom:.5rem}abbr{font-size:85%;font-weight:var(--font-weight-bold);text-transform:uppercase}abbr[title]{cursor:help;border-bottom:1px dotted var(--border-color)}blockquote{padding:.5rem 1rem;margin:.8rem 0;color:var(--text-muted);border-left:0.25rem solid var(--border-color)}blockquote.lead{font-size:1.2em;margin-top:1.5rem;margin-bottom:1.5rem;border-left-width:0.4rem}blockquote>p:last-child{margin-bottom:0}.heading{font-weight:var(--font-weight-heading)}.fine,figure,.figure{font-size:.83em}.faded,.read-more,figure,.figure{color:var(--text-muted)}.centered,figure,.figure{text-align:center}h1[id],h2[id],h3[id],h4[id],h5[id],h6[id]{position:relative}@media screen{h1[id]>.permalink,h2[id]>.permalink,h3[id]>.permalink,h4[id]>.permalink,h5[id]>.permalink,h6[id]>.permalink{border-bottom:none;opacity:0;width:1.5rem;text-align:center;float:right;transition:opacity 400ms;will-change:opacity}}@media screen and (min-width: 44em){h1[id]>.permalink,h2[id]>.permalink,h3[id]>.permalink,h4[id]>.permalink,h5[id]>.permalink,h6[id]>.permalink{float:none;position:absolute;top:0;left:-1.75rem}}@media print{h1[id]>.permalink,h2[id]>.permalink,h3[id]>.permalink,h4[id]>.permalink,h5[id]>.permalink,h6[id]>.permalink{display:none}}h1[id]:hover>.permalink,h2[id]:hover>.permalink,h3[id]:hover>.permalink,h4[id]:hover>.permalink,h5[id]:hover>.permalink,h6[id]:hover>.permalink{opacity:0.5}h1[id]>.permalink:hover,h1[id]>.permalink:focus,h2[id]>.permalink:hover,h2[id]>.permalink:focus,h3[id]>.permalink:hover,h3[id]>.permalink:focus,h4[id]>.permalink:hover,h4[id]>.permalink:focus,h5[id]>.permalink:hover,h5[id]>.permalink:focus,h6[id]>.permalink:hover,h6[id]>.permalink:focus{opacity:1;transition:opacity 200ms}@media print{h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6,dt{page-break-inside:avoid;break-inside:avoid-page;page-break-after:avoid;break-after:avoid-page}}table:not(.highlight){display:block;vertical-align:top;overflow-x:auto;-webkit-overflow-scrolling:touch}table:not(.highlight) thead{background-color:var(--body-bg)}table:not(.highlight) thead+tbody,table:not(.highlight) tbody+tbody,table:not(.highlight) tfoot{border-top:3px double var(--border-color)}table:not(.highlight) tbody tr:nth-child(even) td,table:not(.highlight) tbody tr:nth-child(even) th{background-color:var(--body-bg)}table:not(.highlight) tbody tr:nth-child(odd) td,table:not(.highlight) tbody tr:nth-child(odd) th{background-color:var(--gray-bg)}@media print{table:not(.highlight){width:100% !important}}table.stretch-table{display:table;width:100% !important;width:calc(100% + 2rem) !important}table.scroll-table{white-space:nowrap}table.flip-table{display:flex;overflow:hidden}table.flip-table thead,table.flip-table thead+tbody,table.flip-table tbody+tbody{border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}table.flip-table thead,table.flip-table tbody{display:flex}table.flip-table thead{flex-shrink:0;min-width:min-content}table.flip-table thead th{padding-left:1rem}table.flip-table tbody{position:relative;overflow-x:auto;overflow-y:hidden;padding-left:1px;-webkit-overflow-scrolling:touch}table.flip-table tr{display:flex;flex-direction:column;min-width:min-content;flex-shrink:0}table.flip-table tr td{border-left:none}table.flip-table tr:first-child td{border-left:1px solid var(--border-color)}table.flip-table tr:last-child td{padding-right:1rem;border-right:1px solid var(--border-color)}table.flip-table td,table.flip-table th{display:block;border-bottom:none}table.flip-table td:first-child,table.flip-table th:first-child{padding-left:.5rem;border-top:none}table.flip-table td:last-child,table.flip-table th:last-child{padding-right:.5rem}@media screen and (max-width: 72em){table.scroll-table-small{white-space:nowrap}table.flip-table-small{display:flex;overflow:hidden}table.flip-table-small thead,table.flip-table-small thead+tbody,table.flip-table-small tbody+tbody{border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}table.flip-table-small thead,table.flip-table-small tbody{display:flex}table.flip-table-small thead{flex-shrink:0;min-width:min-content}table.flip-table-small thead th{padding-left:1rem}table.flip-table-small tbody{position:relative;overflow-x:auto;overflow-y:hidden;padding-left:1px;-webkit-overflow-scrolling:touch}table.flip-table-small tr{display:flex;flex-direction:column;min-width:min-content;flex-shrink:0}table.flip-table-small tr td{border-left:none}table.flip-table-small tr:first-child td{border-left:1px solid var(--border-color)}table.flip-table-small tr:last-child td{padding-right:1rem;border-right:1px solid var(--border-color)}table.flip-table-small td,table.flip-table-small th{display:block;border-bottom:none}table.flip-table-small td:first-child,table.flip-table-small th:first-child{padding-left:.5rem;border-top:none}table.flip-table-small td:last-child,table.flip-table-small th:last-child{padding-right:.5rem}}footer{margin-bottom:2rem}a[href^="#fn:"],a[href^="#fnref:"]{margin-left:.1rem;font-weight:var(--font-weight-bold)}@media screen and (max-width: 73.5em){a[href^="#fn:"],a[href^="#fnref:"]{font-weight:normal}}sup{line-height:1}@media screen and (max-width: 72em){sup[id^="fnref"]{vertical-align:baseline;font-size:inherit}sup[id^="fnref"]>a::before{content:"["}sup[id^="fnref"]>a::after{content:"]"}}.footnotes{margin-top:5rem}.footnotes>ol{color:var(--text-muted)}.footnotes>ol>li{padding:.5rem;margin-left:.5rem}.footnotes>ol>li>p{margin:0}.footnotes>ol>li:focus{outline:none;color:var(--gray-text);background:var(--gray-bg)}.footnotes::before{content:"";display:block;margin:1.5rem 0;border:0;border-top:1px solid var(--border-color)}code,pre{font-family:var(--code-font-family)}code{padding:.25em .5em;background-color:var(--gray-bg);font-size:.85em}.pre-base,pre,article .katex-display,article div.MathJax_Preview{margin-left:-1rem;margin-right:-1rem;padding:1rem;background-color:var(--gray-bg);overflow-x:auto;-webkit-overflow-scrolling:touch;backface-visibility:hidden}@media print{.pre-base,pre,article .katex-display,article div.MathJax_Preview{width:100% !important;page-break-inside:avoid;break-inside:avoid-page}}pre{margin-top:0;display:block;line-height:1.4;font-size:.85em}pre>code{padding:0;color:inherit;background-color:transparent;font-size:1em}pre,.highlight{margin-bottom:2rem}hr.dingbat{border:0}hr.dingbat::after{content:"\2756";display:block;text-align:center;font-size:1.5rem;color:var(--menu-text)}@media print{.comments{display:none}}.read-more{margin-top:2rem;margin-bottom:3rem}.read-more::after{content:" \2192";font-family:"icomoon" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;font-size:smaller;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pagination{width:calc(100% + 2rem);margin:0 -1rem 1rem;color:var(--text-muted);text-align:center}.pagination>ul{list-style:none;padding:0}.pagination-item>*{display:block;padding:.25rem 1rem;border:solid var(--border-color);border-width:1px 0;transition:border-color 1s ease}.pagination-item>a,.pagination-item>a:hover,.pagination-item>a:focus{border-color:var(--border-color) !important}.pagination-item:first-child>*{margin-bottom:-1px}.pagination-item>a:hover,.pagination-item a:focus{background-color:var(--gray-bg);border-bottom:1px solid var(--border-color)}@media (min-width: 23.5em){.pagination{width:100%;margin:3rem 0}.pagination-item>*{float:left;width:50%;border-width:1px}.pagination-item:first-child>*{margin-bottom:0;border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem}.pagination-item:last-child>*{margin-left:-1px;border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem}}body{display:block;position:relative;overflow-x:hidden}hy-push-state,hy-drawer{display:block;overflow:hidden}@media print{html{font-size:11pt}}.fl{float:left}.fr{float:right}.mb4{margin-bottom:4rem}.mb6{margin-bottom:6rem}.mt0{margin-top:0}.mt2{margin-top:2rem}.mt3{margin-top:3rem}.mt4{margin-top:4rem}.pb0{padding-bottom:0}.sixteen-nine{position:relative}.sixteen-nine::before{display:block;content:"";width:100%;padding-top:56.25%}.sixteen-nine>*{position:absolute;top:0;left:0;right:0;bottom:0}.sr-only{display:unset;position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.border{transition:border-color 1s ease}hy-push-state a,.a{transition:color 1s, border-color 250ms}hy-push-state a:hover,.a:hover{text-decoration:none;transition:color 1s, border-color 50ms}hy-push-state a.no-hover,.a.no-hover{transition:none}hy-push-state a.no-hover:hover,.a.no-hover:hover{transition:none}.content .img img{object-fit:cover;object-position:center;background-position:center;background-repeat:no-repeat;background-image:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjkwIiB2aWV3Qm94PSIwIDAgMTYwIDkwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuMDQ4ODI4LCAwLCAwLCAwLjA0Nzk5MSwgNTQuOTk5OTczLCAyMC40MjgxNDgpIj4KICAgIDxwYXRoIGQ9Ik05NTkuODg0IDEyOGMwLjA0MCAwLjAzNCAwLjA4MiAwLjA3NiAwLjExNiAwLjExNnY3NjcuNzdjLTAuMDM0IDAuMDQwLTAuMDc2IDAuMDgyLTAuMTE2IDAuMTE2aC04OTUuNzdjLTAuMDQwLTAuMDM0LTAuMDgyLTAuMDc2LTAuMTE0LTAuMTE2di03NjcuNzcyYzAuMDM0LTAuMDQwIDAuMDc2LTAuMDgyIDAuMTE0LTAuMTE0aDg5NS43N3pNOTYwIDY0aC04OTZjLTM1LjIgMC02NCAyOC44LTY0IDY0djc2OGMwIDM1LjIgMjguOCA2NCA2NCA2NGg4OTZjMzUuMiAwIDY0LTI4LjggNjQtNjR2LTc2OGMwLTM1LjItMjguOC02NC02NC02NHYweiIgc3R5bGU9ImZpbGw6IHJnYigyMjEsIDIyMSwgMjIxKTsiLz4KICAgIDxwYXRoIGQ9Ik04MzIgMjg4YzAgNTMuMDIwLTQyLjk4IDk2LTk2IDk2cy05Ni00Mi45OC05Ni05NiA0Mi45OC05NiA5Ni05NiA5NiA0Mi45OCA5NiA5NnoiIHN0eWxlPSJmaWxsOiByZ2IoMjIxLCAyMjEsIDIyMSk7Ii8+CiAgICA8cGF0aCBkPSJNODk2IDgzMmgtNzY4di0xMjhsMjI0LTM4NCAyNTYgMzIwaDY0bDIyNC0xOTJ6IiBzdHlsZT0iZmlsbDogcmdiKDIyMSwgMjIxLCAyMjEpOyIvPgogIDwvZz4KPC9zdmc+")}hy-img{display:block;position:relative}hy-img .loading{background-color:var(--gray-bg);position:absolute;top:0;left:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center}hy-img .loading>*{color:var(--menu-text);font-size:2rem}hy-img img{animation-duration:1000ms;animation-timing-function:ease;animation-name:fade-img}figure,.figure{margin-bottom:2rem}figure>*:first-child,.figure>*:first-child{margin-bottom:.5rem}@keyframes fade-img{from{opacity:0}to{opacity:1}}.animation-main hy-img img{animation:none !important}hy-drawer{z-index:2}@media screen{hy-drawer{--hy-drawer-width: 100%;--hy-drawer-slide-width: calc(100% - .5rem);--hy-drawer-box-shadow: 0 0 1rem rgba(0, 0, 0, 0.25)}}@media screen and (min-width: 64em){hy-drawer{--hy-drawer-slide-width: calc(100% - 21rem)}}@media screen and (min-width: 1666px){hy-drawer{width:calc(50% - 28rem);--hy-drawer-slide-width: calc(50% + 28rem)}}@media screen{hy-drawer.loaded{position:static}}.sidebar a:hover{border-bottom-color:#fff}hy-drawer.loaded .sidebar{min-height:100%}.sidebar-bg.sidebar-overlay::after{background:-moz-linear-gradient(top, rgba(32,32,32,0) 0%, rgba(32,32,32,0.5) 50%, rgba(32,32,32,0) 100%);background:-webkit-linear-gradient(top, rgba(32,32,32,0) 0%, rgba(32,32,32,0.5) 50%, rgba(32,32,32,0) 100%);background:linear-gradient(to bottom, rgba(32,32,32,0) 0%, rgba(32,32,32,0.5) 50%, rgba(32,32,32,0) 100%)}@media print{.sidebar{display:none}}#_swipe{position:absolute;z-index:4;opacity:0.33;top:5vw;right:5vw;transform:scale(0.67)}@media screen and (min-width: 42em){#_swipe{top:calc(50% - 48px);right:10vw;transform:scale(1)}}@media print{.sidebar-social{display:none}}@media print{.navbar{display:none}}.navbar .loading{display:none}#_navbar{position:absolute;height:0}#_cookies-banner{background-color:var(--body-bg);border-top:1px solid var(--border-color)}@media print{.content{padding-bottom:1rem}}.avatar{display:inline-block;position:relative;z-index:1}.avatar img{width:100%}article .katex-display,article div.MathJax_Preview{padding:2rem;text-align:left}article div.MathJax_Preview{font-family:var(--code-font-family);font-size:.75em;line-height:1.45;white-space:pre;margin-bottom:2rem}article span.MathJax_Preview{font-family:var(--code-font-family);padding:.25em .5em;font-size:.85em;background-color:var(--code-bg)}.MathJax_Preview:empty{display:none;visibility:hidden}main>footer{position:absolute;bottom:0;left:.5rem;right:0;padding:0 1rem;color:var(--text-muted);text-align:center}main>footer>p{margin-bottom:0}@media screen and (min-width: 64em){main>footer{left:0}}@media print{main>footer{position:static;margin-top:5rem}main>footer .legal{display:none}}@media screen{a.external::after,a[href*="//"]:not(.no-mark-external):not(.no-mark)::after,a.no-push-state:not(.no-mark-external):not(.no-mark)::after{content:"\00A0\ea7e";font-family:"icomoon" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;font-size:smaller;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;opacity:0.33;transition:opacity 500ms}a.external:hover::after,a.external:focus::after,a[href*="//"]:not(.no-mark-external):not(.no-mark):hover::after,a[href*="//"]:not(.no-mark-external):not(.no-mark):focus::after,a.no-push-state:not(.no-mark-external):not(.no-mark):hover::after,a.no-push-state:not(.no-mark-external):not(.no-mark):focus::after{opacity:1;transition:opacity 100ms}}@media screen{pre,table:not(.highlight),.katex-display,.break-layout{position:relative;width:calc(100% + 2rem)}}@media screen and (min-width: 38rem){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 50vw - 17rem)}}@media screen and (min-width: 54em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 50vw - 19rem)}}@media screen and (min-width: 64em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100vw - 24rem)}}@media screen and (min-width: 72em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 100vw - 64rem)}}@media screen and (min-width: 90em){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 100vw - 71rem)}}@media screen and (min-width: 1666px){pre,table:not(.highlight),.katex-display,.break-layout{width:calc(100% + 50vw - 22rem)}}.highlight,pre.highlight{color:#383a42}.highlight .ge{font-style:italic}.highlight .gs{font-weight:700}.highlight .ow{font-weight:700}.highlight .n,.highlight .nf,.highlight .nn,.highlight .o,.highlight .p{color:#383a42}.highlight .c,.highlight .c1,.highlight .cm,.highlight .cp,.highlight .cs{color:#a0a1a7;font-style:italic}.highlight .sr,.highlight .ss{color:#0184bc}.highlight .k,.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:#a626a4}.highlight .l,.highlight .ld,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .sd,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{color:#50a14f}.highlight .nt,.highlight .nx,.highlight .vi{color:#e45649}.highlight .il,.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo,.highlight .na{color:#986801}.highlight .bp,.highlight .nb,.highlight .nc,.highlight .nd,.highlight .ne,.highlight .ni,.highlight .nl,.highlight .no,.highlight .nv,.highlight .py,.highlight .vc,.highlight .vg{color:#c18401}.highlight .gd{color:#ff1414}.highlight .gi{color:#2db448}.highlight .w{color:#f8f8f2}.highlight .cpf{color:navy}.highlight .gu{color:#75715e}.highlight .lineno{color:#9d9d9f;user-select:none}.highlight .ln{color:#9d9d9f;user-select:none}.highlight .ln:after{content:" "}.highlight .hll{color:#383a42;background-color:#e5e5e6}.highlight .hl{color:#383a42;background-color:#e5e5e6}.highlight .language-json .w+.s2{color:#e45649}.highlight .language-json .kc{color:#0184bc}.loading>[class*="icon-"]{display:inline-block;-webkit-animation:rotate 2s infinite linear both;animation:rotate 2s infinite linear both;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}@-webkit-keyframes rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.dl-table a{padding-bottom:0.4rem}.dl-table .btn{margin:1.5rem 0} rgb(79,177,186)

There are multiple ways of installing Hydejack. The easiest and cleanest way is via the Starter Kit. Alternatively, you can use the Ruby gem. If you don’t mind a cluttered source directory, you can use the zip file. Finally, If you know what you are doing, you can fork the git repository.

Buyers of the PRO version should follow these steps.

Table of Contents

  1. Via Starter Kit
  2. Via gem
  3. Via zip
  4. Via git
  5. PRO Version
    1. PRO via GitHub (advanced)
  6. Running locally

Via Starter Kit

Using the Starter Kit has the advantage of not cluttering your blog repository. Additionally, it allows you to publish your site on GitHub Pages with a single push.

If you have a GitHub account, fork the hy-starter-kit repository. Otherwise download the source files and unzip them somewhere on your machine.

NOTE: In addition to the docs here, you can follow the quick start guide in the Starter Kit.

cd into the directory where _config.yml is located and follow the steps in Running locally.

Alternatively, you can just Deploy to Netlify.

Via gem

Jekyll has built-in support for using themes that are hosted on RubyGems.

If you haven’t already, create a new Jekyll site first:

$ jekyll new <PATH>

Your site’s root dir should look something like this

├── _posts
│   └── 2017-04-07-welcome-to-jekyll.markdown
├── _config.yml
├── about.md
├── Gemfile
├── Gemfile.lock
└── index.md

NOTE: Hydejack works with Jekyll’s default config.yml, but it is recommended that you replace it with Hydejack’s default config file. It contains the names of all config options known to Hydejack and provides sensible defaults (like minifying HTML and CSS in production builds).

Next, you’ll want to add jekyll-theme-hydejack as a dependency by adding the following line to the Gemfile.

gem "jekyll-theme-hydejack"

(You can also remove the old theme jekyll-theme-minima from the Gemfile)

Now you want to edit the _config.yml of your Jekyll site and set Hydejack as the theme. Look for the theme key and set its value to jekyll-theme-hydejack.

theme: jekyll-theme-hydejack

For more information on gem-based themes, see the Jekyll Documentation.

You can now continue with running locally.

Via zip

If you downloaded the extended zip, extract the contents somewhere on your machine. The high-level folder structure will look something like.

├── _data
├── _featured_categories
├── _featured_tags
├── _includes
├── _js
├── _layouts
├── _posts
├── _sass
├── assets
├── _config.yml
├── 404.md
├── about.md
├── index.html
└── posts.md

cd into the directory where _config.yml is located and follow the steps in Running locally.

Via git

If you are familiar with using git, you can add the Hydejack repository as a remote, and merge its master branch into your working branch.

$ git remote add hydejack [email protected]:qwtel/hydejack.git
$ git pull hydejack master

You can also update Hydejack this way. The master branch will not contain work in progress, but will contain major (breaking) changes. This approach is recommended if you intend to customize Hydejack.

You can now continue with running locally.

PRO Version

If you bought the PRO version, you’ve received a zip archive with the following contents:

├── install
├── upgrade
├── CHANGELOG.pdf
├── Documentation.pdf
├── NOTICE.pdf
├── PRO License.pdf
├── PRO–hy-drawer License.pdf
├── PRO–hy-img License.pdf
├── PRO–hy-push-state License.pdf
└── .ssh
install
Contains all files and folders needed to create a new blog.
upgrade
Contains only the files and folders needed for upgrading form an earlier version of Hydejack (6.0.0 or above). See Upgrade for more.
.ssh
A hidden folder containing a SSH key for read-only access to the Hydejack PRO GitHub repository. You can use this to install Hydejack PRO as gem-based theme. See the installation instructions below. This is for advanced users.

For new installations only the install folder is relevant. Unzip the archive somewhere on your machine, then cd into the install folder, e.g.

$ cd ~/Downloads/hydejack-pro-8.1.1/install/

You can now continue with Running locally.

PRO via GitHub (advanced)

If you know how to handle SSH keys, you can also install the PRO version as a gem-based theme via GitHub. The advantage of this method is that you avoid cluttering your Jekyll repository with Hydejack’s source files.

The downloaded zip contains a read-only key for a private GitHub repository. It is located at <dowloaded zip>/.ssh/hydejack_8_pro. You have to copy the key file to ~/.ssh (or wherever your SSH keys are located), e.g.:

$ cp ~/Downloads/hydejack-pro-8.1.1/.ssh/hydejack_8_pro ~/.ssh/

It is required that your private key files are NOT accessible by others, e.g.:

$ chmod 600 ~/.ssh/hydejack_8_pro

Then add the following to .ssh/config:

Host hydejack
	HostName github.com
	IdentitiesOnly yes
	IdentityFile ~/.ssh/hydejack_8_pro

Next, open Gemfile in your Jekyll repository and add:

gem "jekyll-theme-hydejack-pro", git: '[email protected]:qwtel/hydejack-8-pro.git'

In your _config.yml, add:

theme: jekyll-theme-hydejack-pro

You can now continue with Running locally.

Running locally

Make sure you’ve cded into the directory where _config.yml is located. Before running for the first time, dependencies need to be fetched from RubyGems:

$ bundle install

NOTE: If you are missing the bundle command, you can install Bundler by running gem install bundler.

Now you can run Jekyll on your local machine:

$ bundle exec jekyll serve

and point your browser to http://localhost:4000 to see Hydejack in action.

Continue with Config


{ "lang": "en", "name": "Hello, Reader", "short_name": "Hello, Reader", "description": "“Just a friendly neighborhood web log”", "start_url": "/?utm_source=homescreen", "theme_color": "rgb(25,55,71)", "background_color": "#fff", "orientation": "portrait", "display": "standalone", "icons": [ { "src": "/assets/icons/[email protected],25x.png", "type": "image/png", "sizes": "48x48" }, { "src": "/assets/icons/[email protected],5x.png", "type": "image/png", "sizes": "96x96" }, { "src": "/assets/icons/[email protected],75x.png", "type": "image/png", "sizes": "144x144" }, { "src": "/assets/icons/icon.png", "type": "image/png", "sizes": "192x192" }, { "src": "/assets/icons/[email protected]", "type": "image/png", "sizes": "384x384" }, { "src": "/assets/icons/[email protected]", "type": "image/png", "sizes": "576x576" } ] }

This documents shows how to upgrade Hydejack from previous versions (v5) in a step-by-step manner.

Unfortunately, upgrading form v5 and earlier is not straightforward. A lot of patterns and names have changed, motivated by a variety of reasons, including better integration with the rest of the Jekyll ecosystem and simplified workflows enabled by Jekyll Collections.

Table of Contents

  1. From v5
    1. Updating the folder structure
    2. Updating the configuration
    3. Restoring the tags
    4. Restoring the sidebar entries
    5. Restoring the RSS feed
    6. Restoring the comments
    7. Restoring the about page

From v5

Updating the folder structure

Copy the the following folders and files from Hydejack v6 into your existing repository. Make sure you merge the folder contents.

Note that the public folder has been renamed to assets. You’ll want to move your static assets there.

Updating the configuration

_config.yml has changed considerably. Open it and make the following changes.

  1. Rename the following keys

    • font_accent => font_heading
    • load_google_fonts => google_fonts
    • google_analytics_id => google_analytics
  2. Enable Jekyll Collections for categories and tags by adding

    collections:
      featured_categories:
        permalink: /category/:name/
        output:    true
      featured_tags:
        permalink: /tag/:name/
        output:    true
    
  3. Delete photo and photo2x form the author key and add a picture hash instead that looks like

    picture:
      path: <photo>
      srcset:
        1x: <photo>
        2x: <photo2x>
    

    If you have only one photo, you can just provide the URL directly, e.g. picture: <url>.

    For more information, see Adding an author.

  4. Rename gems to plugins and make sure the list contains jekyll-seo-tag.

    plugins:
      - jekyll-seo-tag
    

NOTE: When making changes to _config.yml, it is necessary to restart the Jekyll process for the changes to take effect.

Restoring the tags

  1. Delete the tag folder.
  2. Create a top-level folder called _featured_tags.
  3. For each entry in _data/tags.yml, create a markdown file in _features_tags with the name of the tag as filename, e.g. hyde.md for tag “hyde”.
  4. For each tag, copy its contents from _data/tags.yml into the new file’s front matter, e.g.

    ---
    layout: list
    name: Hyde
    description: >
      Hyde is a brazen two-column Jekyll theme...
    accent_image: /hydejack/public/img/hyde.jpg
    accent_color: '#949667'
    ---
    

    Be aware that image has been renamed to accent_image and color has been renamed to accent_color.

  5. Add layout: list to the front matter.
  6. Once you’ve copied all tags into their own files, delete _data/tags.yml.

Restoring the sidebar entries

Hydejack can now link to any kind of page in the sidebar.

  1. Delete sidebar_tags in _config.yml.
  2. Open a file who’s page you would like to add to the sidebar. If you want to add a tag, open _featured_tags/<tagname>.md.
  3. Add menu: true to its front matter.
  4. (Optional) Set order: <number>, where <number> is the number at which you would like the link to appear.

Restoring the RSS feed

The feed is now provided by the jekyll-feed plugin instead of a custom solution.

  1. Delete atom.xml
  2. Add - jekyll-feed to gems in _config.yml, e.g.

    gems:
      - jekyll-seo-tag
      - jekyll-feed
    
  3. (Optional) Add the following to _config.yml to make the feed appear at the same URL as the old atom.xml.

    feed:
      path: atom.xml
    

Restoring the comments

The way comments are enabled has changed slightly. You now have to enable them per page by adding comments: true to the front matter (this is what the Disqus integration guide suggests). To enable them for all posts, add to the config file

defaults:
  - scope:
      type: posts
    values:
      comments: true

Restoring the about page

Hydejack now has a dedicated layout for about pages. To use it, open about.md and change the layout in the front matter to about and delete {\% include about-short.html author=site.author %\}.

This is my ‘now’ page, based on the https://www.nownownow.com project.

For the next few weeks, this page is going to be heavily under revision pursuant to annual goal setting requirements, existential panic, performance reviews, and distraction by all things shiny.


Community:

Reading List:

Last Updated: 2019-12-27


There are two ways of adding third party scripts. Embedding is ideal for one-off scripts, e.g. widgets.js that is part of embedded tweets (see below). Adding global scripts is for scripts that should be loaded on every page.

Table of Contents

  1. Embedding
  2. Global scripts
  3. Registering push state event listeners
  4. If everything else fails

Embedding

Hydejack supports embedding third party scripts directly inside markdown content. This will work in most cases, except when a script can not be loaded on a page more than once (this will occur when a user navigates to the same page twice).

Example:

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en">
  <p lang="en" dir="ltr">
    The next version of Hydejack (v6.3.0) will allow embedding 3rd party scripts,
    like the one that comes with this tweet for example.
  </p>
  &mdash; Florian Klampfer (@qwtel)
  <a href="https://twitter.com/qwtel/status/871098943505039362">June 3, 2017</a>
</blockquote>

Global scripts

If you have scripts that should be included on every page you can add them globally by opening (or creating) _includes/my-scripts.html and adding them like you normally would:

<!-- file: _includes/my-scripts.html -->
<script
  src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
  integrity="sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g="
  crossorigin="anonymous"></script>

my-scripts.html will be included at the end of the body tag.

Registering push state event listeners

When embedding scripts globally you might want to run some init code after each page load. However, the problem with push state-based page loads is that the load event won’t fire again. Luckily, Hydejack’s push state component exposes an event that you can listen to instead.

<!-- file: _includes/my-scripts.html -->
<script>
  document.getElementsByTagName('hy-push-state')[0].addEventListener('hy-push-state-load', function() {
    // <your init code>
  });
</script>

Note that the above code must only run once, so include it in your my-scripts.html.

hy-push-state-start
Occurs after clicking a link.
hy-push-state-ready
Animation fished and response has been parsed, ready to swap out the content.
hy-push-state-after
The old content has been replaced with the new content.
hy-push-state-progress
Special case when animation is finished, but no response from server has arrived yet. This is when the loading spinner will appear.
hy-push-state-load
All embedded script tags have been inserted into the document and have finished loading.

If everything else fails

If you can’t make an external script work with Hydejack’s push state approach to page loading, you can disable push state by adding to your config file:

# file: _config.yml
hydejack:
  no_push_state: true

Continue with Build





this is a test of the site variables
Current Time is: {{ site.time }} Pages are: {{ site.pages }} Posts are: {{ site.posts }} This chapter shows how to upgrade Hydejack to a newer version. The method depends on how you've installed Hydejack. ## Table of Contents {:.no_toc} 0. this unordered seed list will be replaced by toc as unordered list {:toc} **NOTE**: Before upgrading to v7+, make sure you've read the [CHANGELOG](../CHANGELOG.md){:.heading.flip-title}, especially the part about the [license change](../CHANGELOG.md#license-change)! {:.message} ## Via Starter Kit When using the Starter Kit, upgrading Hydejack is as simple as setting the `remote_theme` key in `config.yml` to the desired version. ```yml remote_theme: qwtel/[email protected] ``` To use the latest version on the `v8` branch on each build, you can use `qwtel/[email protected]`. ## Via gem Upgrading the the gem-based theme is as easy as running ```bash bundle update jekyll-theme-hydejack ``` ## Via zip Upgrading via zip is a bit of a dark art, specially if you've made changes to any source files, and the prime reason why I suggest using the gem-based version of the theme. Generally, you'll want to copy these files and folders: * `_includes/` * `_layouts/` * `_sass/` * `assets/` * `Gemfile` * `Gemfile.lock` and merge them with your existing folder. However, you'll also want to check out `_data` and `_config.yml` for any changes and read latest entries to the [CHANGELOG](../CHANGELOG.md){:.heading.flip-title}. **NOTE**: If you've modified any of Hydejack's internal files, your changes will most likely be overwritten and you have to apply them again. Make sure you've made a backup before overwriting any files. {:.message} ## Via git The latest version sits on the `master` branch of [qwtel/hydejack](https://github.com/qwtel/hydejack). To apply them to your repository run ~~~bash $ git remote add hydejack [email protected]:qwtel/hydejack.git $ git pull hydejack master ~~~ ## PRO Version Buyers of the PRO version will find the files necessary for an upgrade in the `upgrade` folder of the downloaded zip archive. **NOTE**: If you've modified any of Hydejack's internal files, your changes will most likely be overwritten and you have to apply them again. Make sure you've made a backup before overwriting any files. {:.message} The archive also contains `.patch` files, that you can apply to your repository via [git-apply](https://git-scm.com/docs/git-apply). Using this method, git will generate merge conflicts when changes in the patch conflict with any of your changes. ### PRO via GitHub (advanced) If you've followed the steps [here](/c/docs/install/#pro-via-github-advanced), all you need to upgrade is: ~~~bash $ bundle update jekyll-theme-hydejack-pro ~~~ Continue with [Config](/c/docs/config/){:.heading.flip-title} {:.read-more}Hydejack offers a few additional features to markup your content. Don't worry, these are merely CSS classes added with kramdown's `{:...}` syntax, so that your content remains compatible with other Jekyll themes. **NOTE**: For an introduction to markdown in general, see [Mastering Markdown][mm] and [kramdown Syntax][ksyn]. {:.message} ## Table of Contents {:.no_toc} 0. this unordered seed list will be replaced by toc as unordered list {:toc} ## A word on building speeds If building speeds are a problem, try using the `--incremental` flag, e.g. bundle exec jekyll serve --incremental From the [Jekyll docs](https://jekyllrb.com/docs/configuration/#build-command-options) (emphasis mine): > Enable the experimental incremental build feature. Incremental build only re-builds posts and pages that have changed, resulting in significant performance improvements for large sites, *but may also break site generation in certain cases*. The breakage occurs when you create new files or change filenames. Also, changing the title, category, tags, etc. of a page or post will not be reflected in pages other then the page or post itself. This makes it ideal for writing new posts and previewing changes, but not setting up new content. ## Adding a table of contents You can add a generated table of contents to any page by adding `{:toc}` below a list. Example: see above Markdown: ~~~md * this unordered seed list will be replaced by toc as unordered list {:toc} ~~~ ## Adding message boxes You can add a message box by adding the `message` class to a paragraph. Example: **NOTE**: You can add a message box. {:.message} Markdown: ~~~markdown **NOTE**: You can add a message box. {:.message} ~~~ ## Adding large text You can add large text by adding the `lead` class to the paragraph. Example: You can add large text. {:.lead} Markdown: ~~~markdown You can add large text. {:.lead} ~~~ ## Adding large images You can make an image span the full width by adding the `lead` class. Example: ![Full-width image](https://placehold.it/800x100){:.lead data-width="800" data-height="100"} Markdown: ~~~markdown ![Full-width image](https://placehold.it/800x100){:.lead data-width="800" data-height="100"} ~~~ ## Adding image captions You can add captions to images by adding the `figure` class to the paragraph containing the image and a caption. ![Full-width image](https://placehold.it/800x100){:.lead data-width="800" data-height="100"} A caption for an image. {:.figure} Markdown: ~~~md ![Full-width image](https://placehold.it/800x100){:.lead data-width="800" data-height="100"} A caption for an image. {:.figure} ~~~ For better semantics, you can also use the `figure`/`figcaption` HTML5 tags: ```html

An image with a caption
A caption to an image.
``` ## Adding large quotes You can make a quote "pop out" by adding the `lead` class. Example: > You can make a quote "pop out". {:.lead} Markdown: ~~~ > You can make a quote "pop out". {:.lead} ~~~ ## Adding faded text You can gray out text by adding the `faded` class. Use this sparingly and for information that is not essential, as it is more difficult to read. Example: I'm faded, faded, faded. {:.faded} Markdown: ~~~md I'm faded, faded, faded. {:.faded} ~~~ ## Adding tables Adding tables is straightforward and works just as described in the [kramdown docs][ksyntab], e.g. | Default aligned |Left aligned| Center aligned | Right aligned | |-----------------|:-----------|:---------------:|---------------:| | First body part |Second cell | Third cell | fourth cell | Markdown: ~~~md | Default aligned |Left aligned| Center aligned | Right aligned | |-----------------|:-----------|:---------------:|---------------:| | First body part |Second cell | Third cell | fourth cell | ~~~ However, it gets tricker when adding large tables. In this case, Hydejack will break the layout and grant the table the entire available screen width to the right: | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | |-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:| | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | | Third line |quux | baz | bar | Third line |quux | baz | bar | Third line |quux | baz | bar | Third line |quux | baz | bar | | Second body | | | | Second body | | | | Second body | | | | Second body | | | | | 2 line | | | | 2 line | | | | 2 line | | | | 2 line | | | | | Footer row | | | | Footer row | | | | Footer row | | | | Footer row | | | | ### Scroll table If the extra space still isn't enough, the table will receive a scrollbar. It is browser default behavior to break the lines inside table cells to fit the content on the screen. By adding the `scroll-table` class on a table, the behavior is changed to never break lines inside cells, e.g: | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | |-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:| | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | | Third line |quux | baz | bar | Third line |quux | baz | bar | Third line |quux | baz | bar | Third line |quux | baz | bar | | Second body | | | | Second body | | | | Second body | | | | Second body | | | | | 2 line | | | | 2 line | | | | 2 line | | | | 2 line | | | | | Footer row | | | | Footer row | | | | Footer row | | | | Footer row | | | | {:.scroll-table} You can add the `scroll-table` class to a markdown table by putting `{:.scroll-table}` in line directly below the table. To add the class to a HTML table, add the it to the `class` attribute of the `table` tag, e.g. ``. ### Flip table Alternatively, you can "flip" (transpose) the table. Unlike the other approach, this will keep the table head (now the first column) fixed in place. You can enable this behavior by adding `flip-table` or `flip-table-small` to the CSS classes of the table. The `-small` version will only enable scrolling on "small" screens (< 1080px wide). **NOTE**: This approach only works on simple tables that have a single `tbody` and an optional `thead`. {:.message} Example: | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | Default aligned |Left aligned| Center aligned | Right aligned | |-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:|-----------------|:-----------|:---------------:|---------------:| | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | First body part |Second cell | Third cell | fourth cell | | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | Second line |foo | **strong** | baz | | Third line |quux | baz | bar | Third line |quux | baz | bar | Third line |quux | baz | bar | Third line |quux | baz | bar | | 4th line |quux | baz | bar | 4th line |quux | baz | bar | 4th line |quux | baz | bar | 4th line |quux | baz | bar | | 5th line |quux | baz | bar | 5th line |quux | baz | bar | 5th line |quux | baz | bar | 5th line |quux | baz | bar | | 6th line |quux | baz | bar | 6th line |quux | baz | bar | 6th line |quux | baz | bar | 6th line |quux | baz | bar | | 7th line |quux | baz | bar | 7th line |quux | baz | bar | 7th line |quux | baz | bar | 7th line |quux | baz | bar | | 8th line |quux | baz | bar | 8th line |quux | baz | bar | 8th line |quux | baz | bar | 8th line |quux | baz | bar | | 9th line |quux | baz | bar | 9th line |quux | baz | bar | 9th line |quux | baz | bar | 9th line |quux | baz | bar | | 10th line |quux | baz | bar | 10th line |quux | baz | bar | 10th line |quux | baz | bar | 10th line |quux | baz | bar | {:.flip-table} You can add the `flip-table` class to a markdown table by putting `{:.flip-table}` in line directly below the table. To add the class to a HTML table, add the it to the `class` attribute of the `table` tag, e.g. `
`. ### Small tables If a table is small enough to fit the screen even on small screens, you can add the `stretch-table` class to force a table to use the entire available content width. Note that stretched tables can no longer be scrolled. | Default aligned |Left aligned| Center aligned | Right aligned | |-----------------|:-----------|:---------------:|---------------:| | First body part |Second cell | Third cell | fourth cell | {:.stretch-table} You can add the `stretch-table` class to a markdown table by putting `{:.stretch-table}` in line directly below the table. To add the class to a HTML table, add the it to the `class` attribute of the `table` tag, e.g. `
`. ## Adding code blocks To add a code block without syntax highlighting, simply indent 4 spaces (regular markdown). For code blocks with code highlighting, use `~~~`. This syntax is also supported by GitHub. For more information and a list of supported languages, see [Rouge](http://rouge.jneen.net/). Example: ~~~js // Example can be run directly in your JavaScript console // Create a function that takes two arguments and returns the sum of those // arguments var adder = new Function("a", "b", "return a + b"); // Call the function adder(2, 6); // > 8 ~~~ Markdown: ~~~js // Example can be run directly in your JavaScript console // Create a function that takes two arguments and returns the sum of those // arguments var adder = new Function("a", "b", "return a + b"); // Call the function adder(2, 6); // > 8 ~~~ **NOTE**: DO NOT use Jekyll's `{ % highlight % } ... { % endhighlight % }` syntax, especially together with the `linenos` option. The generated `table` to render the line numbers does not have a CSS class or any other way of differentiating it from regular tables, so that the styles above apply, resulting in a broken page. What's more, the output from `highlight` tags isn't even valid HTML, nesting `pre` tags inside `pre` tags, which will in break the site during minification. You can read more about it [here](https://github.com/penibelst/jekyll-compress-html/issues/71) and [here](https://github.com/jekyll/jekyll/issues/4432). {:.message} ## Adding math Hydejack supports [math blocks][ksynmath] via [KaTeX][katex]. Why KaTeX instead of MathJax? KaTeX is faster and more lightweight at the cost of having less features, but for the purpose of writing blog posts, this should be a favorable tradeoff. Before you add math content, make sure you have the following in your config file: ```yml kramdown: math_engine: mathjax # this is not a typo math_engine_opts: preview: true preview_as_code: true ``` ### Inline Example: Lorem ipsum $$ f(x) = x^2 $$. Markdown: ~~~md Lorem ipsum $$ f(x) = x^2 $$. ~~~ ### Block Example: $$ \begin{aligned} \phi(x,y) &= \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right) \\[2em] &= \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j) \\[2em] &= (x_1, \ldots, x_n) \left(\begin{array}{ccc} \phi(e_1, e_1) & \cdots & \phi(e_1, e_n) \\ \vdots & \ddots & \vdots \\ \phi(e_n, e_1) & \cdots & \phi(e_n, e_n) \end{array}\right) \left(\begin{array}{c} y_1 \\ \vdots \\ y_n \end{array}\right) \end{aligned} $$ Markdown: ~~~latex $$ \begin{aligned} \phi(x,y) &= \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right) \\[2em] &= \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j) \\[2em] &= (x_1, \ldots, x_n) \left(\begin{array}{ccc} \phi(e_1, e_1) & \cdots & \phi(e_1, e_n) \\ \vdots & \ddots & \vdots \\ \phi(e_n, e_1) & \cdots & \phi(e_n, e_n) \end{array}\right) \left(\begin{array}{c} y_1 \\ \vdots \\ y_n \end{array}\right) \end{aligned} $$ ~~~ **NOTE**: KaTeX does not support the `align` and `align*` environments. Instead, `aligned` should be used, e.g. `\begin{aligned} ... \end{aligned}`. {:.message} Continue with [Scripts](/c/docs/scripts/){:.heading.flip-title} {:.read-more} [mm]: https://guides.github.com/features/mastering-markdown/ [ksyn]: https://kramdown.gettalong.org/syntax.html [ksyntab]:https://kramdown.gettalong.org/syntax.html#tables [ksynmath]: https://kramdown.gettalong.org/syntax.html#math-blocks [katex]: https://khan.github.io/KaTeX/ [rtable]: https://dbushell.com/2016/03/04/css-only-responsive-tables/@import "jekyll-theme-primer"; 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: {:style="list-style: lower-latin"} 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and 2. You must cause any modified files to carry prominent notices stating that You changed the files; and 3. 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 4. 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 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.Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. ## Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. ## TERMS AND CONDITIONS ### 0. Definitions "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. ### 1. Source Code The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. ### 2. Basic Permissions All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. ### 3. Protecting Users' Legal Rights From Anti-Circumvention Law No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. ### 4. Conveying Verbatim Copies You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. ### 5. Conveying Modified Source Versions You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: {:style="list-style-type:lower-latin"} 1. The work must carry prominent notices stating that you modified it, and giving a relevant date. 2. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". 3. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. 4. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. ### 6. Conveying Non-Source Forms You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: {:style="list-style-type:lower-latin"} 1. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. 2. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. 3. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. 4. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. 5. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. ### 7. Additional Terms "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: {:style="list-style-type:lower-latin"} 1. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or 2. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or 3. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or 4. Limiting the use for publicity purposes of names of licensors or authors of the material; or 5. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or 6. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. ### 8. Termination You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. ### 9. Acceptance Not Required for Having Copies You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. ### 10. Automatic Licensing of Downstream Recipients Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. ### 11. Patents A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. ### 12. No Surrender of Others' Freedom If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. ### 13. Use with the GNU Affero General Public License Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. ### 14. Revised Versions of this License The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. ### 15. Disclaimer of Warranty THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ### 16. Limitation of Liability IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ### 17. Interpretation of Sections 15 and 16 If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.## GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. ### Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. ### TERMS AND CONDITIONS #### 0. Definitions "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. #### 1. Source Code The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. #### 2. Basic Permissions All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. #### 3. Protecting Users' Legal Rights From Anti-Circumvention Law No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. #### 4. Conveying Verbatim Copies You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. #### 5. Conveying Modified Source Versions You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: {:style="list-style-type:lower-latin"} 1. The work must carry prominent notices stating that you modified it, and giving a relevant date. 2. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". 3. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. 4. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. #### 6. Conveying Non-Source Forms You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: {:style="list-style-type:lower-latin"} 1. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. 2. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. 3. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. 4. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. 5. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. #### 7. Additional Terms "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: {:style="list-style-type:lower-latin"} 1. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or 2. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or 3. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or 4. Limiting the use for publicity purposes of names of licensors or authors of the material; or 5. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or 6. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. #### 8. Termination You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. #### 9. Acceptance Not Required for Having Copies You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. #### 10. Automatic Licensing of Downstream Recipients Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. #### 11. Patents A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. #### 12. No Surrender of Others' Freedom If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. #### 13. Use with the GNU Affero General Public License Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. #### 14. Revised Versions of this License The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. #### 15. Disclaimer of Warranty THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. #### 16. Limitation of Liability IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. #### 17. Interpretation of Sections 15 and 16 If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.Copyright (c) \<YEAR\> \<COPYRIGHT HOLDER\> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Copyright (c) 2018 Florian Klampfer <https://qwtel.com/> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. ## Attributions Appropriate credit as per Creative Commons licenses. | Work | License | Changes |:-------------------------------------------------------|:---------------|:- | [Photo][ph] by [Caleb George][cg] | [Unsplash] | Rearranged objects, Filled in content, blurred | [IcoMoon Icons Free Version][11] by [Keyamoon][12] | [CC-BY-SA-4.0] | None | [Touch-161562.svg][41] | [CC0-1.0] | Composition ## Licenses Parts of this software are provided under separate licenses. ### Hyde This software also uses portions of the `poole/hyde` project, which is MIT licensed with the following copyright: > Copyright (c) 2013 Mark Otto. A copy of the [MIT] license is provided as part of this distribution. ### hy-drawer This software also uses portions of the `qwtel/hy-drawer` project, which is GPL-3.0 licensed with the following copyright: > Copyright (c) 2018 Florian Klampfer <https://qwtel.com/> A copy of the [GPL-3.0] license is provided as part of this distribution. ### hy-push-state This software also uses portions of the `qwtel/hy-push-state` project, which is GPL-3.0 licensed with the following copyright: > Copyright (c) 2018 Florian Klampfer <https://qwtel.com/> A copy of the [GPL-3.0] license is provided as part of this distribution. ### hy-img This software also uses portions of the `qwtel/hy-img` project, which is GPL-3.0 licensed with the following copyright: > Copyright (c) 2018 Florian Klampfer <https://qwtel.com/> A copy of the [GPL-3.0] license is provided as part of this distribution. ### hy-component This software also uses portions of the `qwtel/hy-component` project, which is MIT licensed with the following copyright: > Copyright (c) 2018 Florian Klampfer <https://qwtel.com/> A copy of the [MIT] license is provided as part of this distribution. ### RxJS This software also uses portions of the `ReactiveX/rxjs` project, which is Apache-2.0 licensed with the following copyright: > Copyright (c) 2015-2017 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors No substantial changes to the software were made. No `NOTICE` file was provided. A copy of the [Apache-2.0] license is provided as part of this distribution. ### KaTeX This software also uses portions of the `Khan/KaTeX` project, which is MIT licensed with the following copyright: > Copyright (c) 2015 Khan Academy A copy of the [MIT] license is provided as part of this distribution. ### core-js This software also uses portions of the `zloirock/core-js` project, which is MIT licensed with the following copyright: > Copyright (c) 2014-2016 Denis Pushkarev A copy of the [MIT] license is provided as part of this distribution. ### color This software also uses portions of the `Qix-/color` project, which is MIT licensed with the following copyright: > Copyright (c) 2012 Heather Arthur A copy of the [MIT] license is provided as part of this distribution. ### elem-dataset This software also uses portions of the `awcross/elem-dataset` project, which is MIT licensed with the following copyright: > Copyright (c) Alex Cross (alexcross.io) A copy of the [MIT] license is provided as part of this distribution. ### Web Animations This software also uses portions of the `web-animations/web-animations-js` project, which is Apache-2.0 licensed with the following copyright: > Copyright 2014 Google Inc. All rights reserved. No substantial changes to the software were made. No `NOTICE` file was provided. A copy of the [Apache-2.0] license is provided as part of this distribution. ### Modernizr This software also uses portions of the `Modernizr/Modernizr` project, which is MIT licensed with the following copyright: > Copyright (c) > Faruk Ates > Paul Irish > Alex Sexton > Ryan Seddon > Patrick Kettner > Stu Cox > Richard Herrera A copy of the [MIT] license is provided as part of this distribution. ### Compress HTML in Jekyll This software also uses portions of the `penibelst/jekyll-compress-html` project, which is MIT licensed with the following copyright: > Copyright (c) 2014 Anatol Broder A copy of the [MIT] license is provided as part of this distribution. ### The HTML5 Shiv This software also uses portions of the `aFarkas/html5shiv` project, which is MIT licensed with the following copyright: > Copyright (c) 2014 Alexander Farkas (aFarkas). A copy of the [MIT] license is provided as part of this distribution. ### loadCSS This software also uses portions of the `filamentgroup/loadCSS` project, which is MIT licensed with the following copyright: > Copyright (c) @scottjehl, 2016 Filament Group A copy of the [MIT] license is provided as part of this distribution. ### Ratchet This software also uses portions of the `twbs/ratchet` project, which is MIT licensed with the following copyright: > Copyright (c) 2015 connors and other contributors A copy of the [MIT] license is provided as part of this distribution. ### Swipe This software also uses portions of the `thebird/Swipe` project, which is MIT licensed with the following copyright: > Copyright (c) 2013 Brad Birdsall A copy of the [MIT] license is provided as part of this distribution. ### smoothState This software also uses portions of the `miguel-perez/smoothState.js` project, which is MIT licensed with the following copyright: > Copyright (c) 2014 Miguel Angel Perez A copy of the [MIT] license is provided as part of this distribution. ### camelcase This software also uses portions of the `sindresorhus/camelcase` project, which is MIT licensed with the following copyright: > Copyright (c) Sindre Sorhus <[email protected]> (sindresorhus.com) A copy of the [MIT] license is provided as part of this distribution. ### decamelize This software also uses portions of the `sindresorhus/decamelize` project, which is MIT licensed with the following copyright: > Copyright (c) Sindre Sorhus <[email protected]> (sindresorhus.com) A copy of the [MIT] license is provided as part of this distribution. ### jQuery This software also uses portions of the `jquery/jquery` project, which is MIT licensed with the following copyright: > Copyright JS Foundation and other contributors, https://js.foundation/ A copy of the [MIT] license is provided as part of this distribution. ### Bootstrap This software also uses portions of the `twbs/bootstrap` project, which is MIT licensed with the following copyright: > Copyright (c) 2011-2018 Twitter, Inc. > Copyright (c) 2011-2018 The Bootstrap Authors A copy of the [MIT] license is provided as part of this distribution. ### Smooth Scroll behavior polyfill This software also uses portions of the `iamdustan/smoothscroll` project, which is MIT licensed with the following copyright: > Copyright (c) 2013 Dustan Kasten A copy of the [MIT] license is provided as part of this distribution. ### Atom One Light Syntax This software also uses portions of the `atom/one-light-syntax` project, which is MIT licensed with the following copyright: > Copyright (c) 2016 GitHub Inc. A copy of the [MIT] license is provided as part of this distribution. ### Atom One Dark Syntax This software also uses portions of the `atom/one-dark-syntax` project, which is MIT licensed with the following copyright: > Copyright (c) 2016 GitHub Inc. A copy of the [MIT] license is provided as part of this distribution. ### AMP HTML This software also uses portions of the `ampproject/amphtml` project, which is Apache-2.0 licensed with the following copyright: > Copyright 2015 The AMP HTML Authors. All Rights Reserved. Changes: Removed dev/user assertions. No `NOTICE` file was provided. A copy of the [Apache-2.0] license is provided as part of this distribution. ### Intersection Observers This software also uses portions of the `w3c/IntersectionObserver` project, which is W3C licensed with the following copyright: > Copyright 2016 Google Inc. All Rights Reserved. No substantial changes to the software were made. A copy of the [W3C] license is provided as part of this distribution. ### Font Face Observer This software also uses portions of the `bramstein/fontfaceobserver` project, which is BSD-style licensed with the following copyright: > Copyright (c) 2014 - Bram Stein > All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ### webcomponents.js (v1 spec polyfills) This software also uses portions of the `webcomponents/webcomponentsjs` project, which is BSD-style licensed with the following copyright: > Copyright (c) 2015 The Polymer Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [11]: https://icomoon.io/#icons-icomoon [12]: http://keyamoon.com/ [21]: https://commons.wikimedia.org/wiki/File:Jacques_Louis_David_-_Bonaparte_franchissant_le_Grand_Saint-Bernard,_20_mai_1800_-_Google_Art_Project.jpg [31]: https://commons.wikimedia.org/wiki/File:Mandel_zoom_08_satellite_antenna.jpg [41]: https://commons.wikimedia.org/wiki/File:Touch-161562.svg [ph]: https://unsplash.com/photos/AtvuPUenaeI?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText [cg]: http://www.caleb-morris.com/ [MIT]: licenses/MIT.md [GPL-3.0]: licenses/GPL-3.0.md [Apache-2.0]: licenses/Apache-2.0.md [W3C]: licenses/W3C.md [CC-BY-SA-4.0]: https://creativecommons.org/licenses/by-sa/4.0/ [CC-BY-SA-3.0]: https://creativecommons.org/licenses/by-sa/3.0/ [CC0-1.0]: https://creativecommons.org/publicdomain/zero/1.0/deed.en [Unsplash]: https://unsplash.com/license## License Summary * License concerns use of [Hydejack PRO][1] * License does not expire * Commercial use allowed * Can modify source code * Parts of software are provided under [separate licenses](../NOTICE.md#licenses) ## Terms and Conditions ### 1. Preamble This Agreement governs the relationship between you (hereinafter: Licensee) and Florian Klampfer qwtel.com (hereinafter: Licensor). This Agreement sets the terms, rights, restrictions and obligations on using Hydejack PRO (hereinafter: The Software) created and owned by Licensor, as detailed herein. ### 2. License Grant Licensor hereby grants Licensee a Personal, Perpetual, Commercial, Royalty free, Including the rights to create derivative works, Non-exclusive license, all with accordance with the terms set forth and other legal restrictions set forth in 3rd party software used while running Software. 1. **Limited:** Licensee may use Software for the purpose of: 1. Running Software on Licensee’s Website[s] and Server[s]; 2. Allowing 3rd Parties to run Software on Licensee’s Website[s] and Server[s]; 3. Publishing Software’s output to Licensee and 3rd Parties; 4. Modify Software to suit Licensee’s needs and specifications. 2. This license is granted perpetually, as long as you do not materially breach it. 3. **Commercial, Royalty Free:** Licensee may use Software for any purpose, including paid-services, without any royalties 4. **Including the Right to Create Derivative Works:** Licensee may create derivative works based on Software, including amending Software’s source code, modifying it, integrating it into a larger work or removing portions of Software. ### 3. Term & Termination: The Term of this license shall be until terminated. Licensor may terminate this Agreement, including Licensee’s license in the case where Licensee: 1. became insolvent or otherwise entered into any liquidation process; or 2. exported The Software to any jurisdiction where licensor may not enforce his rights under this agreements in; or 3. Licensee was in breach of any of this license's terms and conditions and such breach was not cured, immediately upon notification; or 4. Licensee in breach of any of the terms of clause 2 to this license; or 5. Licensee otherwise entered into any arrangement which caused Licensor to be unable to enforce his rights under this License. ### 4. Payment In consideration of the License granted under clause 2, Licensee shall pay Licensor a fee, via Credit-Card or any other means which Licensor may deem adequate. Failure to perform payment shall construe as material breach of this Agreement. ### 5. Upgrades, Updates and Fixes Licensor may provide Licensee, from time to time, with Upgrades, Updates or Fixes, as detailed herein and according to his sole discretion. Licensee hereby warrants to keep The Software up-to-date and install all relevant updates and fixes, and may, at his sole discretion, purchase upgrades, according to the rates set by Licensor. Licensor shall provide any update or Fix free of charge; however, nothing in this Agreement shall require Licensor to provide Updates or Fixes. 1. **Upgrades:** for the purpose of this license, an Upgrade shall be a material amendment in The Software, which contains new features and or major performance improvements and shall be marked as a new version number. For example, should Licensee purchase The Software under version 1.X.X, an upgrade shall commence under number 2.0.0. 2. **Updates:** for the purpose of this license, an update shall be a minor amendment in The Software, which may contain new features or minor improvements and shall be marked as a new sub-version number. For example, should Licensee purchase The Software under version 1.1.X, an upgrade shall commence under number 1.2.0. 3. **Fix:** for the purpose of this license, a fix shall be a minor amendment in The Software, intended to remove bugs or alter minor features which impair the The Software's functionality. A fix shall be marked as a new sub-sub-version number. For example, should Licensee purchase Software under version 1.1.1, an upgrade shall commence under number 1.1.2. ### 6. Support Software is provided under an AS-IS basis and without any support, updates or maintenance. Nothing in this Agreement shall require Licensor to provide Licensee with support or fixes to any bug, failure, mis-performance or other defect in The Software. 1. **Bug Notification:** Licensee may provide Licensor of details regarding any bug, defect or failure in The Software promptly and with no delay from such event; Licensee shall comply with Licensor's request for information regarding bugs, defects or failures and furnish him with information, screenshots and try to reproduce such bugs, defects or failures. 2. **Feature Request:** Licensee may request additional features in Software, provided, however, that: 1. Licensee shall waive any claim or right in such feature should feature be developed by Licensor; 2. Licensee shall be prohibited from developing the feature, or disclose such feature request, or feature, to any 3rd party directly competing with Licensor or any 3rd party which may be, following the development of such feature, in direct competition with Licensor; 3. Licensee warrants that feature does not infringe any 3rd party patent, trademark, trade-secret or any other intellectual property right; and 4. Licensee developed, envisioned or created the feature solely by himself. ### 7. Liability To the extent permitted under Law, The Software is provided under an AS-IS basis. Licensor shall never, and without any limit, be liable for any damage, cost, expense or any other payment incurred by Licensee as a result of Software’s actions, failure, bugs and/or any other interaction between The Software and Licensee’s end-equipment, computers, other software or any 3rd party, end-equipment, computer or services. Moreover, Licensor shall never be liable for any defect in source code written by Licensee when relying on The Software or using The Software’s source code. ### 8. Warranty 1. **No-Warranty:** The Software is provided without any warranty; Licensor hereby disclaims any warranty that The Software shall be error free, without defects or code which may cause damage to Licensee’s computers or to Licensee, and that Software shall be functional. Licensee shall be solely liable to any damage, defect or loss incurred as a result of operating software and undertake the risks contained in running The Software on License’s Server[s] and Website[s]. 2. **Prior Inspection:** Licensee hereby states that he inspected The Software thoroughly and found it satisfactory and adequate to his needs, that it does not interfere with his regular operation and that it does meet the standards and scope of his computer systems and architecture. Licensee found that The Software interacts with his development, website and server environment and that it does not infringe any of End User License Agreement of any software Licensee may use in performing his services. Licensee hereby waives any claims regarding The Software's incompatibility, performance, results and features, and warrants that he inspected the The Software. ### 9. No Refunds Licensee warrants that he inspected The Software according to clause 8.2 and that it is adequate to his needs. Accordingly, as The Software is intangible goods, Licensee shall not be, ever, entitled to any refund, rebate, compensation or restitution for any reason whatsoever, even if The Software contains material flaws. ### 10. Indemnification Licensee hereby warrants to hold Licensor harmless and indemnify Licensor for any lawsuit brought against it in regards to Licensee’s use of The Software in means that violate, breach or otherwise circumvent this license, Licensor's intellectual property rights or Licensor's title in The Software. Licensor shall promptly notify Licensee in case of such legal action and request Licensee’s consent prior to any settlement in relation to such lawsuit or claim. ### 11. Governing Law, Jurisdiction Licensee hereby agrees not to initiate class-action lawsuits against Licensor in relation to this license and to compensate Licensor for any legal fees, cost or attorney fees should any claim brought by Licensee against Licensor be denied, in part or in full. [1]: https://hydejack.com/**Status**: This license takes effect 13 May, 2015. This work is being provided by the copyright holders under the following license. ## License By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications: * The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. * Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included. * Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." ## Disclaimers THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT. The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders. ## Notes This version: <http://www.w3.org/Consortium/Legal/2015/copyright-software-and-document> Previous version: <http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231> This version makes clear that the license is applicable to both software and text, by changing the name and substituting "work" for instances of "software and its documentation." It moves "notice of changes or modifications to the files" to the copyright notice, to make clear that the license is compatible with other liberal licenses.{"/pages/mainsite/":"https://www.murrielgrace.com"}## Open Source * [Apache-2.0](/licenses/Apache-2.0/) * [GPL-3.0](/licenses/GPL-3.0/) * [MIT](/licenses/MIT/) * [W3C](/licenses/W3C/) ## Custom * [PRO](/licenses/PRO/){% if page.xsl %}{% endif %}<feed xmlns="http://www.w3.org/2005/Atom" {% if site.lang %}xml:lang="{{ site.lang }}"{% endif %}>Jekyll<link href="{{ '/' | absolute_url }}" rel="alternate" type="text/html" {% if site.lang %}hreflang="{{ site.lang }}" {% endif %}/>{{ site.time | date_to_xmlschema }}{{ page.url | absolute_url | xml_escape }}{% assign title = site.title | default: site.name %}{% if page.collection != "posts" %}{% assign collection = page.collection | capitalize %}{% assign title = title | append: " | " | append: collection %}{% endif %}{% if page.category %}{% assign category = page.category | capitalize %}{% assign title = title | append: " | " | append: category %}{% endif %}{% if title %}{{ title | smartify | xml_escape }}{% endif %}{% if site.description %}{{ site.description | xml_escape }}{% endif %}{% if site.author %}{{ site.author.name | default: site.author | xml_escape }}{% if site.author.email %}{{ site.author.email | xml_escape }}{% endif %}{% if site.author.uri %}{{ site.author.uri | xml_escape }}{% endif %}{% endif %}{% assign posts = site[page.collection] | where_exp: "post", "post.draft != true" | sort: "date" | reverse %}{% if page.category %}{% assign posts = posts | where: "category",page.category %}{% endif %}{% for post in posts limit: 10 %}<entry{% if post.lang %}{{" "}}xml:lang="{{ post.lang }}"{% endif %}>{{ post.title | smartify | strip_html | normalize_whitespace | xml_escape }}{{ post.date | date_to_xmlschema }}{{ post.last_modified_at | default: post.date | date_to_xmlschema }}{{ post.id | absolute_url | xml_escape }}{% assign excerpt_only = post.feed.excerpt_only | default: site.feed.excerpt_only %}{% unless excerpt_only %}{{ post.content | strip | xml_escape }}{% endunless %}{% assign post_author = post.author | default: post.authors[0] | default: site.author %}{% assign post_author = site.data.authors[post_author] | default: post_author %}{% assign post_author_email = post_author.email | default: nil %}{% assign post_author_uri = post_author.uri | default: nil %}{% assign post_author_name = post_author.name | default: post_author %}{{ post_author_name | default: "" | xml_escape }}{% if post_author_email %}{{ post_author_email | xml_escape }}{% endif %}{% if post_author_uri %}{{ post_author_uri | xml_escape }}{% endif %}{% if post.category %}{% endif %}{% for tag in post.tags %}{% endfor %}{% if post.excerpt and post.excerpt != empty %}{{ post.excerpt | strip_html | normalize_whitespace | xml_escape }}{% endif %}{% assign post_image = post.image.path | default: post.image %}{% if post_image %}{% unless post_image contains "://" %}{% assign post_image = post_image | absolute_url %}{% endunless %}{% endif %}</entry>{% endfor %}</feed> {% if page.xsl %} {% endif %} {% assign collections = site.collections | where_exp:'collection','collection.output != false' %}{% for collection in collections %}{% assign docs = collection.docs | where_exp:'doc','doc.sitemap != false' %}{% for doc in docs %} {{ doc.url | replace:'/index.html','/' | absolute_url | xml_escape }} {% if doc.last_modified_at or doc.date %}{{ doc.last_modified_at | default: doc.date | date_to_xmlschema }} {% endif %} {% endfor %}{% endfor %}{% assign pages = site.html_pages | where_exp:'doc','doc.sitemap != false' | where_exp:'doc','doc.url != "/404.html"' %}{% for page in pages %} {{ page.url | replace:'/index.html','/' | absolute_url | xml_escape }} {% if page.last_modified_at %}{{ page.last_modified_at | date_to_xmlschema }} {% endif %} {% endfor %}{% assign static_files = page.static_files | where_exp:'page','page.sitemap != false' | where_exp:'page','page.name != "404.html"' %}{% for file in static_files %} {{ file.path | replace:'/index.html','/' | absolute_url | xml_escape }} {{ file.modified_time | date_to_xmlschema }} {% endfor %} Sitemap: {{ "sitemap.xml" | absolute_url }} Posts are: <!DOCTYPE html>the first and future post | Hello, Reader

the first and future post

felt creative, might delete later</header>

Writing has always been a consistent and important part of my life. read.murrielgrace.com was initially intended as living documentation to complement the portfolio site at www.murrielgrace.com but fell into a state of disrepair for many moons as other priorities and distractions replaced my writing habit.

After a valiant battle with Jekyll theming, various stops and starts, and a healthy end-of-year refactoring round, we have arrived here at the first official revision of this website.

The collections here will eventually capture and chronicle projects, talks, and publications - along with various ramblings. For now, I am embracing imperfect releases and frequent iterations in my So-Called Agile Life and work. Thank you for embarking on this journey with me - as of yet I do not know where it will lead.</article>