diff --git a/2017.md b/2017.md
index 03e387b6..6e728474 100644
--- a/2017.md
+++ b/2017.md
@@ -6,16 +6,17 @@
* Reactive programming continues to thrive in the JavaScript scene. (see MobX and RxJS).
* React, more so the concept, will dominate. React itself will be completely re-written (see [React Fiber](https://github.com/acdlite/react-fiber-architecture)) or evolve (see [Inferno](https://github.com/infernojs/inferno)).
* Angular found SEMVER so Angular 4 (even 5) is on the [roadmap](https://www.youtube.com/watch?v=aJIMoLgqU_o&feature=youtu.be&t=6m12s) for 2017.
-* A return to simple websites may happen, web 1.0 retro, but with the help of 2017 tools (i.e. [static site generation](https://github.com/vigetlabs/gulp-starter/tree/blendid))
+* A return to simple websites may happen, web 1.0 retro, but with the help of 2017 tools (i.e. [static site generation](https://github.com/vigetlabs/blendid))
* RESTful JSON APIs will get more competition (see [GraphQL](http://graphql.org/))
* Could be a banner year for [Vue.js](https://vuejs.org/).
-* More devs will abandon traditional CMS solutions for static site generators & [API CMS tools](https://www.google.com/webhp?sourceid=chrome-instant&rlz=1C5CHFA_enUS712US713&ion=1&espv=2&ie=UTF-8#q=api%20cms).
+* More devs will abandon traditional CMS solutions for [static site generators](https://www.staticgen.com/) & [API CMS tools aka Headless CMS's](https://en.wikipedia.org/wiki/Headless_CMS).
* More people will move from Sass to [PostCSS](http://postcss.org/) + cssnext.
* Lots more HTTP2 and HTTPS.
* Web components will continue to lurk and wait for significant traction by developers that might never come to be.
-* The no framework, framework, faction will gain momentum (see [Svelte](https://svelte.technology/blog/frameworks-without-the-framework/)).
+* The no framework, framework, faction will gain momentum (see [Svelte](https://svelte.technology/blog/frameworks-without-the-framework)).
* JavaScript will settle, and hopefully, CSS will erupt and everyone will cry fatigue until it settles.
* Hatred for apps store will grow, while the open web has no memory of wrong doing.
* Redux will continue to get stiff competition (see [mobx](https://mobx.js.org/)).
* YARN will win more users.
* The idea of “front-end apps”, “Thick Client apps”, “Static apps”, “No Backend app”, “SPA's”, “Front-end driven app” might get boiled down to the term/concept called ["JAM Stack"](https://jamstack.org/).
+* While [bower](https://bower.io/) is maintained, it's recommend to use [yarn](https://yarnpkg.com/) and [webpack](https://webpack.js.org/) for new front-end projects.
diff --git a/README.md b/README.md
index 04766aef..0dff857c 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,14 @@
-# Front-End Developer Handbook 2017
+
+# AVAILABLE NOW: [Front-End Developer Handbook 2019](https://frontendmasters.com/books/front-end-handbook/2019/)
+
+***
+
+### Front-End Developer Handbook 2017
Written by [Cody Lindley](http://codylindley.com/) sponsored by — [Frontend Masters](https://frontendmasters.com/)
+
+
This is a guide that anyone could use to learn about the practice of front-end development. It broadly outlines and discusses the practice of front-end engineering: how to learn it and what tools are used when practicing it in 2017.
It is specifically written with the intention of being a professional resource for potential and currently practicing front-end developers to equip themselves with learning materials and development tools. Secondarily, it can be used by managers, CTOs, instructors, and head hunters to gain insights into the practice of front-end development.
@@ -27,14 +34,14 @@ Part III: Front-End Development Tools
Part three briefly explains and identifies tools of the trade.
***
-
-**Download a .pdf, .epub, or .mobi File From**:
-* [https://www.gitbook.com/book/frontendmasters/front-end-handbook-2017/details](https://www.gitbook.com/book/frontendmasters/front-end-handbook-2017/details)
+**Read Online**:
-**Contribute Content, Suggestions, and Fixes on GitHub**:
+* [https://frontendmasters.com/books/front-end-handbook/2017/](https://frontendmasters.com/books/front-end-handbook/2017/)
-* [https://github.com/FrontendMasters/front-end-handbook-2017](https://github.com/FrontendMasters/front-end-handbook-2017)
+**Download a .pdf, .epub, or .mobi File From**:
+
+* [https://www.gitbook.com/book/frontendmasters/front-end-handbook-2017/details](https://www.gitbook.com/book/frontendmasters/front-end-handbook-2017/details)
***
diff --git a/_layouts/website/page.html b/_layouts/website/page.html
new file mode 100644
index 00000000..8220384d
--- /dev/null
+++ b/_layouts/website/page.html
@@ -0,0 +1,30 @@
+{% extends template.self %}
+
+{% block body %}
+
+
+ {{ super() }}
+
+
+
+{% endblock %}
diff --git a/book.json b/book.json
index 770f1179..2755da06 100644
--- a/book.json
+++ b/book.json
@@ -1,13 +1,20 @@
{
+ "title": "Front End Developer Handbook 2017",
"structure": {
"readme": "myIntro.md"
},
- "plugins": ["scripts"],
+ "plugins": [
+ "scripts",
+ "canonical-link"
+ ],
"pluginsConfig": {
"scripts": {
"files": [
"./gtm-analytics.js"
]
+ },
+ "canonical-link": {
+ "baseURL": "https://frontendmasters.com/books/front-end-handbook/2017"
}
}
-}
\ No newline at end of file
+}
diff --git a/learning/accessibility.md b/learning/accessibility.md
index dc00650c..3bc2de00 100644
--- a/learning/accessibility.md
+++ b/learning/accessibility.md
@@ -20,6 +20,8 @@
* [Web Accessibility: Getting Started](http://www.pluralsight.com/courses/web-accessibility-getting-started) [watch][$]
* [A Web for Everyone](http://rosenfeldmedia.com/books/a-web-for-everyone/) [read][$]
* [Web Accessibility](https://frontendmasters.com/workshops/accessibility/) [watch][$]
+* [A11ycasts](https://www.youtube.com/playlist?list=PLNYkxOF6rcICWx0C9LVWWVqvHlYJyqw7g) [watch]
+* [Accessibility by Google](https://www.udacity.com/course/web-accessibility--ud891) - Udacity course [watch]
##### Standards/Specifications:
diff --git a/learning/courses.md b/learning/courses.md
index 28b5e901..5475df73 100644
--- a/learning/courses.md
+++ b/learning/courses.md
@@ -18,7 +18,14 @@ If you can't afford a directed education, a self directed education using screen
| Betamore |
Front-end Web Development |
- 8,500 |
+ 3,000 |
+ Baltimore, MD |
+ |
+
+
+ | Betamore |
+ Introduction to Full Stack Web Development |
+ 3,400 |
Baltimore, MD |
|
diff --git a/learning/front-end-apps.md b/learning/front-end-apps.md
index f8cd77d3..63c4f321 100644
--- a/learning/front-end-apps.md
+++ b/learning/front-end-apps.md
@@ -7,10 +7,9 @@
##### Deprecated Learning Materials:
-* [Build an App with React and Ampersand](http://learn.humanjavascript.com/react-ampersand) [watch][$]
+* [Build an App with React and Ampersand](http://learn.humanjavascript.com/react-ampersand) [watch]
* [Building Modern Single-Page Web Applications](https://frontendmasters.com/courses/modern-web-apps/) [watch][$]
* [Eloquent JavaScript: Modules](http://eloquentjavascript.net/10_modules.html) [read]
-* [A Field Guide to Static Apps](http://www.staticapps.org/) [read]
* [Field Guide to Web Applications](http://www.html5rocks.com/webappfieldguide/toc/index/) [read]
* [Frontend Guidelines Questionnaire](https://github.com/bradfrost/frontend-guidelines-questionnaire) [read]
* [Human JavaScript](http://read.humanjavascript.com/) [read]
diff --git a/learning/news-podcasts.md b/learning/news-podcasts.md
index 353b3324..b08887bb 100644
--- a/learning/news-podcasts.md
+++ b/learning/news-podcasts.md
@@ -4,16 +4,13 @@
* [The Big Web Show](http://5by5.tv/bigwebshow)
* [Dev Tips](https://umaar.com/dev-tips/)
-* [Front-End Dev Weekly](http://frontenddevweekly.com/)
* [Front End Happy Hour](http://frontendhappyhour.com/)
-* [Front-End News in 5 Minutes](https://frontendfive.codeschool.com/)
* [Front-End Front](http://frontendfront.com/)
* [FrontEnd Focus](http://frontendfocus.co/)
-* [Front End Newsletter](http://frontendnewsletter.com/)
* [The Frontside Podcast](https://frontsidethepodcast.simplecast.fm/)
* [Mobile Web Weekly](http://mobilewebweekly.co/)
* [Non Breaking Space Show](http://nonbreakingspace.tv)
-* [Open Web Platform Daily Digest](http://webplatformdaily.org/)
+* [Web Platform News Weekly](https://webplatform.news/)
* [ShopTalk Show](http://shoptalkshow.com/)
* [UX Design Newsletter](http://uxdesignnewsletter.com/)
* [The Versioning Show by SitePoint](https://www.sitepoint.com/versioning-show/)
@@ -21,7 +18,7 @@
* [Web Development Reading List](https://wdrl.info/)
* [The Web Platform Podcast](http://thewebplatform.libsyn.com/)
* [Web Tools Weekly](http://webtoolsweekly.com/)
-
+* [Fresh Brewed Frontend](https://freshbrewed.co/frontend/)
##### HTML/CSS Newsletters:
diff --git a/learning/perf.md b/learning/perf.md
index ac3fce71..c7a3c214 100644
--- a/learning/perf.md
+++ b/learning/perf.md
@@ -9,7 +9,7 @@
* [Browser Rendering Optimization](https://www.udacity.com/course/browser-rendering-optimization--ud860) [watch]
* [Even Faster Web Sites: Performance Best Practices for Web Developers](https://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304?&_encoding=UTF8&tag=frontend-handbook-20&linkCode=ur2&linkId=4fe6a82bbf727209ba337ecaa0e516bc&camp=1789&creative=9325) [read][$]
* [High Performance Web Sites: Essential Knowledge for Front-End Engineers](https://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/?&_encoding=UTF8&tag=frontend-handbook-20&linkCode=ur2&linkId=e93ab3ea06b7e3e93ee0d868249d0e3f&camp=1789&creative=9325) [read][$]
-* [JavaScript Performance Rocks](http://javascriptrocks.com/) [read]
+* [JavaScript Performance Rocks](http://javascriptrocks.com/) [read][$]
* [PageSpeed Insights Rules](https://developers.google.com/speed/docs/insights/rules) [read]
* [perf-tooling.today](http://www.perf-tooling.today/) [read]
* [Performance Calendar](http://calendar.perfplanet.com) [read]
diff --git a/learning/react-redux.md b/learning/react-redux.md
index b440fa69..d0f1fc31 100644
--- a/learning/react-redux.md
+++ b/learning/react-redux.md
@@ -2,7 +2,7 @@
##### React:
-* [React.js Introduction For People Who Know Just Enough jQuery To Get By](http://reactfordesigners.com/labs/reactjs-introduction-for-people-who-know-just-enough-jquery-to-get-by/) [read]
+* [React.js Introduction For People Who Know Just Enough jQuery To Get By](http://chibicode.com/react-js-introduction-for-people-who-know-just-enough-jquery-to-get-by/) [read]
* [React.js Fundamentals](https://online.reacttraining.com/courses/enrolled/reactjsfundamentals) [watch]
* [13 things you need to know about React](http://aimforsimplicity.com/post/13-things-you-need-to-know-about-react/) [read]
* [Tutorial: Intro To React](https://facebook.github.io/react/tutorial/tutorial.html) [read]
diff --git a/myIntro.md b/myIntro.md
index 7d76f502..b93ab11e 100644
--- a/myIntro.md
+++ b/myIntro.md
@@ -1,9 +1,13 @@
-# Front-End Developer Handbook 2017
+# AVAILABLE NOW: [Front-End Developer Handbook 2018](https://frontendmasters.com/books/front-end-handbook/2018/)
-
+***
+
+### Front-End Developer Handbook 2017
Written by [Cody Lindley](http://codylindley.com/) sponsored by — [Frontend Masters](https://frontendmasters.com/)
+
+
This is a guide that anyone could use to learn about the practice of front-end development. It broadly outlines and discusses the practice of front-end engineering: how to learn it and what tools are used when practicing it in 2017.
It is specifically written with the intention of being a professional resource for potential and currently practicing front-end developers to equip themselves with learning materials and development tools. Secondarily, it can be used by managers, CTOs, instructors, and head hunters to gain insights into the practice of front-end development.
@@ -30,20 +34,14 @@ Part three briefly explains and identifies tools of the trade.
***
-**Download a .pdf, .epub, or .mobi file from**:
+**Download a .pdf, .epub, or .mobi file from**:
* [https://www.gitbook.com/book/frontendmasters/front-end-handbook-2017/details](https://www.gitbook.com/book/frontendmasters/front-end-handbook-2017/details)
-**Contribute content, suggestions, and fixes on github**:
+**Contribute content, suggestions, and fixes on github**:
* [https://github.com/FrontendMasters/front-end-handbook-2017](https://github.com/FrontendMasters/front-end-handbook-2017)
***

This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
-
-
-
-
-
-
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..38efd785
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2316 @@
+{
+ "name": "front-end-handbook-2017",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "front-end-handbook-2017",
+ "version": "1.0.0",
+ "devDependencies": {
+ "gitbook-plugin-canonical-link": "^2.0.3",
+ "gitbook-plugin-scripts": "^1.0.2",
+ "honkit": "^4.0.4"
+ }
+ },
+ "node_modules/@asciidoctor/cli": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@asciidoctor/cli/-/cli-3.5.0.tgz",
+ "integrity": "sha512-/VMHXcZBnZ9vgWfmqk9Hu0x0gMjPLup0YGq/xA8qCQuk11kUIZNMVQwgSsIUzOEwJqIUD7CgncJdtfwv1Ndxuw==",
+ "dev": true,
+ "dependencies": {
+ "yargs": "16.2.0"
+ },
+ "bin": {
+ "asciidoctor": "bin/asciidoctor",
+ "asciidoctorjs": "bin/asciidoctor"
+ },
+ "engines": {
+ "node": ">=8.11",
+ "npm": ">=5.0.0"
+ },
+ "peerDependencies": {
+ "@asciidoctor/core": "^2.0.0-rc.1"
+ }
+ },
+ "node_modules/@asciidoctor/core": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.6.tgz",
+ "integrity": "sha512-TmB2K5UfpDpSbCNBBntXzKHcAk2EA3/P68jmWvmJvglVUdkO9V6kTAuXVe12+h6C4GK0ndwuCrHHtEVcL5t6pQ==",
+ "dev": true,
+ "dependencies": {
+ "asciidoctor-opal-runtime": "0.3.3",
+ "unxhr": "1.0.1"
+ },
+ "engines": {
+ "node": ">=8.11",
+ "npm": ">=5.0.0",
+ "yarn": ">=1.1.0"
+ }
+ },
+ "node_modules/@honkit/asciidoc": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/@honkit/asciidoc/-/asciidoc-4.0.8.tgz",
+ "integrity": "sha512-wyVBKfX9yM5P8nm81ew1cdTR0hKWFB9hRTvwGXBVS+ipD+WFTQWxVw3qNQapMKRiiVq/L3QA6bpkIDul3EJ43w==",
+ "dev": true,
+ "dependencies": {
+ "@honkit/html": "^4.0.8",
+ "asciidoctor": "^2.2.0",
+ "lodash": "^4.13.1"
+ }
+ },
+ "node_modules/@honkit/honkit-plugin-highlight": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/@honkit/honkit-plugin-highlight/-/honkit-plugin-highlight-4.0.8.tgz",
+ "integrity": "sha512-fu1QFxS/m0X9uIK8vrn9TGN2HLJ8AjK03L4/yZo+ioYG55ALgTE3tNz7CrGPGjUn+uluLMmrvcJQDpPUmTMYdQ==",
+ "dev": true,
+ "dependencies": {
+ "highlight.js": "^10.7.1"
+ },
+ "engines": {
+ "gitbook": ">=2.4.0"
+ }
+ },
+ "node_modules/@honkit/honkit-plugin-theme-default": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/@honkit/honkit-plugin-theme-default/-/honkit-plugin-theme-default-4.0.8.tgz",
+ "integrity": "sha512-1CaoaAZZYWOJGnBsdi63ulKqxNcHXAQZPq1QqUsxE3Ml+YJZnyf/0uq8wuUdxJ/TzG4iyaXA2jT92xHlCkXJ1w==",
+ "dev": true,
+ "engines": {
+ "gitbook": ">=3.0.0"
+ }
+ },
+ "node_modules/@honkit/html": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/@honkit/html/-/html-4.0.8.tgz",
+ "integrity": "sha512-tpMpYrPKT3RqZC8i00oGHuY+BR+6S3stEONEpMQM9xz1Zj266TXZ5GRXkX4n2cb5DA6OmeR5asYxd7gTXNPjqw==",
+ "dev": true,
+ "dependencies": {
+ "cheerio": "^1.0.0-rc.12",
+ "lodash": "^4.13.1",
+ "q": "^1.1.2"
+ }
+ },
+ "node_modules/@honkit/markdown-legacy": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/@honkit/markdown-legacy/-/markdown-legacy-4.0.8.tgz",
+ "integrity": "sha512-DqLDDzFbyLuBVYDfrhl4b67LdcbmMzRR+U/DwvXOCc8PqNx6nQoLHnAOpLQN/UP4/P6e7mWaJN9iSjfzg4Q0MQ==",
+ "dev": true,
+ "dependencies": {
+ "@honkit/html": "^4.0.8",
+ "kramed": "0.5.6",
+ "lodash": "^4.13.1"
+ }
+ },
+ "node_modules/a-sync-waterfall": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-difference": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT Expat"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asciidoctor": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/asciidoctor/-/asciidoctor-2.2.6.tgz",
+ "integrity": "sha512-EXG3+F2pO21B+COfQmV/WgEgGiy7nG/mJiS/o5DXpaT2q82FRZWPVkbMZrpDvpu4pjXe5c754RbZR9Vz0L0Vtw==",
+ "dev": true,
+ "dependencies": {
+ "@asciidoctor/cli": "3.5.0",
+ "@asciidoctor/core": "2.2.6"
+ },
+ "bin": {
+ "asciidoctor": "bin/asciidoctor",
+ "asciidoctorjs": "bin/asciidoctor"
+ },
+ "engines": {
+ "node": ">=8.11",
+ "npm": ">=5.0.0",
+ "yarn": ">=1.1.0"
+ }
+ },
+ "node_modules/asciidoctor-opal-runtime": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.3.tgz",
+ "integrity": "sha512-/CEVNiOia8E5BMO9FLooo+Kv18K4+4JBFRJp8vUy/N5dMRAg+fRNV4HA+o6aoSC79jVU/aT5XvUpxSxSsTS8FQ==",
+ "dev": true,
+ "dependencies": {
+ "glob": "7.1.3",
+ "unxhr": "1.0.1"
+ },
+ "engines": {
+ "node": ">=8.11"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bash-color": {
+ "version": "0.0.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/body": {
+ "version": "5.1.0",
+ "dev": true,
+ "dependencies": {
+ "continuable-cache": "^0.3.1",
+ "error": "^7.0.0",
+ "raw-body": "~1.1.0",
+ "safe-json-parse": "~1.0.1"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "1.0.0",
+ "dev": true
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "dev": true,
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cheerio/node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/cheerio/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/continuable-cache": {
+ "version": "0.3.1",
+ "dev": true
+ },
+ "node_modules/cp": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cpr": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "graceful-fs": "^4.1.5",
+ "minimist": "^1.2.0",
+ "mkdirp": "~0.5.1",
+ "rimraf": "^2.5.4"
+ },
+ "bin": {
+ "cpr": "bin/cpr"
+ }
+ },
+ "node_modules/cpr/node_modules/mkdirp": {
+ "version": "0.5.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/crc": {
+ "version": "3.8.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.1.0"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/depd": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/direction": {
+ "version": "0.1.5",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "direction": "cli.js"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^1.3.0",
+ "entities": "^1.1.1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/domelementtype": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/domutils/node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domutils/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/error": {
+ "version": "7.0.2",
+ "dev": true,
+ "dependencies": {
+ "string-template": "~0.2.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-goat": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.10.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "2.6.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/front-matter": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^3.10.0"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gitbook-plugin-canonical-link": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/gitbook-plugin-canonical-link/-/gitbook-plugin-canonical-link-2.0.3.tgz",
+ "integrity": "sha512-lidsygXDF7xjChi6ENsgp5J3Nib4K9fOPQrjl2m//EwjjMRGIWYpYRioKmvnYqAqPVk0VIkbuC5szBJqXBbwKw==",
+ "dev": true,
+ "engines": {
+ "gitbook": "*"
+ }
+ },
+ "node_modules/gitbook-plugin-fontsettings": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "gitbook": ">=2.4.0"
+ }
+ },
+ "node_modules/gitbook-plugin-livereload": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "Apache 2",
+ "engines": {
+ "gitbook": "*"
+ }
+ },
+ "node_modules/gitbook-plugin-lunr": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gitbook-plugin-search": "*",
+ "html-entities": "1.2.0",
+ "lunr": "0.5.12"
+ },
+ "engines": {
+ "gitbook": ">=3.0.0-pre.0"
+ }
+ },
+ "node_modules/gitbook-plugin-scripts": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/gitbook-plugin-scripts/-/gitbook-plugin-scripts-1.0.2.tgz",
+ "integrity": "sha512-gd+ufeVng6C+Yc+0F0etIjAk8CmbHlCSIw8TMQZuxOWfV2srKgockyCiV1v9YnrmmGR+LvPl6uvrR4lxs+qmWg==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "*",
+ "tmp": "0.0.28"
+ },
+ "engines": {
+ "gitbook": ">=2.4.0"
+ }
+ },
+ "node_modules/gitbook-plugin-search": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "gitbook": ">=3.0.0-pre.0"
+ }
+ },
+ "node_modules/github-slugid": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/glob": {
+ "version": "7.1.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/honkit": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/honkit/-/honkit-4.0.8.tgz",
+ "integrity": "sha512-CCD6+HTOvgta4VO1HsWUq/Qp+C7PPnwUH5O1xQx0hLjKh5zeBkeu1r1AOa+Ez1QltoAHrdK2RPxkQ5hsnQnDrQ==",
+ "dev": true,
+ "dependencies": {
+ "@honkit/asciidoc": "^4.0.8",
+ "@honkit/honkit-plugin-highlight": "^4.0.8",
+ "@honkit/honkit-plugin-theme-default": "^4.0.8",
+ "@honkit/markdown-legacy": "^4.0.8",
+ "bash-color": "^0.0.4",
+ "cheerio": "^1.0.0-rc.12",
+ "chokidar": "^3.3.0",
+ "commander": "^5.1.0",
+ "cp": "^0.2.0",
+ "cpr": "^3.0.1",
+ "crc": "^3.8.0",
+ "destroy": "^1.0.4",
+ "direction": "^0.1.5",
+ "dom-serializer": "^0.1.0",
+ "error": "7.0.2",
+ "escape-html": "^1.0.3",
+ "escape-string-regexp": "^4.0.0",
+ "extend": "^3.0.0",
+ "flat-cache": "^2.0.1",
+ "front-matter": "^2.1.0",
+ "gitbook-plugin-fontsettings": "^2.0.0",
+ "gitbook-plugin-livereload": "^0.0.1",
+ "gitbook-plugin-lunr": "^1.2.0",
+ "gitbook-plugin-search": "^2.2.1",
+ "github-slugid": "^1.0.1",
+ "i18n-t": "^1.0.1",
+ "ignore": "^5.1.8",
+ "immutable": "^3.8.1",
+ "is": "^3.1.0",
+ "js-yaml": "^3.6.1",
+ "json-schema-defaults": "^0.1.1",
+ "jsonschema": "1.1.0",
+ "juice": "^8.0.0",
+ "lru_map": "^0.4.1",
+ "memoize-one": "^5.1.1",
+ "mkdirp": "^1.0.4",
+ "moment": "^2.24.0",
+ "nunjucks": "^3.2.0",
+ "nunjucks-do": "^1.0.0",
+ "object-path": "^0.11.5",
+ "omit-keys": "^0.1.0",
+ "open": "^7.0.0",
+ "q": "^1.5.1",
+ "resolve": "^1.17.0",
+ "semver": "^7.5.2",
+ "send": "^0.17.1",
+ "tiny-lr": "^1.1.1",
+ "tmp": "0.0.28",
+ "try-resolve": "^1.0.1",
+ "urijs": "^1.19.6"
+ },
+ "bin": {
+ "honkit": "bin/honkit.js"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "1.2.0",
+ "dev": true,
+ "engines": [
+ "node >= 0.4.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "1.8.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.8",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/i18n-t": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "lodash": "^4.13.1"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "3.8.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/is": {
+ "version": "3.3.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.12.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isobject": {
+ "version": "0.2.0",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-schema-defaults": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonschema": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/juice": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio": "1.0.0-rc.10",
+ "commander": "^6.1.0",
+ "mensch": "^0.3.4",
+ "slick": "^1.12.2",
+ "web-resource-inliner": "^6.0.1"
+ },
+ "bin": {
+ "juice": "bin/juice"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/juice/node_modules/cheerio": {
+ "version": "1.0.0-rc.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^1.5.0",
+ "dom-serializer": "^1.3.2",
+ "domhandler": "^4.2.0",
+ "htmlparser2": "^6.1.0",
+ "parse5": "^6.0.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.1",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/juice/node_modules/cheerio-select": {
+ "version": "1.6.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "css-select": "^4.3.0",
+ "css-what": "^6.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/juice/node_modules/commander": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/juice/node_modules/css-select": {
+ "version": "4.3.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/juice/node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/juice/node_modules/domhandler": {
+ "version": "4.3.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/juice/node_modules/domutils": {
+ "version": "2.8.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/juice/node_modules/entities": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/juice/node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/juice/node_modules/parse5": {
+ "version": "6.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/juice/node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^6.0.1"
+ }
+ },
+ "node_modules/kramed": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/kramed/-/kramed-0.5.6.tgz",
+ "integrity": "sha512-V4qwQAp8HPQPU6Ph9Q4bc+P+nKQWEGlWYLRDkK7n+CPaMi8/VRm9/R710tRmag4whLsnKR91CO9Ras/Rnff9bw==",
+ "dev": true,
+ "bin": {
+ "kramed": "bin/kramed"
+ }
+ },
+ "node_modules/livereload-js": {
+ "version": "2.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru_map": {
+ "version": "0.4.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lunr": {
+ "version": "0.5.12",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/memoize-one": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mensch": {
+ "version": "0.3.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.29.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.12",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nunjucks": {
+ "version": "3.2.4",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "a-sync-waterfall": "^1.0.0",
+ "asap": "^2.0.3",
+ "commander": "^5.1.0"
+ },
+ "bin": {
+ "nunjucks-precompile": "bin/precompile"
+ },
+ "engines": {
+ "node": ">= 6.9.0"
+ },
+ "peerDependencies": {
+ "chokidar": "^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nunjucks-do": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.3",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-path": {
+ "version": "0.11.8",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.12.0"
+ }
+ },
+ "node_modules/omit-keys": {
+ "version": "0.1.0",
+ "dev": true,
+ "dependencies": {
+ "array-difference": "0.0.1",
+ "isobject": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/open": {
+ "version": "7.4.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dev": true,
+ "dependencies": {
+ "entities": "^4.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
+ "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+ "dev": true,
+ "dependencies": {
+ "domhandler": "^5.0.2",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.2",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "1.1.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "1",
+ "string_decoder": "0.10"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.7.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-json-parse": {
+ "version": "1.0.1",
+ "dev": true
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.17.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.8.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/destroy": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/slick": {
+ "version": "1.12.2",
+ "dev": true,
+ "license": "MIT (http://mootools.net/license.txt)",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "0.10.31",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-template": {
+ "version": "0.2.1",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tiny-lr": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "body": "^5.1.0",
+ "debug": "^3.1.0",
+ "faye-websocket": "~0.10.0",
+ "livereload-js": "^2.3.0",
+ "object-assign": "^4.1.0",
+ "qs": "^6.4.0"
+ }
+ },
+ "node_modules/tiny-lr/node_modules/debug": {
+ "version": "3.2.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.0.28",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "os-tmpdir": "~1.0.1"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/try-resolve": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.6.0",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/unxhr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.0.1.tgz",
+ "integrity": "sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.11"
+ }
+ },
+ "node_modules/urijs": {
+ "version": "1.19.11",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/valid-data-url": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/web-resource-inliner": {
+ "version": "6.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "escape-goat": "^3.0.0",
+ "htmlparser2": "^5.0.0",
+ "mime": "^2.4.6",
+ "node-fetch": "^2.6.0",
+ "valid-data-url": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": {
+ "version": "4.3.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/domhandler": {
+ "version": "3.3.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/domutils": {
+ "version": "2.8.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": {
+ "version": "4.3.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/entities": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/htmlparser2": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^3.3.0",
+ "domutils": "^2.4.2",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/htmlparser2?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/mime": {
+ "version": "2.6.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/write": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mkdirp": "^0.5.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/write/node_modules/mkdirp": {
+ "version": "0.5.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..4180e586
--- /dev/null
+++ b/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "front-end-handbook-2017",
+ "version": "1.0.0",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/FrontendMasters/front-end-handbook-2017.git"
+ },
+ "scripts": {
+ "start": "honkit serve",
+ "build": "honkit build"
+ },
+ "devDependencies": {
+ "gitbook-plugin-canonical-link": "^2.0.3",
+ "gitbook-plugin-scripts": "^1.0.2",
+ "honkit": "^4.0.4"
+ }
+}
diff --git a/scripts/pathway.js b/scripts/pathway.js
new file mode 100644
index 00000000..ce65d0ec
--- /dev/null
+++ b/scripts/pathway.js
@@ -0,0 +1,8 @@
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(this,(function(){return function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})}};e.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),e.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},e.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var t={};e.r(t),e.d(t,{RM:function(){return le}});var n=0,r={token:"empty token",errorCount:0,tjsToken:"8de4c78a3ec64020ab2ad15dea1ae9ff",tjsApp:"rmagent",tjsVersion:"3.6.0",getErrorUrl:function(){return"https://capture.trackjs.com/capture?token="+r.tjsToken+"&v="+r.tjsVersion+"&source=rm"},error:function(e,t){if(void 0===t&&(t=null),!(n>=2)){var i=e||{},o=i.message||"empty",s=i.stack||(new Error).stack;r.errorCount++;var a=(self.location||"").toString(),c={agentPlatform:"browser",console:[{message:JSON.stringify(e),severity:"log",timestamp:(new Date).toISOString()}],customer:{token:r.tjsToken,application:r.tjsApp,userId:r.token,version:"1.13.1"},entry:"catch",environment:{originalUrl:a,userAgent:navigator.userAgent},message:o,url:a,stack:s,timestamp:(new Date).toISOString(),version:r.tjsVersion};null!=t&&c.console.push({message:t,severity:"log",timestamp:(new Date).toISOString()});var u=new XMLHttpRequest;u.open("POST",r.getErrorUrl()),u.send(JSON.stringify(c)),n++}}};function i(){return"undefined"==typeof document}function o(e){return(e=e||"").indexOf("?")>=0&&(e=e.split("?")[0]),e.length>=1e3&&(e=e.substr(0,1e3)),e}function s(e,t){if((e=""+e).length<=t)return e;var n=e.length-t;return e.substr(0,t)+"...{"+n+"}"}function a(e,t){return void 0===t&&(t=0),parseFloat(e.toFixed(t))}var c=["com","net","gov","edu","org"];function u(e,t,n){var r=e[t]||l;e[t]=n(r)}function l(){}function p(){return Math.floor(1e3*(Date.now()+Math.random()))}function f(e,t){try{for(var n=t.split("."),r=e,i=0;i25?delete e[t]:e[t]=s(e[t],100)})),e}function h(e){return Object.prototype.toString.call(e)}function g(e){return v(e)&&1===e.nodeType}function m(e){return"number"==typeof e||v(e)&&"[object Number]"===h(e)}function v(e){return!(!e||"object"!=typeof e)}function y(e){return"string"==typeof e||!function(e){return"[object Array]"===h(e)}(e)&&v(e)&&"[object String]"===h(e)}function w(e){if(!v(e))return!1;var t=h(e);return"[object Error]"===t||"[object DOMException]"===t||y(e.name)&&y(e.message)}function S(e){function t(e){for(var t="<"+e.tagName.toLowerCase(),n=e.attributes||[],r=0;r"}var n,r="undefined";if(""===e)return"Empty String";if(void 0===e)return r;if(y(e)||m(e)||function(e){return"boolean"==typeof e||v(e)&&"[object Boolean]"===h(e)}(e)||function(e){return!(!e||"function"!=typeof e)}(e))return""+e;if(g(e))return t(e);if("symbol"==typeof e)return Symbol.prototype.toString.call(e);try{n=JSON.stringify(e,(function(e,n){return void 0===n?r:m(n)&&isNaN(n)?"NaN":w(n)?{name:n.name,message:n.message,stack:n.stack}:g(n)?t(n):n}))}catch(t){var i="";for(var o in e)if(e.hasOwnProperty(o))try{i+=',"'+o+'":"'+e[o]+'"'}catch(e){}n=i?"{"+i.replace(",","")+"}":"Unserializable Object"}return n.replace(/"undefined"/g,r).replace(/"NaN"/g,"NaN")}function E(e){if(!e)return"";if((e=e.toString()).startsWith("http")||i())return e;try{return new URL(e,document.baseURI).toString()}catch(t){return e}}var T,b,R,_,k=new(function(){function t(){var e=this;this.apiEntries=[],this.addEntry=function(t){t.url&&0===t.url.indexOf("http")&&(e.options.monitorSelfCalls||0!==t.url.indexOf(e.options.ingestUrl))&&e.apiEntries.push(t)}}return t.prototype.install=function(e){this.options=e,this.wrapFetch(),this.wrapXhr()},t.prototype.getApis=function(e){if(void 0===e&&(e=!1),e||this.apiEntries.length>=10){var t=this.apiEntries;return this.apiEntries=[],t}return[]},t.prototype.wrapFetch=function(){var t=this;u(e.g,"fetch",(function(n){return function(r,s){var c=r instanceof Request?r.url:r,u=r instanceof Request?r.method:(s||{}).method||"GET",l=n.apply(e.g,arguments);return l.__rm_state__={source:i()?"worker":"fetch",startedOn:a(performance.now()),method:u,requestUrl:E(c),pageUrl:o(self.location.toString())},l.then((function(e){var n=l.__rm_state__;if(n){var r=performance.now(),i={source:n.source,method:n.method,startedOn:n.startedOn,pageUrl:n.pageUrl,duration:a(r)-n.startedOn,statusCode:e.status,contentLength:e.headers.get("content-length"),contentType:e.headers.get("content-type"),url:e.url||n.requestUrl};t.addEntry(i)}return e})).catch((function(e){var n=l.__rm_state__;if(n){var r=performance.now(),i={source:n.source,method:n.method,startedOn:n.startedOn,pageUrl:n.pageUrl,duration:a(r)-n.startedOn,statusCode:0,contentLength:null,contentType:null,url:n.requestUrl};t.addEntry(i)}throw e}))}}))},t.prototype.wrapXhr=function(){if(!i()){var e=this;u(XMLHttpRequest.prototype,"open",(function(e){return function(t,n){var r=this;return r.__rm_state__={source:"xhr",method:t,requestUrl:E((n||"").toString())},e.apply(r,arguments)}})),u(XMLHttpRequest.prototype,"send",(function(t){return function(){var n=this,r=n.__rm_state__;return r?(n.__rm_state__=Object.assign(r,{startedOn:a(performance.now()),pageUrl:o(self.location.toString())}),n.addEventListener("readystatechange",(function(){if(4===n.readyState){var t=n.__rm_state__,r=performance.now(),i={source:t.source,method:t.method,startedOn:t.startedOn,pageUrl:t.pageUrl,duration:a(r)-t.startedOn,statusCode:n.status,url:n.responseURL||t.requestUrl,contentLength:n.getResponseHeader("content-length"),contentType:n.getResponseHeader("content-type")};e.addEntry(i)}}),!0),t.apply(n,arguments)):t.apply(n,arguments)}}))}},t}()),C=new(function(){function e(){this.errorEntries=[]}return e.prototype.install=function(e){this.options=e,this.watchGlobal(),this.watchPromise(),this.wrapConsole()},e.prototype.getErrors=function(e){if(void 0===e&&(e=!1),e||this.errorEntries.length>=1){var t=this.errorEntries;return this.errorEntries=[],t}return[]},e.prototype.addError=function(e){null!=e.message&&0!==e.message.toString().indexOf("Script error")&&this.errorEntries.push(e)},e.prototype.watchGlobal=function(){self.addEventListener("error",(function(e){try{if(!e||!e.error)return;C.addError({name:e.error.name,message:e.error.message,stack:e.error.stack,cause:e.error.cause?S(e.error.cause):void 0,time:a(performance.now()),entry:"global",pageUrl:self.location.toString()})}catch(e){r.error(e,"global error handler")}}))},e.prototype.watchPromise=function(){self.addEventListener("unhandledrejection",(function(e){try{if(!e)return;var t=e.reason;if(null==t)return;w(t)||(t=new Error(S(t))),C.addError({name:t.name,message:t.message,stack:t.stack,cause:t.cause?S(t.cause):void 0,time:a(performance.now()),entry:"promise",pageUrl:self.location.toString()})}catch(e){r.error(e,"promise error handler")}}))},e.prototype.wrapConsole=function(){u(self.console,"error",(function(e){return function(){try{var t,n=Array.prototype.slice.call(arguments);t=1===n.length&&w(n[0])?n[0]:new Error(1===n.length?S(n[0]):S(n)),C.addError({name:t.name,message:t.message,stack:t.stack,cause:t.cause?S(t.cause):void 0,time:a(performance.now()),entry:"console",pageUrl:self.location.toString()})}catch(e){r.error(e,"console error handler")}return e.apply(this,arguments)}}))},e}()),O="__rm_sid__",I="__rm_sid_ts__",L={_sessionId:0,_storageDisabled:!1,getSessionId:function(){if(!self.performance)return 0;var e=Date.now(),t=0;if(this._storageDisabled&&this._sessionId)return this._sessionId;try{this._sessionId=parseInt(localStorage.getItem(O),10),t=parseInt(localStorage.getItem(I),10)}catch(e){this._storageDisabled=!0}if(!this._sessionId||this.isSessionExpired(e,t)){this._sessionId=p(),j.addEvent({name:"session_start",time:a(performance.now()),pageUrl:self.location.toString(),referrer:i()?"":document.referrer});try{localStorage.setItem(O,this._sessionId.toString()),this.refreshSession()}catch(e){this._storageDisabled=!0}}return this._sessionId},refreshSession:function(){try{localStorage.setItem(I,Date.now().toString())}catch(e){}},isSessionExpired:function(e,t){return!t||t+18e5=1){var t=this.eventEntries;return this.eventEntries=[],t}return[]},e.prototype.addEvent=function(e){L.refreshSession(),this.eventEntries.push(e)},e.prototype.wrapActivity=function(){i()||(document.addEventListener("click",this.onDocumentClicked,!0),document.addEventListener("blur",this.onInputChanged,!0),document.addEventListener("scroll",this.onFirstScroll,{once:!0,capture:!0,passive:!0}))},e.prototype.wrapHistory=function(){var e=this;if(this.isCompatible()){var t=this;self.addEventListener("popstate",(function(){e.addEvent({name:"popstate",time:a(performance.now()),pageUrl:self.location.toString()})}),!0),u(history,"pushState",(function(e){return function(){var n=e.apply(this,arguments);return t.addEvent({name:"pushState",time:a(performance.now()),pageUrl:self.location.toString()}),n}}))}},e.prototype.isCompatible=function(){return!i()&&!f(self,"chrome.app.runtime")&&f(self,"addEventListener")&&f(self,"history.pushState")},e.prototype.onSelectInputChanged=function(e){if(e.multiple)for(var t=0;t=0&&e.options[e.selectedIndex]&&this.writeActivityEvent(e,"input",e.options[e.selectedIndex].value)},e.prototype.writeActivityEvent=function(e,t,n,r){"password"===this.getElementType(e)&&(n=void 0),this.addEvent({name:t,time:a(performance.now()),pageUrl:self.location.toString(),element:{tag:e.tagName.toLowerCase(),attributes:this.getElementAttributes(e),value:this.getMetaValue(n,r),text:e.innerText?s(e.innerText,100):""}})},e.prototype.getElementFromEvent=function(e){return e.target||document.elementFromPoint(e.clientX,e.clientY)},e.prototype.getDescribedElement=function(e,t,n){if(e.closest){if(!(e=e.closest(t)))return null}else if(e.tagName.toLowerCase()!==t.toLowerCase())return null;if(!n)return e;for(var r=this.getElementType(e),i=0;i=0}))},e.prototype.binResources=function(e){var t=this,n=[],r=[],i=[],o=[],s=[],a=[];return e.forEach((function(e){t.isImage(e)?n.push(e):t.isScript(e)?r.push(e):t.isXhr(e)?i.push(e):t.isCss(e)?o.push(e):t.isFont(e)?s.push(e):a.push(e)})),{allImages:n,allScripts:r,allXhr:i,allCss:o,allFonts:s,allOther:a}},e.prototype.isImage=function(e){if("img"===e.initiatorType)return!0;try{if("css"===e.initiatorType||"link"===e.initiatorType){var t=new URL(e.name).pathname.toLowerCase();return[".jpg",".jpeg",".png",".gif",".svg",".raw",".webp",".heif",".avif"].some((function(e){return t.endsWith(e)}))}}catch(e){}return!1},e.prototype.isScript=function(e){if("script"===e.initiatorType)return!0;try{if("link"===e.initiatorType||"other"===e.initiatorType)return new URL(e.name).pathname.toLowerCase().endsWith(".js")}catch(e){}return!1},e.prototype.isXhr=function(e){return"fetch"===e.initiatorType||"xmlhttprequest"===e.initiatorType},e.prototype.isCss=function(e){if("link"!==e.initiatorType&&"css"!==e.initiatorType)return!1;try{return new URL(e.name).pathname.toLowerCase().endsWith("css")}catch(e){}return!1},e.prototype.isFont=function(e){if("link"!==e.initiatorType&&"css"!==e.initiatorType&&"other"!==e.initiatorType)return!1;try{var t=new URL(e.name).pathname.toLowerCase();return[".woff",".woff2",".ttf",".eot",".otf"].some((function(e){return t.endsWith(e)}))}catch(e){}return!1},e.prototype.isThirdParty=function(e){try{return new URL(e).origin!==self.location.origin}catch(e){}return!1},e.prototype.getWallClockTimeForResources=function(e){return a(this.getTimeRangesForResources(e).reduce((function(e,t){return e+t.duration}),0))},e.prototype.getTimeRangesForResources=function(e){e=e.sort((function(e,t){return e.startTime-t.startTime}));var t=[];return e.forEach((function(e){var n=t[t.length-1];n&&n.isWithinRange(e)?n.applyTiming(e):t.push(new F(e))})),t},e.prototype.sentResources=function(){this.hasSent=!0,e.cachedResourceTimings=null},e.cachedResourceTimings=null,e}(),F=function(){function e(e){this.start=e.startTime,this.end=e.responseEnd}return Object.defineProperty(e.prototype,"duration",{get:function(){return this.end-this.start},enumerable:!1,configurable:!0}),e.prototype.isWithinRange=function(e){return e.startTime<=this.end},e.prototype.applyTiming=function(e){this.end=0?r="back-forward-cache":n&&(r=document.prerendering||B()>0?"prerender":n.type.replace(/_/g,"-")),{name:e,value:void 0===t?-1:t,rating:"good",delta:0,entries:[],id:"v3-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:r}},H=function(e,t,n){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var r=new PerformanceObserver((function(e){t(e.getEntries())}));return r.observe(Object.assign({type:e,buffered:!0},n||{})),r}}catch(e){}},z=function(e,t){var n=function n(r){"pagehide"!==r.type&&"hidden"!==document.visibilityState||(e(r),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},W=function(e,t,n,r){var i,o;return function(s){t.value>=0&&(s||r)&&((o=t.value-(i||0))||void 0===i)&&(i=t.value,t.delta=o,t.rating=function(e,t){return e>t[1]?"poor":e>t[0]?"needs-improvement":"good"}(t.value,n),e(t))}},V=-1,X=function(){return"hidden"!==document.visibilityState||document.prerendering?1/0:0},$=function(){z((function(e){var t=e.timeStamp;V=t}),!0)},Q=function(){return V<0&&(V=X(),$(),D((function(){setTimeout((function(){V=X(),$()}),0)}))),{get firstHiddenTime(){return V}}},J=function(e,t){t=t||{};var n,r=[1800,3e3],i=Q(),o=N("FCP"),s=function(e){e.forEach((function(e){"first-contentful-paint"===e.name&&(c&&c.disconnect(),e.startTime=0&&b1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){ee(e,t),i()},r=function(){i()},i=function(){removeEventListener("pointerup",n,Z),removeEventListener("pointercancel",r,Z)};addEventListener("pointerup",n,Z),addEventListener("pointercancel",r,Z)}(t,e):ee(t,e)}},re=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,ne,Z)}))},ie={},oe=function(){function e(){var e=this;this.vitalsSent=!1,this.metricQueue=new Set,this.addToQueue=function(t){e.metricQueue.add(t)},i()||(function(e,t){t=t||{};var n=[.1,.25];Y||(J((function(e){G=e.value})),Y=!0);var r,i=function(t){G>-1&&e(t)},o=N("CLS",0),s=0,a=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var t=a[0],n=a[a.length-1];s&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,a.push(e)):(s=e.value,a=[e]),s>o.value&&(o.value=s,o.entries=a,r())}}))},u=H("layout-shift",c);u&&(r=W(i,o,n,t.reportAllChanges),z((function(){c(u.takeRecords()),r(!0)})),D((function(){s=0,G=-1,o=N("CLS",0),r=W(i,o,n,t.reportAllChanges)})))}(this.addToQueue,{reportAllChanges:!0}),function(e,t){t=t||{};var n,r=[100,300],i=Q(),o=N("FID"),s=function(e){e.startTime=50||n.duration<=0||"xmlhttprequest"!==n.initiatorType&&"fetch"!==n.initiatorType)){var i=o(n.name);if(function(e,t){var n=function(e){try{if(!e||0!==e.indexOf("http"))return null;var t=new URL(e).hostname;if(!t)return null;var n=t.split("."),i=n.pop();if("localhost"===i)return i;if("127.0.0.1"===t)return t;var o=n.pop();return 2===o.length&&(o=n.pop()),c.indexOf(o)>=0&&(o=n.pop()),"".concat(o,".")}catch(t){return r.error(t,"Page Url: ".concat(e)),null}}(t);if(!n)return!1;try{var i=new URL(e).hostname;return!!i&&i.indexOf(n)>=0}catch(t){return r.error(t,"Problem parsing first party url: ".concat(e)),!1}}(i,self.location.toString())){var s=i+n.startTime;e.entryHash[s]||(e.options.monitorSelfCalls||0!==e.getIngestUrl().indexOf(i))&&(r.errorCount>0&&0===r.getErrorUrl().indexOf(i)||(e.entryHash[s]=!0,t.push({url:i,start:a(n.startTime),duration:a(n.duration)})))}}})),t},e.prototype.getDevice=function(){try{if(/Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent))return"mobile"}catch(e){}return"desktop"},e.prototype.getNetworkType=function(){try{var e=null===navigator||void 0===navigator?void 0:navigator.connection;return e?"".concat(e.effectiveType,":").concat(e.downlink,":").concat(e.rtt):null}catch(e){return null}},e.prototype.getPayload=function(e){var t;return void 0===e&&(e=!1),this.endpoints=this.endpoints.concat(this.getEndpointEntries()),{token:this.options.token,timeOrigin:new Date(this.timeOrigin).toISOString(),timeSent:(new Date).toISOString(),device:this.getDevice(),pageViewId:this.pageViewId,sessionId:this.sessionId,page:this.pageService.getPageEntry(),endpoints:ae([],this.endpoints,!0),vitals:null===(t=this.webVitalsObserver)||void 0===t?void 0:t.getVitals(this.pageService.getPageUrl()),resources:this.resourceService.getResources(),tags:this.options.tags,metadata:this.metadata,networkType:this.getNetworkType(),api:k.getApis(e),events:j.getEvents(e),errors:C.getErrors(e),js:this.resourceService.getAllThirdPartyJs(),env:{lang:navigator.language,width:i()?null:null===screen||void 0===screen?void 0:screen.width,height:i()?null:null===screen||void 0===screen?void 0:screen.height,dpr:i()?null:null===window||void 0===window?void 0:window.devicePixelRatio},user:this.user}},e.prototype.payloadHasData=function(e){return!(this.shutdownSend||this.sendCount>=60||!e||!(e.page||e.endpoints.length||e.vitals||e.resources||e.api.length||e.events.length||e.errors.length||e.js.length))},e.prototype.shouldSendInterval=function(e){return!!this.payloadHasData(e)&&!!(e.page||e.vitals||e.resources||i()||e.endpoints.length>=10||e.api.length>0||e.events.length>0||e.errors.length>0||e.js.length>0)},e.prototype.checkAndSend=function(){var e=this;try{var t=this.getPayload();if(t.source="polling",!this.shouldSendInterval(t))return;this.clearPayloadAfterSend(t);var n=new XMLHttpRequest;n.open("POST",this.getIngestUrl()),n.setRequestHeader("Content-Type","application/json"),n.addEventListener("load",(function(){n.status>=400&&(e.shutdownSend=!0)})),n.send(JSON.stringify(t))}catch(e){r.error(e)}},e.prototype.clearPayloadAfterSend=function(e){var t;this.sendCount++,this.endpoints.length=0,e.page&&this.pageService.sentPage(),e.vitals&&(null===(t=this.webVitalsObserver)||void 0===t||t.sentVitals()),e.resources&&this.resourceService.sentResources()},e.prototype.manageResourceBuffer=function(){var e=this;performance.setResourceTimingBufferSize&&performance.setResourceTimingBufferSize(1e3);var t=function(t){e.resourceService.cacheResources(),performance.clearResourceTimings()};if(performance.addEventListener)try{performance.addEventListener("resourcetimingbufferfull",t)}catch(e){}else performance.onresourcetimingbufferfull=t},e.defaults={token:null,ingestUrl:"https://in.requestmetrics.com/v1",monitorSelfCalls:!1,tags:[]},e}(),ue={__agent:null,version:"1.13.1",install:function(e){try{if(ue.__agent)return void console.warn("Request Metrics is already installed.");if("undefined"==typeof self)return void console.warn("Request Metrics does not operate in this environment.");if(!e||!e.token)return void console.error("You must provide a token to install Request Metrics.");r.token=e.token,ue.__agent=new ce(e)}catch(e){r.error(e)}},identify:function(e,t){try{return ue.__agent?e?ue.__agent.identify(e,t):void console.warn("You must provide a userId."):void console.warn("Request Metrics isn't installed.")}catch(e){r.error(e)}},sendEvent:function(e,t,n){void 0===n&&(n=null);try{return ue.__agent?e?ue.__agent.sendEvent(e,t,n):void console.warn("You must provide an event name."):void console.warn("Request Metrics isn't installed.")}catch(e){r.error(e)}},track:function(e,t,n){void 0===n&&(n=null);try{return ue.__agent?w(e)?ue.__agent.track(e,t,n):void console.warn("You must provide an instance of Error"):void console.warn("Request Metrics isn't installed.")}catch(e){r.error(e)}},addMetadata:function(e){try{if(!ue.__agent)return void console.warn("Request Metrics isn't installed.");if(!e)return;return ue.__agent.addMetadata(e)}catch(e){r.error(e)}}},le=ue;return function(){try{if(i())return;if(!document.querySelector)return;if(self.RM&&self.RM._options)return ue.install(self.RM._options),self.RM._userId&&ue.identify(self.RM._userId,self.RM._identifyOptions),self.RM._events&&self.RM._events.forEach((function(e){ue.sendEvent(e.eventName,e.metadata,e.time)})),self.RM._errors&&self.RM._errors.forEach((function(e){ue.track(e.error,e.metadata,e.time)})),void(self.RM._metadata&&ue.addMetadata(self.RM._metadata));var e=document.querySelector("[data-rm-token]");if(!e)return;var t=e.getAttribute("data-rm-token");if(!t)return;var n=(e.getAttribute("data-rm-tags")||"").split(",").filter((function(e){return e}));r.token=t,ue.install({token:t,ingestUrl:e.getAttribute("data-rm-ingest"),monitorSelfCalls:!!e.getAttribute("data-rm-monitor-self"),tags:n});var o=e.getAttribute("data-rm-userId");o&&ue.identify(o)}catch(e){r.error(e)}}(),t}()}));
+
+if (location.host === "frontendmasters.com") {
+ RM.install({
+ token: "b4dw8ec:b9ht8wy",
+ ingestUrl: "https://pathway.frontendmasters.com/v1",
+ });
+}
diff --git a/styles/website.css b/styles/website.css
index 57ac75f4..d0a9d67b 100644
--- a/styles/website.css
+++ b/styles/website.css
@@ -1,3 +1,8 @@
+body {
+ display: flex;
+ flex-direction: column;
+}
+
cite{
margin-top: -30px;
font-size:10px;
@@ -11,4 +16,55 @@ cite{
small{
font-size:10px;
+}
+
+.FmCta {
+ align-items: flex-start;
+ background: #000;
+ color: #fff;
+ display: flex;
+ gap: 15px;
+ line-height: 2;
+ padding: 10px 15px;
+}
+
+.FmCtaLogo svg {
+ fill: #c02d28;
+ vertical-align: middle;
+ width: 25px;
+}
+
+.FmCtaLogo:hover svg {
+ fill: #dd625e;
+}
+
+.FmCtaText {
+ display: flex;
+ flex: 1;
+ gap: 15px;
+}
+
+.FmCtaText a {
+ color: #ccc;
+ font-weight: bold;
+}
+
+.FmCtaText a:hover {
+ color: #fff;
+}
+
+.FmCtaClose {
+ background: none;
+ border: none;
+ color: #888;
+ font-size: 25px;
+ height: 30px;
+ line-height: 1;
+ outline: none;
+ padding-bottom: 5px;
+ width: 30px;
+}
+
+.FmCtaClose:hover {
+ color: #fff;
}
\ No newline at end of file
diff --git a/tools/browser.md b/tools/browser.md
index 1fffd571..60d7d1af 100644
--- a/tools/browser.md
+++ b/tools/browser.md
@@ -62,6 +62,7 @@
* [slimerjs](http://slimerjs.org/)
* [TrifleJS](http://triflejs.org/)
* [Zombie.js](http://zombie.js.org/)
+* [Headless Chromium](https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md)
##### Browser Automation:
diff --git a/tools/css.md b/tools/css.md
index adb6c6a0..2d1d9427 100644
--- a/tools/css.md
+++ b/tools/css.md
@@ -29,6 +29,7 @@
* [Eric Meyer's “Reset CSS” 2.0](http://meyerweb.com/eric/tools/css/reset/)
* [Normalize](https://necolas.github.io/normalize.css/)
+* [sanitize.css](https://github.com/jonathantneal/sanitize.css)
##### Transpiling:
diff --git a/tools/http.md b/tools/http.md
index f8870159..153c45ae 100644
--- a/tools/http.md
+++ b/tools/http.md
@@ -3,6 +3,7 @@
* [Charles](http://www.charlesproxy.com/) [$]
* [Chrome DevTools Network Panel](https://developers.google.com/web/tools/chrome-devtools/profile/network-performance/resource-loading)
* [Insomnia](https://insomnia.rest/) [free - $]
+* [Mitmproxy](https://mitmproxy.org/) [free]
* [Paw](https://paw.cloud/) [$]
* [Postman](https://www.getpostman.com/) [free - $]
diff --git a/tools/perf.md b/tools/perf.md
index 7c37932f..4c007ef9 100644
--- a/tools/perf.md
+++ b/tools/perf.md
@@ -20,6 +20,7 @@
* [Jank Free](http://jankfree.org/)
* [Performance of ES6 features relative to the ES5](https://kpdecker.github.io/six-speed/)
+* [Front-End Cheatsheets](http://medium.freecodecamp.org/modern-frontend-hacking-cheatsheets-df9c2566c72a)
##### Checklist:
diff --git a/tools/templates.md b/tools/templates.md
index 38a6871c..05a87bd6 100644
--- a/tools/templates.md
+++ b/tools/templates.md
@@ -5,7 +5,7 @@
* [doT.js](http://olado.github.io/doT/)
* [Handlebars](http://handlebarsjs.com/)
* [htmlbars](https://github.com/tildeio/htmlbars)
-* [Nunjuncks](http://mozilla.github.io/nunjucks/)
+* [Nunjucks](http://mozilla.github.io/nunjucks/)
##### Templating and Reactive Data Binding:
@@ -21,46 +21,3 @@
* [JSX](https://facebook.github.io/jsx/)
* [t7](http://t7js.com/)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/what-is-a-FD.md b/what-is-a-FD.md
index f2ecef94..823195b5 100644
--- a/what-is-a-FD.md
+++ b/what-is-a-FD.md
@@ -60,6 +60,6 @@ Some examples of these environments are:
###### NOTES:
-Make sure you are clear what what exactly is meant by the "web platform". Read, ["The Web platform: what it is"](http://tess.oconnor.cx/2009/05/what-the-web-platform-is) and read the, ["Open Web Platform"][Open Web Platform] Wikipedia page.
+Make sure you are clear what exactly is meant by the "web platform". Read, ["The Web platform: what it is"](http://tess.oconnor.cx/2009/05/what-the-web-platform-is) and read the, ["Open Web Platform"][Open Web Platform] Wikipedia page.
[Open Web Platform]: https://en.wikipedia.org/wiki/Open_Web_Platform