diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d30b5b0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# Introduction
+
+A SASS based website:
+
+**Live Site**: [https://nexter-poc.netlify.app/](https://nexter-poc.netlify.app/)
+
+[![Netlify Status](https://api.netlify.com/api/v1/badges/7b66dd45-69c2-4a95-9843-6806cd0bfdcb/deploy-status)](https://app.netlify.com/sites/nexter-poc/deploys)
\ No newline at end of file
diff --git a/css/fonts/linea-basic-10.eot b/css/fonts/linea-basic-10.eot
new file mode 100644
index 0000000..6534fd2
Binary files /dev/null and b/css/fonts/linea-basic-10.eot differ
diff --git a/css/fonts/linea-basic-10.svg b/css/fonts/linea-basic-10.svg
new file mode 100644
index 0000000..4f31eff
--- /dev/null
+++ b/css/fonts/linea-basic-10.svg
@@ -0,0 +1,145 @@
+
+
+
+Generated by Fontastic.me
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/css/fonts/linea-basic-10.ttf b/css/fonts/linea-basic-10.ttf
new file mode 100644
index 0000000..0747f27
Binary files /dev/null and b/css/fonts/linea-basic-10.ttf differ
diff --git a/css/fonts/linea-basic-10.woff b/css/fonts/linea-basic-10.woff
new file mode 100644
index 0000000..36e3185
Binary files /dev/null and b/css/fonts/linea-basic-10.woff differ
diff --git a/css/icon-font.css b/css/icon-font.css
new file mode 100644
index 0000000..51800c6
--- /dev/null
+++ b/css/icon-font.css
@@ -0,0 +1,445 @@
+@charset "UTF-8";
+
+@font-face {
+ font-family: "linea-basic-10";
+ src:url("fonts/linea-basic-10.eot");
+ src:url("fonts/linea-basic-10.eot?#iefix") format("embedded-opentype"),
+ url("fonts/linea-basic-10.woff") format("woff"),
+ url("fonts/linea-basic-10.ttf") format("truetype"),
+ url("fonts/linea-basic-10.svg#linea-basic-10") format("svg");
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+[data-icon]:before {
+ font-family: "linea-basic-10" !important;
+ content: attr(data-icon);
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ font-family: "linea-basic-10" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-basic-accelerator:before {
+ content: "a";
+}
+.icon-basic-alarm:before {
+ content: "b";
+}
+.icon-basic-anchor:before {
+ content: "c";
+}
+.icon-basic-anticlockwise:before {
+ content: "d";
+}
+.icon-basic-archive:before {
+ content: "e";
+}
+.icon-basic-archive-full:before {
+ content: "f";
+}
+.icon-basic-ban:before {
+ content: "g";
+}
+.icon-basic-battery-charge:before {
+ content: "h";
+}
+.icon-basic-battery-empty:before {
+ content: "i";
+}
+.icon-basic-battery-full:before {
+ content: "j";
+}
+.icon-basic-battery-half:before {
+ content: "k";
+}
+.icon-basic-bolt:before {
+ content: "l";
+}
+.icon-basic-book:before {
+ content: "m";
+}
+.icon-basic-book-pen:before {
+ content: "n";
+}
+.icon-basic-book-pencil:before {
+ content: "o";
+}
+.icon-basic-bookmark:before {
+ content: "p";
+}
+.icon-basic-calculator:before {
+ content: "q";
+}
+.icon-basic-calendar:before {
+ content: "r";
+}
+.icon-basic-cards-diamonds:before {
+ content: "s";
+}
+.icon-basic-cards-hearts:before {
+ content: "t";
+}
+.icon-basic-case:before {
+ content: "u";
+}
+.icon-basic-chronometer:before {
+ content: "v";
+}
+.icon-basic-clessidre:before {
+ content: "w";
+}
+.icon-basic-clock:before {
+ content: "x";
+}
+.icon-basic-clockwise:before {
+ content: "y";
+}
+.icon-basic-cloud:before {
+ content: "z";
+}
+.icon-basic-clubs:before {
+ content: "A";
+}
+.icon-basic-compass:before {
+ content: "B";
+}
+.icon-basic-cup:before {
+ content: "C";
+}
+.icon-basic-diamonds:before {
+ content: "D";
+}
+.icon-basic-display:before {
+ content: "E";
+}
+.icon-basic-download:before {
+ content: "F";
+}
+.icon-basic-exclamation:before {
+ content: "G";
+}
+.icon-basic-eye:before {
+ content: "H";
+}
+.icon-basic-eye-closed:before {
+ content: "I";
+}
+.icon-basic-female:before {
+ content: "J";
+}
+.icon-basic-flag1:before {
+ content: "K";
+}
+.icon-basic-flag2:before {
+ content: "L";
+}
+.icon-basic-floppydisk:before {
+ content: "M";
+}
+.icon-basic-folder:before {
+ content: "N";
+}
+.icon-basic-folder-multiple:before {
+ content: "O";
+}
+.icon-basic-gear:before {
+ content: "P";
+}
+.icon-basic-geolocalize-01:before {
+ content: "Q";
+}
+.icon-basic-geolocalize-05:before {
+ content: "R";
+}
+.icon-basic-globe:before {
+ content: "S";
+}
+.icon-basic-gunsight:before {
+ content: "T";
+}
+.icon-basic-hammer:before {
+ content: "U";
+}
+.icon-basic-headset:before {
+ content: "V";
+}
+.icon-basic-heart:before {
+ content: "W";
+}
+.icon-basic-heart-broken:before {
+ content: "X";
+}
+.icon-basic-helm:before {
+ content: "Y";
+}
+.icon-basic-home:before {
+ content: "Z";
+}
+.icon-basic-info:before {
+ content: "0";
+}
+.icon-basic-ipod:before {
+ content: "1";
+}
+.icon-basic-joypad:before {
+ content: "2";
+}
+.icon-basic-key:before {
+ content: "3";
+}
+.icon-basic-keyboard:before {
+ content: "4";
+}
+.icon-basic-laptop:before {
+ content: "5";
+}
+.icon-basic-life-buoy:before {
+ content: "6";
+}
+.icon-basic-lightbulb:before {
+ content: "7";
+}
+.icon-basic-link:before {
+ content: "8";
+}
+.icon-basic-lock:before {
+ content: "9";
+}
+.icon-basic-lock-open:before {
+ content: "!";
+}
+.icon-basic-magic-mouse:before {
+ content: "\"";
+}
+.icon-basic-magnifier:before {
+ content: "#";
+}
+.icon-basic-magnifier-minus:before {
+ content: "$";
+}
+.icon-basic-magnifier-plus:before {
+ content: "%";
+}
+.icon-basic-mail:before {
+ content: "&";
+}
+.icon-basic-mail-multiple:before {
+ content: "'";
+}
+.icon-basic-mail-open:before {
+ content: "(";
+}
+.icon-basic-mail-open-text:before {
+ content: ")";
+}
+.icon-basic-male:before {
+ content: "*";
+}
+.icon-basic-map:before {
+ content: "+";
+}
+.icon-basic-message:before {
+ content: ",";
+}
+.icon-basic-message-multiple:before {
+ content: "-";
+}
+.icon-basic-message-txt:before {
+ content: ".";
+}
+.icon-basic-mixer2:before {
+ content: "/";
+}
+.icon-basic-mouse:before {
+ content: ":";
+}
+.icon-basic-notebook:before {
+ content: ";";
+}
+.icon-basic-notebook-pen:before {
+ content: "<";
+}
+.icon-basic-notebook-pencil:before {
+ content: "=";
+}
+.icon-basic-paperplane:before {
+ content: ">";
+}
+.icon-basic-pencil-ruler:before {
+ content: "?";
+}
+.icon-basic-pencil-ruler-pen:before {
+ content: "@";
+}
+.icon-basic-photo:before {
+ content: "[";
+}
+.icon-basic-picture:before {
+ content: "]";
+}
+.icon-basic-picture-multiple:before {
+ content: "^";
+}
+.icon-basic-pin1:before {
+ content: "_";
+}
+.icon-basic-pin2:before {
+ content: "`";
+}
+.icon-basic-postcard:before {
+ content: "{";
+}
+.icon-basic-postcard-multiple:before {
+ content: "|";
+}
+.icon-basic-printer:before {
+ content: "}";
+}
+.icon-basic-question:before {
+ content: "~";
+}
+.icon-basic-rss:before {
+ content: "\\";
+}
+.icon-basic-server:before {
+ content: "\e000";
+}
+.icon-basic-server2:before {
+ content: "\e001";
+}
+.icon-basic-server-cloud:before {
+ content: "\e002";
+}
+.icon-basic-server-download:before {
+ content: "\e003";
+}
+.icon-basic-server-upload:before {
+ content: "\e004";
+}
+.icon-basic-settings:before {
+ content: "\e005";
+}
+.icon-basic-share:before {
+ content: "\e006";
+}
+.icon-basic-sheet:before {
+ content: "\e007";
+}
+.icon-basic-sheet-multiple:before {
+ content: "\e008";
+}
+.icon-basic-sheet-pen:before {
+ content: "\e009";
+}
+.icon-basic-sheet-pencil:before {
+ content: "\e00a";
+}
+.icon-basic-sheet-txt:before {
+ content: "\e00b";
+}
+.icon-basic-signs:before {
+ content: "\e00c";
+}
+.icon-basic-smartphone:before {
+ content: "\e00d";
+}
+.icon-basic-spades:before {
+ content: "\e00e";
+}
+.icon-basic-spread:before {
+ content: "\e00f";
+}
+.icon-basic-spread-bookmark:before {
+ content: "\e010";
+}
+.icon-basic-spread-text:before {
+ content: "\e011";
+}
+.icon-basic-spread-text-bookmark:before {
+ content: "\e012";
+}
+.icon-basic-star:before {
+ content: "\e013";
+}
+.icon-basic-tablet:before {
+ content: "\e014";
+}
+.icon-basic-target:before {
+ content: "\e015";
+}
+.icon-basic-todo:before {
+ content: "\e016";
+}
+.icon-basic-todo-pen:before {
+ content: "\e017";
+}
+.icon-basic-todo-pencil:before {
+ content: "\e018";
+}
+.icon-basic-todo-txt:before {
+ content: "\e019";
+}
+.icon-basic-todolist-pen:before {
+ content: "\e01a";
+}
+.icon-basic-todolist-pencil:before {
+ content: "\e01b";
+}
+.icon-basic-trashcan:before {
+ content: "\e01c";
+}
+.icon-basic-trashcan-full:before {
+ content: "\e01d";
+}
+.icon-basic-trashcan-refresh:before {
+ content: "\e01e";
+}
+.icon-basic-trashcan-remove:before {
+ content: "\e01f";
+}
+.icon-basic-upload:before {
+ content: "\e020";
+}
+.icon-basic-usb:before {
+ content: "\e021";
+}
+.icon-basic-video:before {
+ content: "\e022";
+}
+.icon-basic-watch:before {
+ content: "\e023";
+}
+.icon-basic-webpage:before {
+ content: "\e024";
+}
+.icon-basic-webpage-img-txt:before {
+ content: "\e025";
+}
+.icon-basic-webpage-multiple:before {
+ content: "\e026";
+}
+.icon-basic-webpage-txt:before {
+ content: "\e027";
+}
+.icon-basic-world:before {
+ content: "\e028";
+}
diff --git a/css/style.con.css b/css/style.con.css
new file mode 100644
index 0000000..70b63a9
--- /dev/null
+++ b/css/style.con.css
@@ -0,0 +1,1405 @@
+@charset "UTF-8";
+
+@font-face {
+ font-family: "linea-basic-10";
+ src:url("fonts/linea-basic-10.eot");
+ src:url("fonts/linea-basic-10.eot?#iefix") format("embedded-opentype"),
+ url("fonts/linea-basic-10.woff") format("woff"),
+ url("fonts/linea-basic-10.ttf") format("truetype"),
+ url("fonts/linea-basic-10.svg#linea-basic-10") format("svg");
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+[data-icon]:before {
+ font-family: "linea-basic-10" !important;
+ content: attr(data-icon);
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ font-family: "linea-basic-10" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-basic-accelerator:before {
+ content: "a";
+}
+.icon-basic-alarm:before {
+ content: "b";
+}
+.icon-basic-anchor:before {
+ content: "c";
+}
+.icon-basic-anticlockwise:before {
+ content: "d";
+}
+.icon-basic-archive:before {
+ content: "e";
+}
+.icon-basic-archive-full:before {
+ content: "f";
+}
+.icon-basic-ban:before {
+ content: "g";
+}
+.icon-basic-battery-charge:before {
+ content: "h";
+}
+.icon-basic-battery-empty:before {
+ content: "i";
+}
+.icon-basic-battery-full:before {
+ content: "j";
+}
+.icon-basic-battery-half:before {
+ content: "k";
+}
+.icon-basic-bolt:before {
+ content: "l";
+}
+.icon-basic-book:before {
+ content: "m";
+}
+.icon-basic-book-pen:before {
+ content: "n";
+}
+.icon-basic-book-pencil:before {
+ content: "o";
+}
+.icon-basic-bookmark:before {
+ content: "p";
+}
+.icon-basic-calculator:before {
+ content: "q";
+}
+.icon-basic-calendar:before {
+ content: "r";
+}
+.icon-basic-cards-diamonds:before {
+ content: "s";
+}
+.icon-basic-cards-hearts:before {
+ content: "t";
+}
+.icon-basic-case:before {
+ content: "u";
+}
+.icon-basic-chronometer:before {
+ content: "v";
+}
+.icon-basic-clessidre:before {
+ content: "w";
+}
+.icon-basic-clock:before {
+ content: "x";
+}
+.icon-basic-clockwise:before {
+ content: "y";
+}
+.icon-basic-cloud:before {
+ content: "z";
+}
+.icon-basic-clubs:before {
+ content: "A";
+}
+.icon-basic-compass:before {
+ content: "B";
+}
+.icon-basic-cup:before {
+ content: "C";
+}
+.icon-basic-diamonds:before {
+ content: "D";
+}
+.icon-basic-display:before {
+ content: "E";
+}
+.icon-basic-download:before {
+ content: "F";
+}
+.icon-basic-exclamation:before {
+ content: "G";
+}
+.icon-basic-eye:before {
+ content: "H";
+}
+.icon-basic-eye-closed:before {
+ content: "I";
+}
+.icon-basic-female:before {
+ content: "J";
+}
+.icon-basic-flag1:before {
+ content: "K";
+}
+.icon-basic-flag2:before {
+ content: "L";
+}
+.icon-basic-floppydisk:before {
+ content: "M";
+}
+.icon-basic-folder:before {
+ content: "N";
+}
+.icon-basic-folder-multiple:before {
+ content: "O";
+}
+.icon-basic-gear:before {
+ content: "P";
+}
+.icon-basic-geolocalize-01:before {
+ content: "Q";
+}
+.icon-basic-geolocalize-05:before {
+ content: "R";
+}
+.icon-basic-globe:before {
+ content: "S";
+}
+.icon-basic-gunsight:before {
+ content: "T";
+}
+.icon-basic-hammer:before {
+ content: "U";
+}
+.icon-basic-headset:before {
+ content: "V";
+}
+.icon-basic-heart:before {
+ content: "W";
+}
+.icon-basic-heart-broken:before {
+ content: "X";
+}
+.icon-basic-helm:before {
+ content: "Y";
+}
+.icon-basic-home:before {
+ content: "Z";
+}
+.icon-basic-info:before {
+ content: "0";
+}
+.icon-basic-ipod:before {
+ content: "1";
+}
+.icon-basic-joypad:before {
+ content: "2";
+}
+.icon-basic-key:before {
+ content: "3";
+}
+.icon-basic-keyboard:before {
+ content: "4";
+}
+.icon-basic-laptop:before {
+ content: "5";
+}
+.icon-basic-life-buoy:before {
+ content: "6";
+}
+.icon-basic-lightbulb:before {
+ content: "7";
+}
+.icon-basic-link:before {
+ content: "8";
+}
+.icon-basic-lock:before {
+ content: "9";
+}
+.icon-basic-lock-open:before {
+ content: "!";
+}
+.icon-basic-magic-mouse:before {
+ content: "\"";
+}
+.icon-basic-magnifier:before {
+ content: "#";
+}
+.icon-basic-magnifier-minus:before {
+ content: "$";
+}
+.icon-basic-magnifier-plus:before {
+ content: "%";
+}
+.icon-basic-mail:before {
+ content: "&";
+}
+.icon-basic-mail-multiple:before {
+ content: "'";
+}
+.icon-basic-mail-open:before {
+ content: "(";
+}
+.icon-basic-mail-open-text:before {
+ content: ")";
+}
+.icon-basic-male:before {
+ content: "*";
+}
+.icon-basic-map:before {
+ content: "+";
+}
+.icon-basic-message:before {
+ content: ",";
+}
+.icon-basic-message-multiple:before {
+ content: "-";
+}
+.icon-basic-message-txt:before {
+ content: ".";
+}
+.icon-basic-mixer2:before {
+ content: "/";
+}
+.icon-basic-mouse:before {
+ content: ":";
+}
+.icon-basic-notebook:before {
+ content: ";";
+}
+.icon-basic-notebook-pen:before {
+ content: "<";
+}
+.icon-basic-notebook-pencil:before {
+ content: "=";
+}
+.icon-basic-paperplane:before {
+ content: ">";
+}
+.icon-basic-pencil-ruler:before {
+ content: "?";
+}
+.icon-basic-pencil-ruler-pen:before {
+ content: "@";
+}
+.icon-basic-photo:before {
+ content: "[";
+}
+.icon-basic-picture:before {
+ content: "]";
+}
+.icon-basic-picture-multiple:before {
+ content: "^";
+}
+.icon-basic-pin1:before {
+ content: "_";
+}
+.icon-basic-pin2:before {
+ content: "`";
+}
+.icon-basic-postcard:before {
+ content: "{";
+}
+.icon-basic-postcard-multiple:before {
+ content: "|";
+}
+.icon-basic-printer:before {
+ content: "}";
+}
+.icon-basic-question:before {
+ content: "~";
+}
+.icon-basic-rss:before {
+ content: "\\";
+}
+.icon-basic-server:before {
+ content: "\e000";
+}
+.icon-basic-server2:before {
+ content: "\e001";
+}
+.icon-basic-server-cloud:before {
+ content: "\e002";
+}
+.icon-basic-server-download:before {
+ content: "\e003";
+}
+.icon-basic-server-upload:before {
+ content: "\e004";
+}
+.icon-basic-settings:before {
+ content: "\e005";
+}
+.icon-basic-share:before {
+ content: "\e006";
+}
+.icon-basic-sheet:before {
+ content: "\e007";
+}
+.icon-basic-sheet-multiple:before {
+ content: "\e008";
+}
+.icon-basic-sheet-pen:before {
+ content: "\e009";
+}
+.icon-basic-sheet-pencil:before {
+ content: "\e00a";
+}
+.icon-basic-sheet-txt:before {
+ content: "\e00b";
+}
+.icon-basic-signs:before {
+ content: "\e00c";
+}
+.icon-basic-smartphone:before {
+ content: "\e00d";
+}
+.icon-basic-spades:before {
+ content: "\e00e";
+}
+.icon-basic-spread:before {
+ content: "\e00f";
+}
+.icon-basic-spread-bookmark:before {
+ content: "\e010";
+}
+.icon-basic-spread-text:before {
+ content: "\e011";
+}
+.icon-basic-spread-text-bookmark:before {
+ content: "\e012";
+}
+.icon-basic-star:before {
+ content: "\e013";
+}
+.icon-basic-tablet:before {
+ content: "\e014";
+}
+.icon-basic-target:before {
+ content: "\e015";
+}
+.icon-basic-todo:before {
+ content: "\e016";
+}
+.icon-basic-todo-pen:before {
+ content: "\e017";
+}
+.icon-basic-todo-pencil:before {
+ content: "\e018";
+}
+.icon-basic-todo-txt:before {
+ content: "\e019";
+}
+.icon-basic-todolist-pen:before {
+ content: "\e01a";
+}
+.icon-basic-todolist-pencil:before {
+ content: "\e01b";
+}
+.icon-basic-trashcan:before {
+ content: "\e01c";
+}
+.icon-basic-trashcan-full:before {
+ content: "\e01d";
+}
+.icon-basic-trashcan-refresh:before {
+ content: "\e01e";
+}
+.icon-basic-trashcan-remove:before {
+ content: "\e01f";
+}
+.icon-basic-upload:before {
+ content: "\e020";
+}
+.icon-basic-usb:before {
+ content: "\e021";
+}
+.icon-basic-video:before {
+ content: "\e022";
+}
+.icon-basic-watch:before {
+ content: "\e023";
+}
+.icon-basic-webpage:before {
+ content: "\e024";
+}
+.icon-basic-webpage-img-txt:before {
+ content: "\e025";
+}
+.icon-basic-webpage-multiple:before {
+ content: "\e026";
+}
+.icon-basic-webpage-txt:before {
+ content: "\e027";
+}
+.icon-basic-world:before {
+ content: "\e028";
+}
+
+/* Media Query
+- phone
+- tab-port
+- tab-land
+- big-desk
+*/
+*,
+*::after,
+*::bofore {
+ margin: 0;
+ padding: 0;
+ box-sizing: inherit; }
+
+html {
+ font-size: 62.5%;
+ /* Set to 10 to make calculation easier. 10% as it's 62.5% pf default browser font-size 16px; */ }
+ @media (max-width: 75em) {
+ html {
+ font-size: 56.25%; } }
+ @media (max-width: 56.25em) {
+ html {
+ font-size: 50%; } }
+
+body {
+ box-sizing: border-box;
+ padding: 3rem; }
+ @media (max-width: 56.25em) {
+ body {
+ padding: 0;
+ margin: 0; } }
+
+.u-centre-text {
+ text-align: center !important; }
+
+.u-margin-bottom-small {
+ margin-bottom: 1.5rem !important; }
+
+.u-margin-bottom-medium {
+ margin-bottom: 4rem !important; }
+ @media (max-width: 56.25em) {
+ .u-margin-bottom-medium {
+ margin-bottom: 3rem !important; } }
+
+.u-margin-bottom-large {
+ margin-bottom: 8rem !important; }
+ @media (max-width: 56.25em) {
+ .u-margin-bottom-large {
+ margin-bottom: 5rem !important; } }
+
+.u-margin-top-large {
+ margin-top: 8rem !important; }
+
+@keyframes moveInLeft {
+ 0% {
+ opacity: 0;
+ transform: translateX(-10rem); }
+ 80% {
+ transform: translateX(2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInRight {
+ 0% {
+ opacity: 0;
+ transform: translateX(10rem); }
+ 80% {
+ transform: translateX(-2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInButton {
+ 0% {
+ opacity: 0;
+ transform: translateY(5rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+body {
+ font-family: "Lato", sans-serif;
+ font-weight: 400;
+ line-height: 1.7;
+ color: #777; }
+
+.paragraph {
+ font-size: 1.6rem; }
+ .paragraph:not(:last-child) {
+ margin-bottom: 3rem; }
+
+.bg-video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: -1;
+ opacity: .8;
+ overflow: hidden; }
+ .bg-video__content {
+ width: 100%;
+ height: 100%;
+ object-fit: cover; }
+
+.btn:hover {
+ transform: translateY(-0.3rem);
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.btn:active, .btn:focus {
+ outline: none;
+ transform: translateY(-0.1rem);
+ box-shadow: 0 0.5rem 21rem rgba(0, 0, 0, 0.2); }
+
+.btn, .btn:link, .btn:visited {
+ text-transform: uppercase;
+ text-decoration: none;
+ padding: 1.5rem 4rem;
+ display: inline-block;
+ border-radius: 10rem;
+ transition: all .2s;
+ position: relative;
+ font-size: 1.6rem;
+ border: none;
+ cursor: pointer; }
+
+.btn::after {
+ content: "";
+ display: inline-block;
+ height: 100%;
+ width: 100%;
+ border-radius: 10rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ transition: all .4s; }
+
+.btn--homepage-header {
+ animation: moveInButton .75s ease-out;
+ animation-fill-mode: backwards; }
+
+.btn--white {
+ background-color: #fff;
+ color: #777; }
+ .btn--white::after {
+ background-color: #fff; }
+ .btn--white:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn--green {
+ background-color: #7ed56f;
+ color: #fff; }
+ .btn--green::after {
+ background-color: #7ed56f; }
+ .btn--green:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn-text:link, .btn-text:visited {
+ color: #7ed56f;
+ display: inline-block;
+ border-bottom: 1px solid #7ed56f;
+ padding: .3rem;
+ font-size: 1.6rem;
+ transition: all .2s; }
+
+.btn-text:hover {
+ background-color: #7ed56f;
+ color: #fff;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.btn-text:active {
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.card {
+ perspective: 150rem;
+ -moz-perspective: 150rem;
+ position: relative;
+ height: 50rem; }
+ .card__side {
+ height: 50rem;
+ color: #fff;
+ font-size: 2rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transition: all .8s ease;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ border-radius: 0.3rem;
+ overflow: hidden;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side--front {
+ background-color: #fff; }
+ .card__side--back {
+ transform: rotateY(180deg); }
+ .card__side--back-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900); }
+ .card__side--back-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a); }
+ .card__side--back-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa); }
+ .card:hover .card__side--front {
+ transform: rotateY(-180deg); }
+ .card:hover .card__side--back {
+ transform: rotateY(0deg); }
+ .card__picture {
+ background-size: cover;
+ height: 23rem;
+ background-blend-mode: screen;
+ clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ border-top-left-radius: 0.3rem;
+ border-top-right-radius: 0.3rem; }
+ .card__picture-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900), url("/img/nat-5.jpg"); }
+ .card__picture-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a), url("/img/nat-6.jpg"); }
+ .card__picture-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa), url("/img/nat-7.jpg"); }
+ .card__heading {
+ color: #fff;
+ font-size: 2.8rem;
+ font-weight: 300;
+ text-transform: uppercase;
+ position: absolute;
+ text-align: right;
+ top: 12rem;
+ right: 2rem;
+ width: 65%; }
+ .card__heading-span {
+ padding: 1rem 1.5rem;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone; }
+ .card__heading-span-1 {
+ background-image: linear-gradient(to right bottom, rgba(255, 119, 48, 0.85), rgba(255, 185, 0, 0.85)); }
+ .card__heading-span-2 {
+ background-image: linear-gradient(to right bottom, rgba(126, 213, 111, 0.85), rgba(85, 197, 122, 0.85)); }
+ .card__heading-span-3 {
+ background-image: linear-gradient(to right bottom, rgba(41, 152, 255, 0.85), rgba(86, 67, 250, 0.85)); }
+ .card__details {
+ padding: 3rem; }
+ .card__details ul {
+ list-style: none;
+ width: 80%;
+ margin: 0 auto;
+ color: #777; }
+ .card__details ul li {
+ text-align: center;
+ font-size: 1.5rem;
+ padding: 1rem; }
+ .card__details ul li:not(:last-child) {
+ border-bottom: 1px #f7f7f7 solid; }
+ .card__cta {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ width: 70%;
+ text-align: center; }
+ .card__price-box {
+ color: #fff;
+ margin-bottom: 8rem; }
+ .card__price-only {
+ font-size: 1.4rem;
+ text-align: center;
+ text-transform: uppercase; }
+ .card__price-value {
+ font-size: 6rem;
+ font-weight: 100; }
+ @media (max-width: 56.25em) {
+ .card {
+ height: auto;
+ border-radius: 0.3rem;
+ background-color: #fff;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side {
+ height: auto;
+ position: relative;
+ box-shadow: none; }
+ .card__side--back {
+ transform: rotateY(0);
+ clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%); }
+ .card:hover .card__side--front {
+ transform: rotateY(0); }
+ .card__cta {
+ position: relative;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transform: translate(0);
+ padding-top: 7rem;
+ padding-bottom: 3rem; }
+ .card__price-box {
+ line-height: 0;
+ margin-bottom: 0; }
+ .card__price-value {
+ font-size: 4rem; }
+ .card__price-only {
+ margin: 0; } }
+
+.composition {
+ position: relative; }
+ .composition__photo {
+ width: 55%;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.4);
+ border-radius: 2px;
+ position: absolute;
+ z-index: 10;
+ transition: all .2s;
+ outline-offset: 2rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo {
+ float: left;
+ position: relative;
+ width: 33.3333%;
+ box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.2);
+ transition: all .2; } }
+ .composition__photo--p1 {
+ left: 0;
+ top: -2rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo--p1 {
+ top: 0rem;
+ transform: scale(1.2); } }
+ .composition__photo--p2 {
+ right: 0;
+ top: 2rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo--p2 {
+ top: 0rem;
+ transform: scale(1.3);
+ z-index: 2000; } }
+ .composition__photo--p3 {
+ left: 20%;
+ top: 10rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo--p3 {
+ top: 0rem;
+ left: 0;
+ transform: scale(1.2); } }
+ .composition__photo:hover {
+ outline: 1.5rem solid #7ed56f;
+ transform: scale(1.05);
+ box-shadow: 0 2.5rem 4rem rgba(0, 0, 0, 0.5);
+ z-index: 20; }
+ .composition:hover .composition__photo:not(:hover) {
+ transform: scale(0.9); }
+
+.feature-box {
+ background-color: rgba(255, 255, 255, 0.8);
+ font-size: 1.5rem;
+ padding: 2.5rem;
+ text-align: center;
+ border-radius: 3px;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15);
+ transition: transform .3s; }
+ @media (max-width: 56.25em) {
+ .feature-box {
+ padding: 2rem; } }
+ .feature-box__icon {
+ font-size: 6rem;
+ margin-bottom: .5rem;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent; }
+ .feature-box:hover {
+ transform: translateY(-1.5rem); }
+
+.form__group:not(:last-child) {
+ margin-bottom: 2rem; }
+
+.form__input {
+ font-size: 1.5rem;
+ font-family: inherit;
+ color: inherit;
+ padding: 1.5rem 2rem;
+ border-radius: .2rem;
+ background-color: #fff;
+ border: none;
+ border-bottom: 0.3rem solid transparent;
+ width: 75%;
+ display: block;
+ transform: all .3s; }
+ .form__input:focus {
+ outline: none;
+ box-shadow: 0.1rem 2rem rgba(0, 0, 0, 0.1);
+ border-bottom: 3px solid #7ed56f; }
+ .form__input:focus:invalid {
+ border-bottom: 3px solid #ff7730; }
+ .form__input::-webkit-input-placeholder {
+ color: #999; }
+
+.form__label {
+ font-size: 1.2rem;
+ font-weight: 700;
+ margin-left: 2rem;
+ margin-top: .7rem;
+ display: block;
+ transition: all .3s; }
+
+.form__input:placeholder-shown + .form__label {
+ opacity: 0;
+ visibility: hidden;
+ transform: translateX(-4rem); }
+
+.form__radio-input {
+ display: none; }
+
+.form__radio-group {
+ width: 49%;
+ display: inline-block; }
+ @media (max-width: 75em) {
+ .form__radio-group {
+ width: 100%;
+ margin-bottom: 3rem; } }
+
+.form__radio-label {
+ font-size: 1.6rem;
+ cursor: pointer;
+ position: relative;
+ padding-left: 5rem; }
+
+.form__radio-button {
+ height: 3rem;
+ width: 3rem;
+ border: 5px solid #7ed56f;
+ display: inline-block;
+ position: absolute;
+ top: -.4rem;
+ left: 0;
+ border-radius: 50%; }
+ .form__radio-button::after {
+ content: "";
+ height: 1rem;
+ width: 1rem;
+ border-radius: 50%;
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #7ed56f;
+ opacity: 0;
+ transition: all .2s; }
+
+.form__radio-input:checked ~ .form__radio-label .form__radio-button::after {
+ opacity: 1; }
+
+/* Header Title */
+.heading-primary {
+ color: #fff;
+ text-transform: uppercase;
+ /* Makes animation smoother */
+ backface-visibility: hidden;
+ margin-bottom: 6rem; }
+ .heading-primary--main {
+ display: block;
+ font-size: 6rem;
+ font-weight: 400;
+ letter-spacing: 3.5rem;
+ animation-name: moveInLeft;
+ animation-duration: 1s;
+ /* animation-delay: 3s; */
+ /* animation-iteration-count: 3; */
+ animation-timing-function: ease-in; }
+ @media (max-width: 37.5em) {
+ .heading-primary--main {
+ letter-spacing: 1rem;
+ font-size: 5rem; } }
+ .heading-primary--secondry {
+ display: block;
+ font-size: 2rem;
+ font-weight: 700;
+ letter-spacing: 1.7rem;
+ animation: moveInRight 1s ease-in; }
+ @media (max-width: 37.5em) {
+ .heading-primary--secondry {
+ letter-spacing: .5rem; } }
+
+.heading-secondary {
+ font-size: 3.5rem;
+ text-transform: uppercase;
+ font-weight: 700;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ letter-spacing: .2rem;
+ transform: all .2s; }
+ @media (max-width: 56.25em) {
+ .heading-secondary {
+ font-size: 3rem; } }
+ @media (max-width: 37.5em) {
+ .heading-secondary {
+ font-size: 2.5rem; } }
+ .heading-secondary:hover {
+ transform: skewY(2deg) scale(1.1);
+ text-shadow: 0.5rem 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.heading-tertiary {
+ font-size: 1.6rem;
+ font-weight: 700;
+ text-transform: uppercase; }
+
+.popup {
+ background-color: rgba(0, 0, 0, 0.8);
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 3000;
+ opacity: 0;
+ visibility: hidden;
+ transition: all .3s; }
+ @supports (-webkit-backdrop-filter: blur(10px)) or (backdrop-filter: blur(10px)) {
+ .popup {
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px); } }
+ .popup:target {
+ visibility: visible;
+ opacity: 1; }
+ .popup:target .popup__modal {
+ opacity: 1;
+ transform: translate(-50%, -50%) scale(1); }
+ .popup__close:link, .popup__close:visited {
+ color: #777;
+ position: absolute;
+ right: 2.5rem;
+ font-size: 3rem;
+ text-decoration: none;
+ display: inline-block;
+ transform: all .2s;
+ line-height: 1; }
+ .popup__close :hover {
+ color: #999; }
+ .popup__modal {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #fff;
+ width: 75%;
+ box-shadow: 0 2rem 4rem rgba(0, 0, 0, 0.2);
+ display: table;
+ overflow: hidden;
+ border-radius: .3rem;
+ opacity: 0;
+ transform: translate(-50%, -50%) scale(0.5);
+ transition: all .2s .2s; }
+ .popup__images {
+ width: 33.333333333%;
+ display: table-cell; }
+ @media (max-width: 75em) {
+ .popup__images {
+ display: none; } }
+ .popup__image {
+ display: block;
+ width: 100%; }
+ .popup__content {
+ width: 66.6666666666%;
+ vertical-align: middle;
+ text-align: center;
+ display: table-cell;
+ padding: 1rem 3em; }
+ .popup__text {
+ font-size: 1.4rem;
+ margin-bottom: 4rem;
+ text-align: left;
+ -moz-column-count: 2;
+ -moz-column-gap: 4rem;
+ -moz-column-rule: 1px solid #f7f7f7;
+ column-count: 2;
+ column-gap: 4rem;
+ column-rule: 1px solid #f7f7f7;
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto; }
+
+.story {
+ width: 75%;
+ margin: 0 auto;
+ box-shadow: 0 3rem 6rem rgba(0, 0, 0, 0.2);
+ background-color: rgba(255, 255, 255, 0.6);
+ border-radius: 0.3rem;
+ padding: 6rem;
+ padding-left: 9rem;
+ font-size: 1.6rem;
+ transform: skewX(-12deg); }
+ @media (max-width: 56.25em) {
+ .story {
+ width: 100%;
+ padding: 4rem;
+ padding-left: 0; } }
+ @media (max-width: 37.5em) {
+ .story {
+ transform: skewX(0); } }
+ .story__shape {
+ width: 15rem;
+ height: 15rem;
+ float: left;
+ position: relative;
+ overflow: hidden;
+ transform: translateX(-3rem) skewX(12deg);
+ border-radius: 50%; }
+ @supports (clip-path: polygon(0, 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .story__shape {
+ clip-path: circle(50% at 50% 50%);
+ -webkit-clip-path: circle(50% at 50% 50%);
+ -webkit-shape-outside: circle(50% at 50% 50%);
+ shape-outside: circle(50% at 50% 50%);
+ border-radius: none; } }
+ @media (max-width: 37.5em) {
+ .story__shape {
+ transform: translateX(-3rem) skewX(0); } }
+ .story__img {
+ height: 100%;
+ transform: translateX(-4rem) scale(1.4);
+ backface-visibility: hidden;
+ transition: all .5s; }
+ .story__text {
+ transform: skewX(12deg); }
+ @media (max-width: 37.5em) {
+ .story__text {
+ transform: skewX(0); } }
+ .story__caption {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ color: #fff;
+ text-transform: uppercase;
+ font-size: 1.7rem;
+ text-align: center;
+ opacity: 0;
+ transform: translate(-50%, 20%);
+ transition: all .5s;
+ backface-visibility: hidden; }
+ .story:hover .story__caption {
+ opacity: 1;
+ transform: translate(-50%, -50%); }
+ .story:hover .story__img {
+ opacity: 1;
+ transform: scale(1);
+ filter: blur(3px) brightness(80%); }
+
+.footer {
+ background-color: #333;
+ padding: 10rem 0;
+ font-size: 1.4rem;
+ color: #f7f7f7; }
+ @media (max-width: 56.25em) {
+ .footer {
+ padding: 10rem 2rem; } }
+ @media (max-width: 56.25em) {
+ .footer {
+ padding: 8rem 0; } }
+ .footer__logo-box {
+ text-align: center;
+ margin-bottom: 8rem; }
+ .footer__logo {
+ width: 15rem; }
+ .footer__navigation {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block; }
+ @media (max-width: 56.25em) {
+ .footer__navigation {
+ width: 100%;
+ text-align: center; } }
+ .footer__list {
+ list-style: none;
+ padding: 0; }
+ .footer__list__item {
+ display: inline-block; }
+ .footer__list__item:not(:last-child) {
+ margin-right: 1.5rem; }
+ .footer__link:link, .footer__link:visited {
+ color: #f7f7f7;
+ text-decoration: none;
+ text-transform: uppercase;
+ display: inline-block;
+ transition: all .2s; }
+ .footer__link:hover, .footer__link:active {
+ color: #7ed56f;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.4);
+ transform: rotate(5deg) scale(1.3); }
+ .footer__copyright {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block;
+ width: 80%;
+ float: right; }
+ @media (max-width: 56.25em) {
+ .footer__copyright {
+ float: none;
+ width: 100%; } }
+
+.row {
+ max-width: 114rem;
+ margin: 0 auto; }
+ .row:not(:last-child) {
+ margin-bottom: 8rem; }
+ @media (max-width: 56.25em) {
+ .row:not(:last-child) {
+ margin-bottom: 6rem; } }
+ @media (max-width: 56.25em) {
+ .row {
+ max-width: 50rem;
+ padding: 0 3rem; } }
+ .row:after {
+ content: "";
+ display: table;
+ clear: both; }
+ .row [class^="col-"] {
+ float: left; }
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 6rem; }
+ @media (max-width: 56.25em) {
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 0;
+ margin-bottom: 6rem; } }
+ @media (max-width: 56.25em) {
+ .row [class^="col-"] {
+ width: 100% !important; } }
+ .row .col-1-of-2 {
+ width: calc((100% - 6rem) / 2); }
+ .row .col-1-of-3 {
+ width: calc((100% - 2 * 6rem) / 3); }
+ .row .col-2-of-3 {
+ width: calc(2 * ((100% - 2 * 6rem) / 3) + 6rem); }
+ .row .col-1-of-4 {
+ width: calc((100% - 3 * 6rem) / 4); }
+ .row .col-2-of-4 {
+ width: calc(2 * ((100% - 3 * 6rem) / 4) + 6rem); }
+ .row .col-3-of-4 {
+ width: calc(3 * ((100% - 3 * 6rem) / 4) + 2 * 6rem); }
+
+/* Header */
+.header {
+ height: 85vh;
+ background-image: linear-gradient(to right, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero-small.jpg);
+ background-size: cover;
+ background-position: top;
+ position: relative; }
+ @supports (clip-path: polygon(0, 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .header {
+ clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ height: 95vh; } }
+ @media (min-resolution: 192dpi) and (min-width: 37.5em), (-webkit-min-device-pixel-ratio: 2) and (min-width: 37.5em), (min-width: 125em) {
+ .header {
+ background-image: linear-gradient(to right, rgba(85, 197, 122, 0.8), rgba(0, 0, 0, 0.8)), url(../img/hero-.jpg); } }
+ @media (max-width: 56.25em) {
+ .header {
+ clip-path: polygon(0 0, 100% 0, 100% 85vh, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 85vh, 0 100%); } }
+ .header__logo-box {
+ position: absolute;
+ top: 4rem;
+ left: 4rem; }
+ .header__logo {
+ height: 3.5rem; }
+ .header__main {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center; }
+
+.navigation__checkbox {
+ display: none; }
+
+.navigation__button {
+ background-color: #fff;
+ height: 7rem;
+ width: 7rem;
+ position: fixed;
+ top: 6rem;
+ right: 6rem;
+ border-radius: 50%;
+ z-index: 2000;
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.1);
+ text-align: center;
+ cursor: pointer; }
+ @media (max-width: 56.25em) {
+ .navigation__button {
+ top: 4rem;
+ right: 4rem; } }
+ @media (max-width: 37.5em) {
+ .navigation__button {
+ top: 3rem;
+ right: 3rem; } }
+
+.navigation__background {
+ height: 6rem;
+ width: 6rem;
+ border-radius: 50%;
+ position: fixed;
+ top: 6.5rem;
+ right: 6.5rem;
+ background-image: radial-gradient(#55c57a, #28b485);
+ z-index: 1000;
+ transition: transform 0.8s cubic-bezier(0.86, 0, 0.07, 1); }
+ @media (max-width: 56.25em) {
+ .navigation__background {
+ top: 4.5rem;
+ right: 4.5rem; } }
+
+.navigation__nav {
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 1500;
+ opacity: 0;
+ width: 0;
+ transition: all .8s; }
+
+.navigation__list {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ list-style: none;
+ text-align: center;
+ width: 100%; }
+
+.navigation__item {
+ margin: 1rem; }
+
+.navigation__link:link, .navigation__link:visited {
+ display: inline-block;
+ font-size: 3rem;
+ font-weight: 300;
+ padding: 1rem 2rem;
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ background-image: linear-gradient(120deg, transparent 0%, transparent 50%, #fff 50%);
+ background-size: 225%;
+ transition: all .4s; }
+ .navigation__link:link span, .navigation__link:visited span {
+ display: inline-block;
+ margin-right: 1.5rem; }
+
+.navigation__link:hover, .navigation__link a:active {
+ background-position: 100%;
+ color: #7ed56f;
+ transform: translateX(1rem); }
+
+.navigation__checkbox:checked ~ .navigation__background {
+ transform: scale(80); }
+
+.navigation__checkbox:checked ~ .navigation__nav {
+ opacity: 1;
+ width: 100%; }
+
+.navigation__icon {
+ position: relative;
+ margin-top: 3.5rem; }
+ .navigation__icon, .navigation__icon::before, .navigation__icon::after {
+ width: 3rem;
+ height: .2rem;
+ background-color: #777;
+ display: inline-block; }
+ .navigation__icon::before, .navigation__icon::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ transition: all .2s; }
+ .navigation__icon::before {
+ top: -.8rem; }
+ .navigation__icon::after {
+ top: .8rem; }
+
+.navigation__button:hover .navigation__icon::before {
+ top: -1rem; }
+
+.navigation__button:hover .navigation__icon::after {
+ top: 1rem; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon {
+ background-color: transparent; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::before {
+ top: 0;
+ transform: rotate(135deg); }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::after {
+ top: 0;
+ transform: rotate(-135deg); }
+
+.section-about {
+ background-color: #f7f7f7;
+ padding: 25rem 0;
+ margin-top: -20vh; }
+ @media (max-width: 56.25em) {
+ .section-about {
+ padding: 10rem 0; } }
+
+.section-features {
+ padding: 20rem 0;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/nat-4.jpg);
+ background-size: cover;
+ margin-top: -10rem;
+ transform: skewY(-7deg); }
+ .section-features > * {
+ transform: skewY(7deg); }
+ @media (max-width: 56.25em) {
+ .section-features {
+ padding: 10rem 0; } }
+
+.section-tours {
+ background-color: #f7f7f7;
+ padding: 25rem 0 15rem 0;
+ margin-top: -10rem; }
+ @media (max-width: 56.25em) {
+ .section-tours {
+ padding: 15rem 0; } }
+
+.section-stories {
+ position: relative;
+ padding: 15rem 0; }
+ @media (max-width: 56.25em) {
+ .section-stories {
+ padding: 10rem 0; } }
+
+.section-booking {
+ padding: 15rem 0;
+ background-image: linear-gradient(to right bottom, #55c57a, #28b485); }
+
+.book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 50%, transparent 50%), url(../img/nat-10.jpg);
+ background-size: 100%;
+ border-radius: 0.3rem;
+ box-shadow: 0 1.5rem 4rem black;
+ background-size: cover; }
+ @media (max-width: 75em) {
+ .book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 70%, transparent 70%), url(../img/nat-10.jpg);
+ background-size: cover; } }
+ @media (max-width: 56.25em) {
+ .book {
+ background-image: linear-gradient(to right, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 100%), url(../img/nat-10.jpg); } }
+ .book__form {
+ width: 50%;
+ padding: 6rem; }
+ @media (max-width: 75em) {
+ .book__form {
+ width: 90%; } }
diff --git a/css/style.concat.css b/css/style.concat.css
new file mode 100644
index 0000000..4e2bde0
--- /dev/null
+++ b/css/style.concat.css
@@ -0,0 +1,1405 @@
+@charset "UTF-8";
+
+@font-face {
+ font-family: "linea-basic-10";
+ src:url("fonts/linea-basic-10.eot");
+ src:url("fonts/linea-basic-10.eot?#iefix") format("embedded-opentype"),
+ url("fonts/linea-basic-10.woff") format("woff"),
+ url("fonts/linea-basic-10.ttf") format("truetype"),
+ url("fonts/linea-basic-10.svg#linea-basic-10") format("svg");
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+[data-icon]:before {
+ font-family: "linea-basic-10" !important;
+ content: attr(data-icon);
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ font-family: "linea-basic-10" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-basic-accelerator:before {
+ content: "a";
+}
+.icon-basic-alarm:before {
+ content: "b";
+}
+.icon-basic-anchor:before {
+ content: "c";
+}
+.icon-basic-anticlockwise:before {
+ content: "d";
+}
+.icon-basic-archive:before {
+ content: "e";
+}
+.icon-basic-archive-full:before {
+ content: "f";
+}
+.icon-basic-ban:before {
+ content: "g";
+}
+.icon-basic-battery-charge:before {
+ content: "h";
+}
+.icon-basic-battery-empty:before {
+ content: "i";
+}
+.icon-basic-battery-full:before {
+ content: "j";
+}
+.icon-basic-battery-half:before {
+ content: "k";
+}
+.icon-basic-bolt:before {
+ content: "l";
+}
+.icon-basic-book:before {
+ content: "m";
+}
+.icon-basic-book-pen:before {
+ content: "n";
+}
+.icon-basic-book-pencil:before {
+ content: "o";
+}
+.icon-basic-bookmark:before {
+ content: "p";
+}
+.icon-basic-calculator:before {
+ content: "q";
+}
+.icon-basic-calendar:before {
+ content: "r";
+}
+.icon-basic-cards-diamonds:before {
+ content: "s";
+}
+.icon-basic-cards-hearts:before {
+ content: "t";
+}
+.icon-basic-case:before {
+ content: "u";
+}
+.icon-basic-chronometer:before {
+ content: "v";
+}
+.icon-basic-clessidre:before {
+ content: "w";
+}
+.icon-basic-clock:before {
+ content: "x";
+}
+.icon-basic-clockwise:before {
+ content: "y";
+}
+.icon-basic-cloud:before {
+ content: "z";
+}
+.icon-basic-clubs:before {
+ content: "A";
+}
+.icon-basic-compass:before {
+ content: "B";
+}
+.icon-basic-cup:before {
+ content: "C";
+}
+.icon-basic-diamonds:before {
+ content: "D";
+}
+.icon-basic-display:before {
+ content: "E";
+}
+.icon-basic-download:before {
+ content: "F";
+}
+.icon-basic-exclamation:before {
+ content: "G";
+}
+.icon-basic-eye:before {
+ content: "H";
+}
+.icon-basic-eye-closed:before {
+ content: "I";
+}
+.icon-basic-female:before {
+ content: "J";
+}
+.icon-basic-flag1:before {
+ content: "K";
+}
+.icon-basic-flag2:before {
+ content: "L";
+}
+.icon-basic-floppydisk:before {
+ content: "M";
+}
+.icon-basic-folder:before {
+ content: "N";
+}
+.icon-basic-folder-multiple:before {
+ content: "O";
+}
+.icon-basic-gear:before {
+ content: "P";
+}
+.icon-basic-geolocalize-01:before {
+ content: "Q";
+}
+.icon-basic-geolocalize-05:before {
+ content: "R";
+}
+.icon-basic-globe:before {
+ content: "S";
+}
+.icon-basic-gunsight:before {
+ content: "T";
+}
+.icon-basic-hammer:before {
+ content: "U";
+}
+.icon-basic-headset:before {
+ content: "V";
+}
+.icon-basic-heart:before {
+ content: "W";
+}
+.icon-basic-heart-broken:before {
+ content: "X";
+}
+.icon-basic-helm:before {
+ content: "Y";
+}
+.icon-basic-home:before {
+ content: "Z";
+}
+.icon-basic-info:before {
+ content: "0";
+}
+.icon-basic-ipod:before {
+ content: "1";
+}
+.icon-basic-joypad:before {
+ content: "2";
+}
+.icon-basic-key:before {
+ content: "3";
+}
+.icon-basic-keyboard:before {
+ content: "4";
+}
+.icon-basic-laptop:before {
+ content: "5";
+}
+.icon-basic-life-buoy:before {
+ content: "6";
+}
+.icon-basic-lightbulb:before {
+ content: "7";
+}
+.icon-basic-link:before {
+ content: "8";
+}
+.icon-basic-lock:before {
+ content: "9";
+}
+.icon-basic-lock-open:before {
+ content: "!";
+}
+.icon-basic-magic-mouse:before {
+ content: "\"";
+}
+.icon-basic-magnifier:before {
+ content: "#";
+}
+.icon-basic-magnifier-minus:before {
+ content: "$";
+}
+.icon-basic-magnifier-plus:before {
+ content: "%";
+}
+.icon-basic-mail:before {
+ content: "&";
+}
+.icon-basic-mail-multiple:before {
+ content: "'";
+}
+.icon-basic-mail-open:before {
+ content: "(";
+}
+.icon-basic-mail-open-text:before {
+ content: ")";
+}
+.icon-basic-male:before {
+ content: "*";
+}
+.icon-basic-map:before {
+ content: "+";
+}
+.icon-basic-message:before {
+ content: ",";
+}
+.icon-basic-message-multiple:before {
+ content: "-";
+}
+.icon-basic-message-txt:before {
+ content: ".";
+}
+.icon-basic-mixer2:before {
+ content: "/";
+}
+.icon-basic-mouse:before {
+ content: ":";
+}
+.icon-basic-notebook:before {
+ content: ";";
+}
+.icon-basic-notebook-pen:before {
+ content: "<";
+}
+.icon-basic-notebook-pencil:before {
+ content: "=";
+}
+.icon-basic-paperplane:before {
+ content: ">";
+}
+.icon-basic-pencil-ruler:before {
+ content: "?";
+}
+.icon-basic-pencil-ruler-pen:before {
+ content: "@";
+}
+.icon-basic-photo:before {
+ content: "[";
+}
+.icon-basic-picture:before {
+ content: "]";
+}
+.icon-basic-picture-multiple:before {
+ content: "^";
+}
+.icon-basic-pin1:before {
+ content: "_";
+}
+.icon-basic-pin2:before {
+ content: "`";
+}
+.icon-basic-postcard:before {
+ content: "{";
+}
+.icon-basic-postcard-multiple:before {
+ content: "|";
+}
+.icon-basic-printer:before {
+ content: "}";
+}
+.icon-basic-question:before {
+ content: "~";
+}
+.icon-basic-rss:before {
+ content: "\\";
+}
+.icon-basic-server:before {
+ content: "\e000";
+}
+.icon-basic-server2:before {
+ content: "\e001";
+}
+.icon-basic-server-cloud:before {
+ content: "\e002";
+}
+.icon-basic-server-download:before {
+ content: "\e003";
+}
+.icon-basic-server-upload:before {
+ content: "\e004";
+}
+.icon-basic-settings:before {
+ content: "\e005";
+}
+.icon-basic-share:before {
+ content: "\e006";
+}
+.icon-basic-sheet:before {
+ content: "\e007";
+}
+.icon-basic-sheet-multiple:before {
+ content: "\e008";
+}
+.icon-basic-sheet-pen:before {
+ content: "\e009";
+}
+.icon-basic-sheet-pencil:before {
+ content: "\e00a";
+}
+.icon-basic-sheet-txt:before {
+ content: "\e00b";
+}
+.icon-basic-signs:before {
+ content: "\e00c";
+}
+.icon-basic-smartphone:before {
+ content: "\e00d";
+}
+.icon-basic-spades:before {
+ content: "\e00e";
+}
+.icon-basic-spread:before {
+ content: "\e00f";
+}
+.icon-basic-spread-bookmark:before {
+ content: "\e010";
+}
+.icon-basic-spread-text:before {
+ content: "\e011";
+}
+.icon-basic-spread-text-bookmark:before {
+ content: "\e012";
+}
+.icon-basic-star:before {
+ content: "\e013";
+}
+.icon-basic-tablet:before {
+ content: "\e014";
+}
+.icon-basic-target:before {
+ content: "\e015";
+}
+.icon-basic-todo:before {
+ content: "\e016";
+}
+.icon-basic-todo-pen:before {
+ content: "\e017";
+}
+.icon-basic-todo-pencil:before {
+ content: "\e018";
+}
+.icon-basic-todo-txt:before {
+ content: "\e019";
+}
+.icon-basic-todolist-pen:before {
+ content: "\e01a";
+}
+.icon-basic-todolist-pencil:before {
+ content: "\e01b";
+}
+.icon-basic-trashcan:before {
+ content: "\e01c";
+}
+.icon-basic-trashcan-full:before {
+ content: "\e01d";
+}
+.icon-basic-trashcan-refresh:before {
+ content: "\e01e";
+}
+.icon-basic-trashcan-remove:before {
+ content: "\e01f";
+}
+.icon-basic-upload:before {
+ content: "\e020";
+}
+.icon-basic-usb:before {
+ content: "\e021";
+}
+.icon-basic-video:before {
+ content: "\e022";
+}
+.icon-basic-watch:before {
+ content: "\e023";
+}
+.icon-basic-webpage:before {
+ content: "\e024";
+}
+.icon-basic-webpage-img-txt:before {
+ content: "\e025";
+}
+.icon-basic-webpage-multiple:before {
+ content: "\e026";
+}
+.icon-basic-webpage-txt:before {
+ content: "\e027";
+}
+.icon-basic-world:before {
+ content: "\e028";
+}
+
+/* Media Query
+- phone
+- tab-port
+- tab-land
+- big-desk
+*/
+*,
+*::after,
+*::bofore {
+ margin: 0;
+ padding: 0;
+ box-sizing: inherit; }
+
+html {
+ font-size: 62.5%;
+ /* Set to 10 to make calculation easier. 10% as it's 62.5% pf default browser font-size 16px; */ }
+ @media only screen and (max-width: 75em) {
+ html {
+ font-size: 56.25%; } }
+ @media only screen and (max-width: 56.25em) {
+ html {
+ font-size: 50%; } }
+
+body {
+ box-sizing: border-box;
+ padding: 3rem; }
+ @media only screen and (max-width: 56.25em) {
+ body {
+ padding: 0;
+ margin: 0; } }
+
+::selection {
+ background-color: #7ed56f;
+ color: #fff; }
+
+.u-centre-text {
+ text-align: center !important; }
+
+.u-margin-bottom-small {
+ margin-bottom: 1.5rem !important; }
+
+.u-margin-bottom-medium {
+ margin-bottom: 4rem !important; }
+ @media only screen and (max-width: 56.25em) {
+ .u-margin-bottom-medium {
+ margin-bottom: 3rem !important; } }
+
+.u-margin-bottom-large {
+ margin-bottom: 8rem !important; }
+ @media only screen and (max-width: 56.25em) {
+ .u-margin-bottom-large {
+ margin-bottom: 5rem !important; } }
+
+.u-margin-top-large {
+ margin-top: 8rem !important; }
+
+@keyframes moveInLeft {
+ 0% {
+ opacity: 0;
+ transform: translateX(-10rem); }
+ 80% {
+ transform: translateX(2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInRight {
+ 0% {
+ opacity: 0;
+ transform: translateX(10rem); }
+ 80% {
+ transform: translateX(-2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInButton {
+ 0% {
+ opacity: 0;
+ transform: translateY(5rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+body {
+ font-family: "Lato", sans-serif;
+ font-weight: 400;
+ line-height: 1.7;
+ color: #777; }
+
+.paragraph {
+ font-size: 1.6rem; }
+ .paragraph:not(:last-child) {
+ margin-bottom: 3rem; }
+
+.bg-video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: -1;
+ opacity: .8;
+ overflow: hidden; }
+ .bg-video__content {
+ width: 100%;
+ height: 100%;
+ object-fit: cover; }
+
+.btn:hover {
+ transform: translateY(-0.3rem);
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.btn:active, .btn:focus {
+ outline: none;
+ transform: translateY(-0.1rem);
+ box-shadow: 0 0.5rem 21rem rgba(0, 0, 0, 0.2); }
+
+.btn, .btn:link, .btn:visited {
+ text-transform: uppercase;
+ text-decoration: none;
+ padding: 1.5rem 4rem;
+ display: inline-block;
+ border-radius: 10rem;
+ transition: all .2s;
+ position: relative;
+ font-size: 1.6rem;
+ border: none;
+ cursor: pointer; }
+
+.btn::after {
+ content: "";
+ display: inline-block;
+ height: 100%;
+ width: 100%;
+ border-radius: 10rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ transition: all .4s; }
+
+.btn--homepage-header {
+ animation: moveInButton .75s ease-out;
+ animation-fill-mode: backwards; }
+
+.btn--white {
+ background-color: #fff;
+ color: #777; }
+ .btn--white::after {
+ background-color: #fff; }
+ .btn--white:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn--green {
+ background-color: #7ed56f;
+ color: #fff; }
+ .btn--green::after {
+ background-color: #7ed56f; }
+ .btn--green:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn-text:link, .btn-text:visited {
+ color: #7ed56f;
+ display: inline-block;
+ border-bottom: 1px solid #7ed56f;
+ padding: .3rem;
+ font-size: 1.6rem;
+ transition: all .2s; }
+
+.btn-text:hover {
+ background-color: #7ed56f;
+ color: #fff;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.btn-text:active {
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.card {
+ perspective: 150rem;
+ -moz-perspective: 150rem;
+ position: relative;
+ height: 50rem; }
+ .card__side {
+ height: 50rem;
+ color: #fff;
+ font-size: 2rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transition: all .8s ease;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ border-radius: 0.3rem;
+ overflow: hidden;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side--front {
+ background-color: #fff; }
+ .card__side--back {
+ transform: rotateY(180deg); }
+ .card__side--back-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900); }
+ .card__side--back-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a); }
+ .card__side--back-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa); }
+ .card:hover .card__side--front {
+ transform: rotateY(-180deg); }
+ .card:hover .card__side--back {
+ transform: rotateY(0deg); }
+ .card__picture {
+ background-size: cover;
+ height: 23rem;
+ background-blend-mode: screen;
+ clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ border-top-left-radius: 0.3rem;
+ border-top-right-radius: 0.3rem; }
+ .card__picture-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900), url("/img/nat-5.jpg"); }
+ .card__picture-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a), url("/img/nat-6.jpg"); }
+ .card__picture-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa), url("/img/nat-7.jpg"); }
+ .card__heading {
+ color: #fff;
+ font-size: 2.8rem;
+ font-weight: 300;
+ text-transform: uppercase;
+ position: absolute;
+ text-align: right;
+ top: 12rem;
+ right: 2rem;
+ width: 65%; }
+ .card__heading-span {
+ padding: 1rem 1.5rem;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone; }
+ .card__heading-span-1 {
+ background-image: linear-gradient(to right bottom, rgba(255, 119, 48, 0.85), rgba(255, 185, 0, 0.85)); }
+ .card__heading-span-2 {
+ background-image: linear-gradient(to right bottom, rgba(126, 213, 111, 0.85), rgba(85, 197, 122, 0.85)); }
+ .card__heading-span-3 {
+ background-image: linear-gradient(to right bottom, rgba(41, 152, 255, 0.85), rgba(86, 67, 250, 0.85)); }
+ .card__details {
+ padding: 3rem; }
+ .card__details ul {
+ list-style: none;
+ width: 80%;
+ margin: 0 auto;
+ color: #777; }
+ .card__details ul li {
+ text-align: center;
+ font-size: 1.5rem;
+ padding: 1rem; }
+ .card__details ul li:not(:last-child) {
+ border-bottom: 1px #f7f7f7 solid; }
+ .card__cta {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ width: 70%;
+ text-align: center; }
+ .card__price-box {
+ color: #fff;
+ margin-bottom: 8rem; }
+ .card__price-only {
+ font-size: 1.4rem;
+ text-align: center;
+ text-transform: uppercase; }
+ .card__price-value {
+ font-size: 6rem;
+ font-weight: 100; }
+ @media only screen and (max-width: 56.25em), only screen and (hover: none) {
+ .card {
+ height: auto;
+ border-radius: 0.3rem;
+ background-color: #fff;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side {
+ height: auto;
+ position: relative;
+ box-shadow: none; }
+ .card__side--back {
+ transform: rotateY(0);
+ clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%); }
+ .card:hover .card__side--front {
+ transform: rotateY(0); }
+ .card__cta {
+ position: relative;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transform: translate(0);
+ padding-top: 7rem;
+ padding-bottom: 3rem; }
+ .card__price-box {
+ line-height: 0;
+ margin-bottom: 0; }
+ .card__price-value {
+ font-size: 4rem; }
+ .card__price-only {
+ margin: 0; } }
+
+.composition {
+ position: relative; }
+ .composition__photo {
+ width: 55%;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.4);
+ border-radius: 2px;
+ position: absolute;
+ z-index: 10;
+ transition: all .2s;
+ outline-offset: 2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo {
+ float: left;
+ position: relative;
+ width: 33.3333%;
+ box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.2);
+ transition: all .2; } }
+ .composition__photo--p1 {
+ left: 0;
+ top: -2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p1 {
+ top: 0rem;
+ transform: scale(1.2); } }
+ .composition__photo--p2 {
+ right: 0;
+ top: 2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p2 {
+ top: 0rem;
+ transform: scale(1.3);
+ z-index: 2000; } }
+ .composition__photo--p3 {
+ left: 20%;
+ top: 10rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p3 {
+ top: 0rem;
+ left: 0;
+ transform: scale(1.2); } }
+ .composition__photo:hover {
+ outline: 1.5rem solid #7ed56f;
+ transform: scale(1.05);
+ box-shadow: 0 2.5rem 4rem rgba(0, 0, 0, 0.5);
+ z-index: 20; }
+ .composition:hover .composition__photo:not(:hover) {
+ transform: scale(0.9); }
+
+.feature-box {
+ background-color: rgba(255, 255, 255, 0.8);
+ font-size: 1.5rem;
+ padding: 2.5rem;
+ text-align: center;
+ border-radius: 3px;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15);
+ transition: transform .3s; }
+ @media only screen and (max-width: 56.25em) {
+ .feature-box {
+ padding: 2rem; } }
+ .feature-box__icon {
+ font-size: 6rem;
+ margin-bottom: .5rem;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent; }
+ .feature-box:hover {
+ transform: translateY(-1.5rem); }
+
+.form__group:not(:last-child) {
+ margin-bottom: 2rem; }
+
+.form__input {
+ font-size: 1.5rem;
+ font-family: inherit;
+ color: inherit;
+ padding: 1.5rem 2rem;
+ border-radius: .2rem;
+ background-color: #fff;
+ border: none;
+ border-bottom: 0.3rem solid transparent;
+ width: 75%;
+ display: block;
+ transform: all .3s; }
+ .form__input:focus {
+ outline: none;
+ box-shadow: 0.1rem 2rem rgba(0, 0, 0, 0.1);
+ border-bottom: 3px solid #7ed56f; }
+ .form__input:focus:invalid {
+ border-bottom: 3px solid #ff7730; }
+ .form__input::-webkit-input-placeholder {
+ color: #999; }
+
+.form__label {
+ font-size: 1.2rem;
+ font-weight: 700;
+ margin-left: 2rem;
+ margin-top: .7rem;
+ display: block;
+ transition: all .3s; }
+
+.form__input:placeholder-shown + .form__label {
+ opacity: 0;
+ visibility: hidden;
+ transform: translateX(-4rem); }
+
+.form__radio-input {
+ display: none; }
+
+.form__radio-group {
+ width: 49%;
+ display: inline-block; }
+ @media only screen and (max-width: 75em) {
+ .form__radio-group {
+ width: 100%;
+ margin-bottom: 3rem; } }
+
+.form__radio-label {
+ font-size: 1.6rem;
+ cursor: pointer;
+ position: relative;
+ padding-left: 5rem; }
+
+.form__radio-button {
+ height: 3rem;
+ width: 3rem;
+ border: 5px solid #7ed56f;
+ display: inline-block;
+ position: absolute;
+ top: -.4rem;
+ left: 0;
+ border-radius: 50%; }
+ .form__radio-button::after {
+ content: "";
+ height: 1rem;
+ width: 1rem;
+ border-radius: 50%;
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #7ed56f;
+ opacity: 0;
+ transition: all .2s; }
+
+.form__radio-input:checked ~ .form__radio-label .form__radio-button::after {
+ opacity: 1; }
+
+/* Header Title */
+.heading-primary {
+ color: #fff;
+ text-transform: uppercase;
+ /* Makes animation smoother */
+ backface-visibility: hidden;
+ margin-bottom: 6rem; }
+ .heading-primary--main {
+ display: block;
+ font-size: 6rem;
+ font-weight: 400;
+ letter-spacing: 3.5rem;
+ animation-name: moveInLeft;
+ animation-duration: 1s;
+ /* animation-delay: 3s; */
+ /* animation-iteration-count: 3; */
+ animation-timing-function: ease-in; }
+ @media only screen and (max-width: 37.5em) {
+ .heading-primary--main {
+ letter-spacing: 1rem;
+ font-size: 5rem; } }
+ .heading-primary--secondry {
+ display: block;
+ font-size: 2rem;
+ font-weight: 700;
+ letter-spacing: 1.7rem;
+ animation: moveInRight 1s ease-in; }
+ @media only screen and (max-width: 37.5em) {
+ .heading-primary--secondry {
+ letter-spacing: .5rem; } }
+
+.heading-secondary {
+ font-size: 3.5rem;
+ text-transform: uppercase;
+ font-weight: 700;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ letter-spacing: .2rem;
+ transform: all .2s; }
+ @media only screen and (max-width: 56.25em) {
+ .heading-secondary {
+ font-size: 3rem; } }
+ @media only screen and (max-width: 37.5em) {
+ .heading-secondary {
+ font-size: 2.5rem; } }
+ .heading-secondary:hover {
+ transform: skewY(2deg) scale(1.1);
+ text-shadow: 0.5rem 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.heading-tertiary {
+ font-size: 1.6rem;
+ font-weight: 700;
+ text-transform: uppercase; }
+
+.popup {
+ background-color: rgba(0, 0, 0, 0.8);
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 3000;
+ opacity: 0;
+ visibility: hidden;
+ transition: all .3s; }
+ @supports (-webkit-backdrop-filter: blur(10px)) or (backdrop-filter: blur(10px)) {
+ .popup {
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px); } }
+ .popup:target {
+ visibility: visible;
+ opacity: 1; }
+ .popup:target .popup__modal {
+ opacity: 1;
+ transform: translate(-50%, -50%) scale(1); }
+ .popup__close:link, .popup__close:visited {
+ color: #777;
+ position: absolute;
+ right: 2.5rem;
+ font-size: 3rem;
+ text-decoration: none;
+ display: inline-block;
+ transform: all .2s;
+ line-height: 1; }
+ .popup__close :hover {
+ color: #999; }
+ .popup__modal {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #fff;
+ width: 75%;
+ box-shadow: 0 2rem 4rem rgba(0, 0, 0, 0.2);
+ display: table;
+ overflow: hidden;
+ border-radius: .3rem;
+ opacity: 0;
+ transform: translate(-50%, -50%) scale(0.5);
+ transition: all .2s .2s; }
+ .popup__images {
+ width: 33.333333333%;
+ display: table-cell; }
+ @media only screen and (max-width: 75em) {
+ .popup__images {
+ display: none; } }
+ .popup__image {
+ display: block;
+ width: 100%; }
+ .popup__content {
+ width: 66.6666666666%;
+ vertical-align: middle;
+ text-align: center;
+ display: table-cell;
+ padding: 1rem 3em; }
+ .popup__text {
+ font-size: 1.4rem;
+ margin-bottom: 4rem;
+ text-align: left;
+ -moz-column-count: 2;
+ -moz-column-gap: 4rem;
+ -moz-column-rule: 1px solid #f7f7f7;
+ column-count: 2;
+ column-gap: 4rem;
+ column-rule: 1px solid #f7f7f7;
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto; }
+
+.story {
+ width: 75%;
+ margin: 0 auto;
+ box-shadow: 0 3rem 6rem rgba(0, 0, 0, 0.2);
+ background-color: rgba(255, 255, 255, 0.6);
+ border-radius: 0.3rem;
+ padding: 6rem;
+ padding-left: 9rem;
+ font-size: 1.6rem;
+ transform: skewX(-12deg); }
+ @media only screen and (max-width: 56.25em) {
+ .story {
+ width: 100%;
+ padding: 4rem;
+ padding-left: 0; } }
+ @media only screen and (max-width: 37.5em) {
+ .story {
+ transform: skewX(0); } }
+ .story__shape {
+ width: 15rem;
+ height: 15rem;
+ float: left;
+ position: relative;
+ overflow: hidden;
+ transform: translateX(-3rem) skewX(12deg);
+ border-radius: 50%; }
+ @supports (clip-path: polygon(0, 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .story__shape {
+ clip-path: circle(50% at 50% 50%);
+ -webkit-clip-path: circle(50% at 50% 50%);
+ -webkit-shape-outside: circle(50% at 50% 50%);
+ shape-outside: circle(50% at 50% 50%);
+ border-radius: none; } }
+ @media only screen and (max-width: 37.5em) {
+ .story__shape {
+ transform: translateX(-3rem) skewX(0); } }
+ .story__img {
+ height: 100%;
+ transform: translateX(-4rem) scale(1.4);
+ backface-visibility: hidden;
+ transition: all .5s; }
+ .story__text {
+ transform: skewX(12deg); }
+ @media only screen and (max-width: 37.5em) {
+ .story__text {
+ transform: skewX(0); } }
+ .story__caption {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ color: #fff;
+ text-transform: uppercase;
+ font-size: 1.7rem;
+ text-align: center;
+ opacity: 0;
+ transform: translate(-50%, 20%);
+ transition: all .5s;
+ backface-visibility: hidden; }
+ .story:hover .story__caption {
+ opacity: 1;
+ transform: translate(-50%, -50%); }
+ .story:hover .story__img {
+ opacity: 1;
+ transform: scale(1);
+ filter: blur(3px) brightness(80%); }
+
+.footer {
+ background-color: #333;
+ padding: 10rem 0;
+ font-size: 1.4rem;
+ color: #f7f7f7; }
+ @media only screen and (max-width: 56.25em) {
+ .footer {
+ padding: 10rem 2rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .footer {
+ padding: 8rem 0; } }
+ .footer__logo-box {
+ text-align: center;
+ margin-bottom: 8rem; }
+ .footer__logo {
+ width: 15rem; }
+ .footer__navigation {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block; }
+ @media only screen and (max-width: 56.25em) {
+ .footer__navigation {
+ width: 100%;
+ text-align: center; } }
+ .footer__list {
+ list-style: none;
+ padding: 0; }
+ .footer__list__item {
+ display: inline-block; }
+ .footer__list__item:not(:last-child) {
+ margin-right: 1.5rem; }
+ .footer__link:link, .footer__link:visited {
+ color: #f7f7f7;
+ text-decoration: none;
+ text-transform: uppercase;
+ display: inline-block;
+ transition: all .2s; }
+ .footer__link:hover, .footer__link:active {
+ color: #7ed56f;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.4);
+ transform: rotate(5deg) scale(1.3); }
+ .footer__copyright {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block;
+ width: 80%;
+ float: right; }
+ @media only screen and (max-width: 56.25em) {
+ .footer__copyright {
+ float: none;
+ width: 100%; } }
+
+.row {
+ max-width: 114rem;
+ margin: 0 auto; }
+ .row:not(:last-child) {
+ margin-bottom: 8rem; }
+ @media only screen and (max-width: 56.25em) {
+ .row:not(:last-child) {
+ margin-bottom: 6rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .row {
+ max-width: 50rem;
+ padding: 0 3rem; } }
+ .row:after {
+ content: "";
+ display: table;
+ clear: both; }
+ .row [class^="col-"] {
+ float: left; }
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 6rem; }
+ @media only screen and (max-width: 56.25em) {
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 0;
+ margin-bottom: 6rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .row [class^="col-"] {
+ width: 100% !important; } }
+ .row .col-1-of-2 {
+ width: calc((100% - 6rem) / 2); }
+ .row .col-1-of-3 {
+ width: calc((100% - 2 * 6rem) / 3); }
+ .row .col-2-of-3 {
+ width: calc(2 * ((100% - 2 * 6rem) / 3) + 6rem); }
+ .row .col-1-of-4 {
+ width: calc((100% - 3 * 6rem) / 4); }
+ .row .col-2-of-4 {
+ width: calc(2 * ((100% - 3 * 6rem) / 4) + 6rem); }
+ .row .col-3-of-4 {
+ width: calc(3 * ((100% - 3 * 6rem) / 4) + 2 * 6rem); }
+
+/* Header */
+.header {
+ height: 85vh;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero-small.jpg);
+ background-size: cover;
+ background-position: top;
+ position: relative; }
+ @supports (clip-path: polygon(0 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .header {
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ height: 95vh; } }
+ @media only screen and (min-resolution: 192dpi) and (min-width: 37.5em), only screen and (-webkit-min-device-pixel-ratio: 2) and (min-width: 37.5em), only screen and (min-width: 125em) {
+ .header {
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero.jpg); } }
+ .header__logo-box {
+ position: absolute;
+ top: 4rem;
+ left: 4rem; }
+ .header__logo {
+ height: 3.5rem; }
+ .header__main {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center; }
+
+.navigation__checkbox {
+ display: none; }
+
+.navigation__button {
+ background-color: #fff;
+ height: 7rem;
+ width: 7rem;
+ position: fixed;
+ top: 6rem;
+ right: 6rem;
+ border-radius: 50%;
+ z-index: 2000;
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.1);
+ text-align: center;
+ cursor: pointer; }
+ @media only screen and (max-width: 56.25em) {
+ .navigation__button {
+ top: 4rem;
+ right: 4rem; } }
+ @media only screen and (max-width: 37.5em) {
+ .navigation__button {
+ top: 3rem;
+ right: 3rem; } }
+
+.navigation__background {
+ height: 6rem;
+ width: 6rem;
+ border-radius: 50%;
+ position: fixed;
+ top: 6.5rem;
+ right: 6.5rem;
+ background-image: radial-gradient(#55c57a, #28b485);
+ z-index: 1000;
+ transition: transform 0.8s cubic-bezier(0.86, 0, 0.07, 1); }
+ @media only screen and (max-width: 56.25em) {
+ .navigation__background {
+ top: 4.5rem;
+ right: 4.5rem; } }
+
+.navigation__nav {
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 1500;
+ opacity: 0;
+ width: 0;
+ transition: all .8s; }
+
+.navigation__list {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ list-style: none;
+ text-align: center;
+ width: 100%; }
+
+.navigation__item {
+ margin: 1rem; }
+
+.navigation__link:link, .navigation__link:visited {
+ display: inline-block;
+ font-size: 3rem;
+ font-weight: 300;
+ padding: 1rem 2rem;
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ background-image: linear-gradient(120deg, transparent 0%, transparent 50%, #fff 50%);
+ background-size: 225%;
+ transition: all .4s; }
+ .navigation__link:link span, .navigation__link:visited span {
+ display: inline-block;
+ margin-right: 1.5rem; }
+
+.navigation__link:hover, .navigation__link a:active {
+ background-position: 100%;
+ color: #7ed56f;
+ transform: translateX(1rem); }
+
+.navigation__checkbox:checked ~ .navigation__background {
+ transform: scale(80); }
+
+.navigation__checkbox:checked ~ .navigation__nav {
+ opacity: 1;
+ width: 100%; }
+
+.navigation__icon {
+ position: relative;
+ margin-top: 3.5rem; }
+ .navigation__icon, .navigation__icon::before, .navigation__icon::after {
+ width: 3rem;
+ height: .2rem;
+ background-color: #777;
+ display: inline-block; }
+ .navigation__icon::before, .navigation__icon::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ transition: all .2s; }
+ .navigation__icon::before {
+ top: -.8rem; }
+ .navigation__icon::after {
+ top: .8rem; }
+
+.navigation__button:hover .navigation__icon::before {
+ top: -1rem; }
+
+.navigation__button:hover .navigation__icon::after {
+ top: 1rem; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon {
+ background-color: transparent; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::before {
+ top: 0;
+ transform: rotate(135deg); }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::after {
+ top: 0;
+ transform: rotate(-135deg); }
+
+.section-about {
+ background-color: #f7f7f7;
+ padding: 25rem 0;
+ margin-top: -20vh; }
+ @media only screen and (max-width: 56.25em) {
+ .section-about {
+ padding: 10rem 0; } }
+
+.section-features {
+ padding: 20rem 0;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/nat-4.jpg);
+ background-size: cover;
+ margin-top: -10rem;
+ transform: skewY(-7deg); }
+ .section-features > * {
+ transform: skewY(7deg); }
+ @media only screen and (max-width: 56.25em) {
+ .section-features {
+ padding: 10rem 0; } }
+
+.section-tours {
+ background-color: #f7f7f7;
+ padding: 25rem 0 15rem 0;
+ margin-top: -10rem; }
+ @media only screen and (max-width: 56.25em) {
+ .section-tours {
+ padding: 15rem 0; } }
+
+.section-stories {
+ position: relative;
+ padding: 15rem 0; }
+ @media only screen and (max-width: 56.25em) {
+ .section-stories {
+ padding: 10rem 0; } }
+
+.section-booking {
+ padding: 15rem 0;
+ background-image: linear-gradient(to right bottom, #55c57a, #28b485); }
+
+.book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 50%, transparent 50%), url(../img/nat-10.jpg);
+ background-size: 100%;
+ border-radius: 0.3rem;
+ box-shadow: 0 1.5rem 4rem black;
+ background-size: cover; }
+ @media only screen and (max-width: 75em) {
+ .book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 70%, transparent 70%), url(../img/nat-10.jpg);
+ background-size: cover; } }
+ @media only screen and (max-width: 56.25em) {
+ .book {
+ background-image: linear-gradient(to right, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 100%), url(../img/nat-10.jpg); } }
+ .book__form {
+ width: 50%;
+ padding: 6rem; }
+ @media only screen and (max-width: 75em) {
+ .book__form {
+ width: 90%; } }
diff --git a/css/style.css b/css/style.css
new file mode 100644
index 0000000..3951a6b
--- /dev/null
+++ b/css/style.css
@@ -0,0 +1,959 @@
+/* Media Query
+- phone
+- tab-port
+- tab-land
+- big-desk
+*/
+*,
+*::after,
+*::bofore {
+ margin: 0;
+ padding: 0;
+ box-sizing: inherit; }
+
+html {
+ font-size: 62.5%;
+ /* Set to 10 to make calculation easier. 10% as it's 62.5% pf default browser font-size 16px; */ }
+ @media only screen and (max-width: 75em) {
+ html {
+ font-size: 56.25%; } }
+ @media only screen and (max-width: 56.25em) {
+ html {
+ font-size: 50%; } }
+
+body {
+ box-sizing: border-box;
+ padding: 3rem; }
+ @media only screen and (max-width: 56.25em) {
+ body {
+ padding: 0;
+ margin: 0; } }
+
+::selection {
+ background-color: #7ed56f;
+ color: #fff; }
+
+.u-centre-text {
+ text-align: center !important; }
+
+.u-margin-bottom-small {
+ margin-bottom: 1.5rem !important; }
+
+.u-margin-bottom-medium {
+ margin-bottom: 4rem !important; }
+ @media only screen and (max-width: 56.25em) {
+ .u-margin-bottom-medium {
+ margin-bottom: 3rem !important; } }
+
+.u-margin-bottom-large {
+ margin-bottom: 8rem !important; }
+ @media only screen and (max-width: 56.25em) {
+ .u-margin-bottom-large {
+ margin-bottom: 5rem !important; } }
+
+.u-margin-top-large {
+ margin-top: 8rem !important; }
+
+@keyframes moveInLeft {
+ 0% {
+ opacity: 0;
+ transform: translateX(-10rem); }
+ 80% {
+ transform: translateX(2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInRight {
+ 0% {
+ opacity: 0;
+ transform: translateX(10rem); }
+ 80% {
+ transform: translateX(-2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInButton {
+ 0% {
+ opacity: 0;
+ transform: translateY(5rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+body {
+ font-family: "Lato", sans-serif;
+ font-weight: 400;
+ line-height: 1.7;
+ color: #777; }
+
+.paragraph {
+ font-size: 1.6rem; }
+ .paragraph:not(:last-child) {
+ margin-bottom: 3rem; }
+
+.bg-video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: -1;
+ opacity: .8;
+ overflow: hidden; }
+ .bg-video__content {
+ width: 100%;
+ height: 100%;
+ object-fit: cover; }
+
+.btn:hover {
+ transform: translateY(-0.3rem);
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.btn:active, .btn:focus {
+ outline: none;
+ transform: translateY(-0.1rem);
+ box-shadow: 0 0.5rem 21rem rgba(0, 0, 0, 0.2); }
+
+.btn, .btn:link, .btn:visited {
+ text-transform: uppercase;
+ text-decoration: none;
+ padding: 1.5rem 4rem;
+ display: inline-block;
+ border-radius: 10rem;
+ transition: all .2s;
+ position: relative;
+ font-size: 1.6rem;
+ border: none;
+ cursor: pointer; }
+
+.btn::after {
+ content: "";
+ display: inline-block;
+ height: 100%;
+ width: 100%;
+ border-radius: 10rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ transition: all .4s; }
+
+.btn--homepage-header {
+ animation: moveInButton .75s ease-out;
+ animation-fill-mode: backwards; }
+
+.btn--white {
+ background-color: #fff;
+ color: #777; }
+ .btn--white::after {
+ background-color: #fff; }
+ .btn--white:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn--green {
+ background-color: #7ed56f;
+ color: #fff; }
+ .btn--green::after {
+ background-color: #7ed56f; }
+ .btn--green:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn-text:link, .btn-text:visited {
+ color: #7ed56f;
+ display: inline-block;
+ border-bottom: 1px solid #7ed56f;
+ padding: .3rem;
+ font-size: 1.6rem;
+ transition: all .2s; }
+
+.btn-text:hover {
+ background-color: #7ed56f;
+ color: #fff;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.btn-text:active {
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.card {
+ perspective: 150rem;
+ -moz-perspective: 150rem;
+ position: relative;
+ height: 50rem; }
+ .card__side {
+ height: 50rem;
+ color: #fff;
+ font-size: 2rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transition: all .8s ease;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ border-radius: 0.3rem;
+ overflow: hidden;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side--front {
+ background-color: #fff; }
+ .card__side--back {
+ transform: rotateY(180deg); }
+ .card__side--back-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900); }
+ .card__side--back-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a); }
+ .card__side--back-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa); }
+ .card:hover .card__side--front {
+ transform: rotateY(-180deg); }
+ .card:hover .card__side--back {
+ transform: rotateY(0deg); }
+ .card__picture {
+ background-size: cover;
+ height: 23rem;
+ background-blend-mode: screen;
+ clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ border-top-left-radius: 0.3rem;
+ border-top-right-radius: 0.3rem; }
+ .card__picture-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900), url("/img/nat-5.jpg"); }
+ .card__picture-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a), url("/img/nat-6.jpg"); }
+ .card__picture-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa), url("/img/nat-7.jpg"); }
+ .card__heading {
+ color: #fff;
+ font-size: 2.8rem;
+ font-weight: 300;
+ text-transform: uppercase;
+ position: absolute;
+ text-align: right;
+ top: 12rem;
+ right: 2rem;
+ width: 65%; }
+ .card__heading-span {
+ padding: 1rem 1.5rem;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone; }
+ .card__heading-span-1 {
+ background-image: linear-gradient(to right bottom, rgba(255, 119, 48, 0.85), rgba(255, 185, 0, 0.85)); }
+ .card__heading-span-2 {
+ background-image: linear-gradient(to right bottom, rgba(126, 213, 111, 0.85), rgba(85, 197, 122, 0.85)); }
+ .card__heading-span-3 {
+ background-image: linear-gradient(to right bottom, rgba(41, 152, 255, 0.85), rgba(86, 67, 250, 0.85)); }
+ .card__details {
+ padding: 3rem; }
+ .card__details ul {
+ list-style: none;
+ width: 80%;
+ margin: 0 auto;
+ color: #777; }
+ .card__details ul li {
+ text-align: center;
+ font-size: 1.5rem;
+ padding: 1rem; }
+ .card__details ul li:not(:last-child) {
+ border-bottom: 1px #f7f7f7 solid; }
+ .card__cta {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ width: 70%;
+ text-align: center; }
+ .card__price-box {
+ color: #fff;
+ margin-bottom: 8rem; }
+ .card__price-only {
+ font-size: 1.4rem;
+ text-align: center;
+ text-transform: uppercase; }
+ .card__price-value {
+ font-size: 6rem;
+ font-weight: 100; }
+ @media only screen and (max-width: 56.25em), only screen and (hover: none) {
+ .card {
+ height: auto;
+ border-radius: 0.3rem;
+ background-color: #fff;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side {
+ height: auto;
+ position: relative;
+ box-shadow: none; }
+ .card__side--back {
+ transform: rotateY(0);
+ clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%); }
+ .card:hover .card__side--front {
+ transform: rotateY(0); }
+ .card__cta {
+ position: relative;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transform: translate(0);
+ padding-top: 7rem;
+ padding-bottom: 3rem; }
+ .card__price-box {
+ line-height: 0;
+ margin-bottom: 0; }
+ .card__price-value {
+ font-size: 4rem; }
+ .card__price-only {
+ margin: 0; } }
+
+.composition {
+ position: relative; }
+ .composition__photo {
+ width: 55%;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.4);
+ border-radius: 2px;
+ position: absolute;
+ z-index: 10;
+ transition: all .2s;
+ outline-offset: 2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo {
+ float: left;
+ position: relative;
+ width: 33.3333%;
+ box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.2);
+ transition: all .2; } }
+ .composition__photo--p1 {
+ left: 0;
+ top: -2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p1 {
+ top: 0rem;
+ transform: scale(1.2); } }
+ .composition__photo--p2 {
+ right: 0;
+ top: 2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p2 {
+ top: 0rem;
+ transform: scale(1.3);
+ z-index: 2000; } }
+ .composition__photo--p3 {
+ left: 20%;
+ top: 10rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p3 {
+ top: 0rem;
+ left: 0;
+ transform: scale(1.2); } }
+ .composition__photo:hover {
+ outline: 1.5rem solid #7ed56f;
+ transform: scale(1.05);
+ box-shadow: 0 2.5rem 4rem rgba(0, 0, 0, 0.5);
+ z-index: 20; }
+ .composition:hover .composition__photo:not(:hover) {
+ transform: scale(0.9); }
+
+.feature-box {
+ background-color: rgba(255, 255, 255, 0.8);
+ font-size: 1.5rem;
+ padding: 2.5rem;
+ text-align: center;
+ border-radius: 3px;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15);
+ transition: transform .3s; }
+ @media only screen and (max-width: 56.25em) {
+ .feature-box {
+ padding: 2rem; } }
+ .feature-box__icon {
+ font-size: 6rem;
+ margin-bottom: .5rem;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent; }
+ .feature-box:hover {
+ transform: translateY(-1.5rem); }
+
+.form__group:not(:last-child) {
+ margin-bottom: 2rem; }
+
+.form__input {
+ font-size: 1.5rem;
+ font-family: inherit;
+ color: inherit;
+ padding: 1.5rem 2rem;
+ border-radius: .2rem;
+ background-color: #fff;
+ border: none;
+ border-bottom: 0.3rem solid transparent;
+ width: 75%;
+ display: block;
+ transform: all .3s; }
+ .form__input:focus {
+ outline: none;
+ box-shadow: 0.1rem 2rem rgba(0, 0, 0, 0.1);
+ border-bottom: 3px solid #7ed56f; }
+ .form__input:focus:invalid {
+ border-bottom: 3px solid #ff7730; }
+ .form__input::-webkit-input-placeholder {
+ color: #999; }
+
+.form__label {
+ font-size: 1.2rem;
+ font-weight: 700;
+ margin-left: 2rem;
+ margin-top: .7rem;
+ display: block;
+ transition: all .3s; }
+
+.form__input:placeholder-shown + .form__label {
+ opacity: 0;
+ visibility: hidden;
+ transform: translateX(-4rem); }
+
+.form__radio-input {
+ display: none; }
+
+.form__radio-group {
+ width: 49%;
+ display: inline-block; }
+ @media only screen and (max-width: 75em) {
+ .form__radio-group {
+ width: 100%;
+ margin-bottom: 3rem; } }
+
+.form__radio-label {
+ font-size: 1.6rem;
+ cursor: pointer;
+ position: relative;
+ padding-left: 5rem; }
+
+.form__radio-button {
+ height: 3rem;
+ width: 3rem;
+ border: 5px solid #7ed56f;
+ display: inline-block;
+ position: absolute;
+ top: -.4rem;
+ left: 0;
+ border-radius: 50%; }
+ .form__radio-button::after {
+ content: "";
+ height: 1rem;
+ width: 1rem;
+ border-radius: 50%;
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #7ed56f;
+ opacity: 0;
+ transition: all .2s; }
+
+.form__radio-input:checked ~ .form__radio-label .form__radio-button::after {
+ opacity: 1; }
+
+/* Header Title */
+.heading-primary {
+ color: #fff;
+ text-transform: uppercase;
+ /* Makes animation smoother */
+ backface-visibility: hidden;
+ margin-bottom: 6rem; }
+ .heading-primary--main {
+ display: block;
+ font-size: 6rem;
+ font-weight: 400;
+ letter-spacing: 3.5rem;
+ animation-name: moveInLeft;
+ animation-duration: 1s;
+ /* animation-delay: 3s; */
+ /* animation-iteration-count: 3; */
+ animation-timing-function: ease-in; }
+ @media only screen and (max-width: 37.5em) {
+ .heading-primary--main {
+ letter-spacing: 1rem;
+ font-size: 5rem; } }
+ .heading-primary--secondry {
+ display: block;
+ font-size: 2rem;
+ font-weight: 700;
+ letter-spacing: 1.7rem;
+ animation: moveInRight 1s ease-in; }
+ @media only screen and (max-width: 37.5em) {
+ .heading-primary--secondry {
+ letter-spacing: .5rem; } }
+
+.heading-secondary {
+ font-size: 3.5rem;
+ text-transform: uppercase;
+ font-weight: 700;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ letter-spacing: .2rem;
+ transform: all .2s; }
+ @media only screen and (max-width: 56.25em) {
+ .heading-secondary {
+ font-size: 3rem; } }
+ @media only screen and (max-width: 37.5em) {
+ .heading-secondary {
+ font-size: 2.5rem; } }
+ .heading-secondary:hover {
+ transform: skewY(2deg) scale(1.1);
+ text-shadow: 0.5rem 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.heading-tertiary {
+ font-size: 1.6rem;
+ font-weight: 700;
+ text-transform: uppercase; }
+
+.popup {
+ background-color: rgba(0, 0, 0, 0.8);
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 3000;
+ opacity: 0;
+ visibility: hidden;
+ transition: all .3s; }
+ @supports (-webkit-backdrop-filter: blur(10px)) or (backdrop-filter: blur(10px)) {
+ .popup {
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px); } }
+ .popup:target {
+ visibility: visible;
+ opacity: 1; }
+ .popup:target .popup__modal {
+ opacity: 1;
+ transform: translate(-50%, -50%) scale(1); }
+ .popup__close:link, .popup__close:visited {
+ color: #777;
+ position: absolute;
+ right: 2.5rem;
+ font-size: 3rem;
+ text-decoration: none;
+ display: inline-block;
+ transform: all .2s;
+ line-height: 1; }
+ .popup__close :hover {
+ color: #999; }
+ .popup__modal {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #fff;
+ width: 75%;
+ box-shadow: 0 2rem 4rem rgba(0, 0, 0, 0.2);
+ display: table;
+ overflow: hidden;
+ border-radius: .3rem;
+ opacity: 0;
+ transform: translate(-50%, -50%) scale(0.5);
+ transition: all .2s .2s; }
+ .popup__images {
+ width: 33.333333333%;
+ display: table-cell; }
+ @media only screen and (max-width: 75em) {
+ .popup__images {
+ display: none; } }
+ .popup__image {
+ display: block;
+ width: 100%; }
+ .popup__content {
+ width: 66.6666666666%;
+ vertical-align: middle;
+ text-align: center;
+ display: table-cell;
+ padding: 1rem 3em; }
+ .popup__text {
+ font-size: 1.4rem;
+ margin-bottom: 4rem;
+ text-align: left;
+ -moz-column-count: 2;
+ -moz-column-gap: 4rem;
+ -moz-column-rule: 1px solid #f7f7f7;
+ column-count: 2;
+ column-gap: 4rem;
+ column-rule: 1px solid #f7f7f7;
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto; }
+
+.story {
+ width: 75%;
+ margin: 0 auto;
+ box-shadow: 0 3rem 6rem rgba(0, 0, 0, 0.2);
+ background-color: rgba(255, 255, 255, 0.6);
+ border-radius: 0.3rem;
+ padding: 6rem;
+ padding-left: 9rem;
+ font-size: 1.6rem;
+ transform: skewX(-12deg); }
+ @media only screen and (max-width: 56.25em) {
+ .story {
+ width: 100%;
+ padding: 4rem;
+ padding-left: 0; } }
+ @media only screen and (max-width: 37.5em) {
+ .story {
+ transform: skewX(0); } }
+ .story__shape {
+ width: 15rem;
+ height: 15rem;
+ float: left;
+ position: relative;
+ overflow: hidden;
+ transform: translateX(-3rem) skewX(12deg);
+ border-radius: 50%; }
+ @supports (clip-path: polygon(0, 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .story__shape {
+ clip-path: circle(50% at 50% 50%);
+ -webkit-clip-path: circle(50% at 50% 50%);
+ -webkit-shape-outside: circle(50% at 50% 50%);
+ shape-outside: circle(50% at 50% 50%);
+ border-radius: none; } }
+ @media only screen and (max-width: 37.5em) {
+ .story__shape {
+ transform: translateX(-3rem) skewX(0); } }
+ .story__img {
+ height: 100%;
+ transform: translateX(-4rem) scale(1.4);
+ backface-visibility: hidden;
+ transition: all .5s; }
+ .story__text {
+ transform: skewX(12deg); }
+ @media only screen and (max-width: 37.5em) {
+ .story__text {
+ transform: skewX(0); } }
+ .story__caption {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ color: #fff;
+ text-transform: uppercase;
+ font-size: 1.7rem;
+ text-align: center;
+ opacity: 0;
+ transform: translate(-50%, 20%);
+ transition: all .5s;
+ backface-visibility: hidden; }
+ .story:hover .story__caption {
+ opacity: 1;
+ transform: translate(-50%, -50%); }
+ .story:hover .story__img {
+ opacity: 1;
+ transform: scale(1);
+ filter: blur(3px) brightness(80%); }
+
+.footer {
+ background-color: #333;
+ padding: 10rem 0;
+ font-size: 1.4rem;
+ color: #f7f7f7; }
+ @media only screen and (max-width: 56.25em) {
+ .footer {
+ padding: 10rem 2rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .footer {
+ padding: 8rem 0; } }
+ .footer__logo-box {
+ text-align: center;
+ margin-bottom: 8rem; }
+ .footer__logo {
+ width: 15rem; }
+ .footer__navigation {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block; }
+ @media only screen and (max-width: 56.25em) {
+ .footer__navigation {
+ width: 100%;
+ text-align: center; } }
+ .footer__list {
+ list-style: none;
+ padding: 0; }
+ .footer__list__item {
+ display: inline-block; }
+ .footer__list__item:not(:last-child) {
+ margin-right: 1.5rem; }
+ .footer__link:link, .footer__link:visited {
+ color: #f7f7f7;
+ text-decoration: none;
+ text-transform: uppercase;
+ display: inline-block;
+ transition: all .2s; }
+ .footer__link:hover, .footer__link:active {
+ color: #7ed56f;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.4);
+ transform: rotate(5deg) scale(1.3); }
+ .footer__copyright {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block;
+ width: 80%;
+ float: right; }
+ @media only screen and (max-width: 56.25em) {
+ .footer__copyright {
+ float: none;
+ width: 100%; } }
+
+.row {
+ max-width: 114rem;
+ margin: 0 auto; }
+ .row:not(:last-child) {
+ margin-bottom: 8rem; }
+ @media only screen and (max-width: 56.25em) {
+ .row:not(:last-child) {
+ margin-bottom: 6rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .row {
+ max-width: 50rem;
+ padding: 0 3rem; } }
+ .row:after {
+ content: "";
+ display: table;
+ clear: both; }
+ .row [class^="col-"] {
+ float: left; }
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 6rem; }
+ @media only screen and (max-width: 56.25em) {
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 0;
+ margin-bottom: 6rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .row [class^="col-"] {
+ width: 100% !important; } }
+ .row .col-1-of-2 {
+ width: calc((100% - 6rem) / 2); }
+ .row .col-1-of-3 {
+ width: calc((100% - 2 * 6rem) / 3); }
+ .row .col-2-of-3 {
+ width: calc(2 * ((100% - 2 * 6rem) / 3) + 6rem); }
+ .row .col-1-of-4 {
+ width: calc((100% - 3 * 6rem) / 4); }
+ .row .col-2-of-4 {
+ width: calc(2 * ((100% - 3 * 6rem) / 4) + 6rem); }
+ .row .col-3-of-4 {
+ width: calc(3 * ((100% - 3 * 6rem) / 4) + 2 * 6rem); }
+
+/* Header */
+.header {
+ height: 85vh;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero-small.jpg);
+ background-size: cover;
+ background-position: top;
+ position: relative; }
+ @supports (clip-path: polygon(0 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .header {
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ height: 95vh; } }
+ @media only screen and (min-resolution: 192dpi) and (min-width: 37.5em), only screen and (-webkit-min-device-pixel-ratio: 2) and (min-width: 37.5em), only screen and (min-width: 125em) {
+ .header {
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero.jpg); } }
+ .header__logo-box {
+ position: absolute;
+ top: 4rem;
+ left: 4rem; }
+ .header__logo {
+ height: 3.5rem; }
+ .header__main {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center; }
+
+.navigation__checkbox {
+ display: none; }
+
+.navigation__button {
+ background-color: #fff;
+ height: 7rem;
+ width: 7rem;
+ position: fixed;
+ top: 6rem;
+ right: 6rem;
+ border-radius: 50%;
+ z-index: 2000;
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.1);
+ text-align: center;
+ cursor: pointer; }
+ @media only screen and (max-width: 56.25em) {
+ .navigation__button {
+ top: 4rem;
+ right: 4rem; } }
+ @media only screen and (max-width: 37.5em) {
+ .navigation__button {
+ top: 3rem;
+ right: 3rem; } }
+
+.navigation__background {
+ height: 6rem;
+ width: 6rem;
+ border-radius: 50%;
+ position: fixed;
+ top: 6.5rem;
+ right: 6.5rem;
+ background-image: radial-gradient(#55c57a, #28b485);
+ z-index: 1000;
+ transition: transform 0.8s cubic-bezier(0.86, 0, 0.07, 1); }
+ @media only screen and (max-width: 56.25em) {
+ .navigation__background {
+ top: 4.5rem;
+ right: 4.5rem; } }
+
+.navigation__nav {
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 1500;
+ opacity: 0;
+ width: 0;
+ transition: all .8s; }
+
+.navigation__list {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ list-style: none;
+ text-align: center;
+ width: 100%; }
+
+.navigation__item {
+ margin: 1rem; }
+
+.navigation__link:link, .navigation__link:visited {
+ display: inline-block;
+ font-size: 3rem;
+ font-weight: 300;
+ padding: 1rem 2rem;
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ background-image: linear-gradient(120deg, transparent 0%, transparent 50%, #fff 50%);
+ background-size: 225%;
+ transition: all .4s; }
+ .navigation__link:link span, .navigation__link:visited span {
+ display: inline-block;
+ margin-right: 1.5rem; }
+
+.navigation__link:hover, .navigation__link a:active {
+ background-position: 100%;
+ color: #7ed56f;
+ transform: translateX(1rem); }
+
+.navigation__checkbox:checked ~ .navigation__background {
+ transform: scale(80); }
+
+.navigation__checkbox:checked ~ .navigation__nav {
+ opacity: 1;
+ width: 100%; }
+
+.navigation__icon {
+ position: relative;
+ margin-top: 3.5rem; }
+ .navigation__icon, .navigation__icon::before, .navigation__icon::after {
+ width: 3rem;
+ height: .2rem;
+ background-color: #777;
+ display: inline-block; }
+ .navigation__icon::before, .navigation__icon::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ transition: all .2s; }
+ .navigation__icon::before {
+ top: -.8rem; }
+ .navigation__icon::after {
+ top: .8rem; }
+
+.navigation__button:hover .navigation__icon::before {
+ top: -1rem; }
+
+.navigation__button:hover .navigation__icon::after {
+ top: 1rem; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon {
+ background-color: transparent; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::before {
+ top: 0;
+ transform: rotate(135deg); }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::after {
+ top: 0;
+ transform: rotate(-135deg); }
+
+.section-about {
+ background-color: #f7f7f7;
+ padding: 25rem 0;
+ margin-top: -20vh; }
+ @media only screen and (max-width: 56.25em) {
+ .section-about {
+ padding: 10rem 0; } }
+
+.section-features {
+ padding: 20rem 0;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/nat-4.jpg);
+ background-size: cover;
+ margin-top: -10rem;
+ transform: skewY(-7deg); }
+ .section-features > * {
+ transform: skewY(7deg); }
+ @media only screen and (max-width: 56.25em) {
+ .section-features {
+ padding: 10rem 0; } }
+
+.section-tours {
+ background-color: #f7f7f7;
+ padding: 25rem 0 15rem 0;
+ margin-top: -10rem; }
+ @media only screen and (max-width: 56.25em) {
+ .section-tours {
+ padding: 15rem 0; } }
+
+.section-stories {
+ position: relative;
+ padding: 15rem 0; }
+ @media only screen and (max-width: 56.25em) {
+ .section-stories {
+ padding: 10rem 0; } }
+
+.section-booking {
+ padding: 15rem 0;
+ background-image: linear-gradient(to right bottom, #55c57a, #28b485); }
+
+.book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 50%, transparent 50%), url(../img/nat-10.jpg);
+ background-size: 100%;
+ border-radius: 0.3rem;
+ box-shadow: 0 1.5rem 4rem black;
+ background-size: cover; }
+ @media only screen and (max-width: 75em) {
+ .book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 70%, transparent 70%), url(../img/nat-10.jpg);
+ background-size: cover; } }
+ @media only screen and (max-width: 56.25em) {
+ .book {
+ background-image: linear-gradient(to right, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 100%), url(../img/nat-10.jpg); } }
+ .book__form {
+ width: 50%;
+ padding: 6rem; }
+ @media only screen and (max-width: 75em) {
+ .book__form {
+ width: 90%; } }
diff --git a/css/style.min.css b/css/style.min.css
new file mode 100644
index 0000000..a7613e2
--- /dev/null
+++ b/css/style.min.css
@@ -0,0 +1,959 @@
+/* Media Query
+- phone
+- tab-port
+- tab-land
+- big-desk
+*/
+*,
+*::after,
+*::bofore {
+ margin: 0;
+ padding: 0;
+ box-sizing: inherit; }
+
+html {
+ font-size: 62.5%;
+ /* Set to 10 to make calculation easier. 10% as it's 62.5% pf default browser font-size 16px; */ }
+ @media (max-width: 75em) {
+ html {
+ font-size: 56.25%; } }
+ @media (max-width: 56.25em) {
+ html {
+ font-size: 50%; } }
+
+body {
+ box-sizing: border-box;
+ padding: 3rem; }
+ @media (max-width: 56.25em) {
+ body {
+ padding: 0;
+ margin: 0; } }
+
+.u-centre-text {
+ text-align: center !important; }
+
+.u-margin-bottom-small {
+ margin-bottom: 1.5rem !important; }
+
+.u-margin-bottom-medium {
+ margin-bottom: 4rem !important; }
+ @media (max-width: 56.25em) {
+ .u-margin-bottom-medium {
+ margin-bottom: 3rem !important; } }
+
+.u-margin-bottom-large {
+ margin-bottom: 8rem !important; }
+ @media (max-width: 56.25em) {
+ .u-margin-bottom-large {
+ margin-bottom: 5rem !important; } }
+
+.u-margin-top-large {
+ margin-top: 8rem !important; }
+
+@keyframes moveInLeft {
+ 0% {
+ opacity: 0;
+ transform: translateX(-10rem); }
+ 80% {
+ transform: translateX(2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInRight {
+ 0% {
+ opacity: 0;
+ transform: translateX(10rem); }
+ 80% {
+ transform: translateX(-2rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+@keyframes moveInButton {
+ 0% {
+ opacity: 0;
+ transform: translateY(5rem); }
+ 100% {
+ opacity: 1;
+ transform: translateX(0); } }
+
+body {
+ font-family: "Lato", sans-serif;
+ font-weight: 400;
+ line-height: 1.7;
+ color: #777; }
+
+.paragraph {
+ font-size: 1.6rem; }
+ .paragraph:not(:last-child) {
+ margin-bottom: 3rem; }
+
+.bg-video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: -1;
+ opacity: .8;
+ overflow: hidden; }
+ .bg-video__content {
+ width: 100%;
+ height: 100%;
+ object-fit: cover; }
+
+.btn:hover {
+ transform: translateY(-0.3rem);
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.btn:active, .btn:focus {
+ outline: none;
+ transform: translateY(-0.1rem);
+ box-shadow: 0 0.5rem 21rem rgba(0, 0, 0, 0.2); }
+
+.btn, .btn:link, .btn:visited {
+ text-transform: uppercase;
+ text-decoration: none;
+ padding: 1.5rem 4rem;
+ display: inline-block;
+ border-radius: 10rem;
+ transition: all .2s;
+ position: relative;
+ font-size: 1.6rem;
+ border: none;
+ cursor: pointer; }
+
+.btn::after {
+ content: "";
+ display: inline-block;
+ height: 100%;
+ width: 100%;
+ border-radius: 10rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ transition: all .4s; }
+
+.btn--homepage-header {
+ animation: moveInButton .75s ease-out;
+ animation-fill-mode: backwards; }
+
+.btn--white {
+ background-color: #fff;
+ color: #777; }
+ .btn--white::after {
+ background-color: #fff; }
+ .btn--white:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn--green {
+ background-color: #7ed56f;
+ color: #fff; }
+ .btn--green::after {
+ background-color: #7ed56f; }
+ .btn--green:hover::after {
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn-text:link, .btn-text:visited {
+ color: #7ed56f;
+ display: inline-block;
+ border-bottom: 1px solid #7ed56f;
+ padding: .3rem;
+ font-size: 1.6rem;
+ transition: all .2s; }
+
+.btn-text:hover {
+ background-color: #7ed56f;
+ color: #fff;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.btn-text:active {
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ transform: translateY(-2px); }
+
+.card {
+ perspective: 150rem;
+ -moz-perspective: 150rem;
+ position: relative;
+ height: 50rem; }
+ .card__side {
+ height: 50rem;
+ color: #fff;
+ font-size: 2rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transition: all .8s ease;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ border-radius: 0.3rem;
+ overflow: hidden;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side--front {
+ background-color: #fff; }
+ .card__side--back {
+ transform: rotateY(180deg); }
+ .card__side--back-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900); }
+ .card__side--back-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a); }
+ .card__side--back-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa); }
+ .card:hover .card__side--front {
+ transform: rotateY(-180deg); }
+ .card:hover .card__side--back {
+ transform: rotateY(0deg); }
+ .card__picture {
+ background-size: cover;
+ height: 23rem;
+ background-blend-mode: screen;
+ clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ border-top-left-radius: 0.3rem;
+ border-top-right-radius: 0.3rem; }
+ .card__picture-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900), url("/img/nat-5.jpg"); }
+ .card__picture-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a), url("/img/nat-6.jpg"); }
+ .card__picture-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa), url("/img/nat-7.jpg"); }
+ .card__heading {
+ color: #fff;
+ font-size: 2.8rem;
+ font-weight: 300;
+ text-transform: uppercase;
+ position: absolute;
+ text-align: right;
+ top: 12rem;
+ right: 2rem;
+ width: 65%; }
+ .card__heading-span {
+ padding: 1rem 1.5rem;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone; }
+ .card__heading-span-1 {
+ background-image: linear-gradient(to right bottom, rgba(255, 119, 48, 0.85), rgba(255, 185, 0, 0.85)); }
+ .card__heading-span-2 {
+ background-image: linear-gradient(to right bottom, rgba(126, 213, 111, 0.85), rgba(85, 197, 122, 0.85)); }
+ .card__heading-span-3 {
+ background-image: linear-gradient(to right bottom, rgba(41, 152, 255, 0.85), rgba(86, 67, 250, 0.85)); }
+ .card__details {
+ padding: 3rem; }
+ .card__details ul {
+ list-style: none;
+ width: 80%;
+ margin: 0 auto;
+ color: #777; }
+ .card__details ul li {
+ text-align: center;
+ font-size: 1.5rem;
+ padding: 1rem; }
+ .card__details ul li:not(:last-child) {
+ border-bottom: 1px #f7f7f7 solid; }
+ .card__cta {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ width: 70%;
+ text-align: center; }
+ .card__price-box {
+ color: #fff;
+ margin-bottom: 8rem; }
+ .card__price-only {
+ font-size: 1.4rem;
+ text-align: center;
+ text-transform: uppercase; }
+ .card__price-value {
+ font-size: 6rem;
+ font-weight: 100; }
+ @media (max-width: 56.25em) {
+ .card {
+ height: auto;
+ border-radius: 0.3rem;
+ background-color: #fff;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side {
+ height: auto;
+ position: relative;
+ box-shadow: none; }
+ .card__side--back {
+ transform: rotateY(0);
+ clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%); }
+ .card:hover .card__side--front {
+ transform: rotateY(0); }
+ .card__cta {
+ position: relative;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transform: translate(0);
+ padding-top: 7rem;
+ padding-bottom: 3rem; }
+ .card__price-box {
+ line-height: 0;
+ margin-bottom: 0; }
+ .card__price-value {
+ font-size: 4rem; }
+ .card__price-only {
+ margin: 0; } }
+
+.composition {
+ position: relative; }
+ .composition__photo {
+ width: 55%;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.4);
+ border-radius: 2px;
+ position: absolute;
+ z-index: 10;
+ transition: all .2s;
+ outline-offset: 2rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo {
+ float: left;
+ position: relative;
+ width: 33.3333%;
+ box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.2);
+ transition: all .2; } }
+ .composition__photo--p1 {
+ left: 0;
+ top: -2rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo--p1 {
+ top: 0rem;
+ transform: scale(1.2); } }
+ .composition__photo--p2 {
+ right: 0;
+ top: 2rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo--p2 {
+ top: 0rem;
+ transform: scale(1.3);
+ z-index: 2000; } }
+ .composition__photo--p3 {
+ left: 20%;
+ top: 10rem; }
+ @media (max-width: 56.25em) {
+ .composition__photo--p3 {
+ top: 0rem;
+ left: 0;
+ transform: scale(1.2); } }
+ .composition__photo:hover {
+ outline: 1.5rem solid #7ed56f;
+ transform: scale(1.05);
+ box-shadow: 0 2.5rem 4rem rgba(0, 0, 0, 0.5);
+ z-index: 20; }
+ .composition:hover .composition__photo:not(:hover) {
+ transform: scale(0.9); }
+
+.feature-box {
+ background-color: rgba(255, 255, 255, 0.8);
+ font-size: 1.5rem;
+ padding: 2.5rem;
+ text-align: center;
+ border-radius: 3px;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15);
+ transition: transform .3s; }
+ @media (max-width: 56.25em) {
+ .feature-box {
+ padding: 2rem; } }
+ .feature-box__icon {
+ font-size: 6rem;
+ margin-bottom: .5rem;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent; }
+ .feature-box:hover {
+ transform: translateY(-1.5rem); }
+
+.form__group:not(:last-child) {
+ margin-bottom: 2rem; }
+
+.form__input {
+ font-size: 1.5rem;
+ font-family: inherit;
+ color: inherit;
+ padding: 1.5rem 2rem;
+ border-radius: .2rem;
+ background-color: #fff;
+ border: none;
+ border-bottom: 0.3rem solid transparent;
+ width: 75%;
+ display: block;
+ transform: all .3s; }
+ .form__input:focus {
+ outline: none;
+ box-shadow: 0.1rem 2rem rgba(0, 0, 0, 0.1);
+ border-bottom: 3px solid #7ed56f; }
+ .form__input:focus:invalid {
+ border-bottom: 3px solid #ff7730; }
+ .form__input::-webkit-input-placeholder {
+ color: #999; }
+
+.form__label {
+ font-size: 1.2rem;
+ font-weight: 700;
+ margin-left: 2rem;
+ margin-top: .7rem;
+ display: block;
+ transition: all .3s; }
+
+.form__input:placeholder-shown + .form__label {
+ opacity: 0;
+ visibility: hidden;
+ transform: translateX(-4rem); }
+
+.form__radio-input {
+ display: none; }
+
+.form__radio-group {
+ width: 49%;
+ display: inline-block; }
+ @media (max-width: 75em) {
+ .form__radio-group {
+ width: 100%;
+ margin-bottom: 3rem; } }
+
+.form__radio-label {
+ font-size: 1.6rem;
+ cursor: pointer;
+ position: relative;
+ padding-left: 5rem; }
+
+.form__radio-button {
+ height: 3rem;
+ width: 3rem;
+ border: 5px solid #7ed56f;
+ display: inline-block;
+ position: absolute;
+ top: -.4rem;
+ left: 0;
+ border-radius: 50%; }
+ .form__radio-button::after {
+ content: "";
+ height: 1rem;
+ width: 1rem;
+ border-radius: 50%;
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #7ed56f;
+ opacity: 0;
+ transition: all .2s; }
+
+.form__radio-input:checked ~ .form__radio-label .form__radio-button::after {
+ opacity: 1; }
+
+/* Header Title */
+.heading-primary {
+ color: #fff;
+ text-transform: uppercase;
+ /* Makes animation smoother */
+ backface-visibility: hidden;
+ margin-bottom: 6rem; }
+ .heading-primary--main {
+ display: block;
+ font-size: 6rem;
+ font-weight: 400;
+ letter-spacing: 3.5rem;
+ animation-name: moveInLeft;
+ animation-duration: 1s;
+ /* animation-delay: 3s; */
+ /* animation-iteration-count: 3; */
+ animation-timing-function: ease-in; }
+ @media (max-width: 37.5em) {
+ .heading-primary--main {
+ letter-spacing: 1rem;
+ font-size: 5rem; } }
+ .heading-primary--secondry {
+ display: block;
+ font-size: 2rem;
+ font-weight: 700;
+ letter-spacing: 1.7rem;
+ animation: moveInRight 1s ease-in; }
+ @media (max-width: 37.5em) {
+ .heading-primary--secondry {
+ letter-spacing: .5rem; } }
+
+.heading-secondary {
+ font-size: 3.5rem;
+ text-transform: uppercase;
+ font-weight: 700;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ letter-spacing: .2rem;
+ transform: all .2s; }
+ @media (max-width: 56.25em) {
+ .heading-secondary {
+ font-size: 3rem; } }
+ @media (max-width: 37.5em) {
+ .heading-secondary {
+ font-size: 2.5rem; } }
+ .heading-secondary:hover {
+ transform: skewY(2deg) scale(1.1);
+ text-shadow: 0.5rem 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.heading-tertiary {
+ font-size: 1.6rem;
+ font-weight: 700;
+ text-transform: uppercase; }
+
+.popup {
+ background-color: rgba(0, 0, 0, 0.8);
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 3000;
+ opacity: 0;
+ visibility: hidden;
+ transition: all .3s; }
+ @supports (-webkit-backdrop-filter: blur(10px)) or (backdrop-filter: blur(10px)) {
+ .popup {
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px); } }
+ .popup:target {
+ visibility: visible;
+ opacity: 1; }
+ .popup:target .popup__modal {
+ opacity: 1;
+ transform: translate(-50%, -50%) scale(1); }
+ .popup__close:link, .popup__close:visited {
+ color: #777;
+ position: absolute;
+ right: 2.5rem;
+ font-size: 3rem;
+ text-decoration: none;
+ display: inline-block;
+ transform: all .2s;
+ line-height: 1; }
+ .popup__close :hover {
+ color: #999; }
+ .popup__modal {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ background-color: #fff;
+ width: 75%;
+ box-shadow: 0 2rem 4rem rgba(0, 0, 0, 0.2);
+ display: table;
+ overflow: hidden;
+ border-radius: .3rem;
+ opacity: 0;
+ transform: translate(-50%, -50%) scale(0.5);
+ transition: all .2s .2s; }
+ .popup__images {
+ width: 33.333333333%;
+ display: table-cell; }
+ @media (max-width: 75em) {
+ .popup__images {
+ display: none; } }
+ .popup__image {
+ display: block;
+ width: 100%; }
+ .popup__content {
+ width: 66.6666666666%;
+ vertical-align: middle;
+ text-align: center;
+ display: table-cell;
+ padding: 1rem 3em; }
+ .popup__text {
+ font-size: 1.4rem;
+ margin-bottom: 4rem;
+ text-align: left;
+ -moz-column-count: 2;
+ -moz-column-gap: 4rem;
+ -moz-column-rule: 1px solid #f7f7f7;
+ column-count: 2;
+ column-gap: 4rem;
+ column-rule: 1px solid #f7f7f7;
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto; }
+
+.story {
+ width: 75%;
+ margin: 0 auto;
+ box-shadow: 0 3rem 6rem rgba(0, 0, 0, 0.2);
+ background-color: rgba(255, 255, 255, 0.6);
+ border-radius: 0.3rem;
+ padding: 6rem;
+ padding-left: 9rem;
+ font-size: 1.6rem;
+ transform: skewX(-12deg); }
+ @media (max-width: 56.25em) {
+ .story {
+ width: 100%;
+ padding: 4rem;
+ padding-left: 0; } }
+ @media (max-width: 37.5em) {
+ .story {
+ transform: skewX(0); } }
+ .story__shape {
+ width: 15rem;
+ height: 15rem;
+ float: left;
+ position: relative;
+ overflow: hidden;
+ transform: translateX(-3rem) skewX(12deg);
+ border-radius: 50%; }
+ @supports (clip-path: polygon(0, 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .story__shape {
+ clip-path: circle(50% at 50% 50%);
+ -webkit-clip-path: circle(50% at 50% 50%);
+ -webkit-shape-outside: circle(50% at 50% 50%);
+ shape-outside: circle(50% at 50% 50%);
+ border-radius: none; } }
+ @media (max-width: 37.5em) {
+ .story__shape {
+ transform: translateX(-3rem) skewX(0); } }
+ .story__img {
+ height: 100%;
+ transform: translateX(-4rem) scale(1.4);
+ backface-visibility: hidden;
+ transition: all .5s; }
+ .story__text {
+ transform: skewX(12deg); }
+ @media (max-width: 37.5em) {
+ .story__text {
+ transform: skewX(0); } }
+ .story__caption {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ color: #fff;
+ text-transform: uppercase;
+ font-size: 1.7rem;
+ text-align: center;
+ opacity: 0;
+ transform: translate(-50%, 20%);
+ transition: all .5s;
+ backface-visibility: hidden; }
+ .story:hover .story__caption {
+ opacity: 1;
+ transform: translate(-50%, -50%); }
+ .story:hover .story__img {
+ opacity: 1;
+ transform: scale(1);
+ filter: blur(3px) brightness(80%); }
+
+.footer {
+ background-color: #333;
+ padding: 10rem 0;
+ font-size: 1.4rem;
+ color: #f7f7f7; }
+ @media (max-width: 56.25em) {
+ .footer {
+ padding: 10rem 2rem; } }
+ @media (max-width: 56.25em) {
+ .footer {
+ padding: 8rem 0; } }
+ .footer__logo-box {
+ text-align: center;
+ margin-bottom: 8rem; }
+ .footer__logo {
+ width: 15rem; }
+ .footer__navigation {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block; }
+ @media (max-width: 56.25em) {
+ .footer__navigation {
+ width: 100%;
+ text-align: center; } }
+ .footer__list {
+ list-style: none;
+ padding: 0; }
+ .footer__list__item {
+ display: inline-block; }
+ .footer__list__item:not(:last-child) {
+ margin-right: 1.5rem; }
+ .footer__link:link, .footer__link:visited {
+ color: #f7f7f7;
+ text-decoration: none;
+ text-transform: uppercase;
+ display: inline-block;
+ transition: all .2s; }
+ .footer__link:hover, .footer__link:active {
+ color: #7ed56f;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.4);
+ transform: rotate(5deg) scale(1.3); }
+ .footer__copyright {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block;
+ width: 80%;
+ float: right; }
+ @media (max-width: 56.25em) {
+ .footer__copyright {
+ float: none;
+ width: 100%; } }
+
+.row {
+ max-width: 114rem;
+ margin: 0 auto; }
+ .row:not(:last-child) {
+ margin-bottom: 8rem; }
+ @media (max-width: 56.25em) {
+ .row:not(:last-child) {
+ margin-bottom: 6rem; } }
+ @media (max-width: 56.25em) {
+ .row {
+ max-width: 50rem;
+ padding: 0 3rem; } }
+ .row:after {
+ content: "";
+ display: table;
+ clear: both; }
+ .row [class^="col-"] {
+ float: left; }
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 6rem; }
+ @media (max-width: 56.25em) {
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 0;
+ margin-bottom: 6rem; } }
+ @media (max-width: 56.25em) {
+ .row [class^="col-"] {
+ width: 100% !important; } }
+ .row .col-1-of-2 {
+ width: calc((100% - 6rem) / 2); }
+ .row .col-1-of-3 {
+ width: calc((100% - 2 * 6rem) / 3); }
+ .row .col-2-of-3 {
+ width: calc(2 * ((100% - 2 * 6rem) / 3) + 6rem); }
+ .row .col-1-of-4 {
+ width: calc((100% - 3 * 6rem) / 4); }
+ .row .col-2-of-4 {
+ width: calc(2 * ((100% - 3 * 6rem) / 4) + 6rem); }
+ .row .col-3-of-4 {
+ width: calc(3 * ((100% - 3 * 6rem) / 4) + 2 * 6rem); }
+
+/* Header */
+.header {
+ height: 85vh;
+ background-image: linear-gradient(to right, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero-small.jpg);
+ background-size: cover;
+ background-position: top;
+ position: relative; }
+ @supports (clip-path: polygon(0, 0)) or (-webkit-clip-path: polygon(0 0)) {
+ .header {
+ clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ height: 95vh; } }
+ @media (min-resolution: 192dpi) and (min-width: 37.5em), (-webkit-min-device-pixel-ratio: 2) and (min-width: 37.5em), (min-width: 125em) {
+ .header {
+ background-image: linear-gradient(to right, rgba(85, 197, 122, 0.8), rgba(0, 0, 0, 0.8)), url(../img/hero-.jpg); } }
+ @media (max-width: 56.25em) {
+ .header {
+ clip-path: polygon(0 0, 100% 0, 100% 85vh, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 85vh, 0 100%); } }
+ .header__logo-box {
+ position: absolute;
+ top: 4rem;
+ left: 4rem; }
+ .header__logo {
+ height: 3.5rem; }
+ .header__main {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center; }
+
+.navigation__checkbox {
+ display: none; }
+
+.navigation__button {
+ background-color: #fff;
+ height: 7rem;
+ width: 7rem;
+ position: fixed;
+ top: 6rem;
+ right: 6rem;
+ border-radius: 50%;
+ z-index: 2000;
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.1);
+ text-align: center;
+ cursor: pointer; }
+ @media (max-width: 56.25em) {
+ .navigation__button {
+ top: 4rem;
+ right: 4rem; } }
+ @media (max-width: 37.5em) {
+ .navigation__button {
+ top: 3rem;
+ right: 3rem; } }
+
+.navigation__background {
+ height: 6rem;
+ width: 6rem;
+ border-radius: 50%;
+ position: fixed;
+ top: 6.5rem;
+ right: 6.5rem;
+ background-image: radial-gradient(#55c57a, #28b485);
+ z-index: 1000;
+ transition: transform 0.8s cubic-bezier(0.86, 0, 0.07, 1); }
+ @media (max-width: 56.25em) {
+ .navigation__background {
+ top: 4.5rem;
+ right: 4.5rem; } }
+
+.navigation__nav {
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 1500;
+ opacity: 0;
+ width: 0;
+ transition: all .8s; }
+
+.navigation__list {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ transform: translate(-50%, -50%);
+ list-style: none;
+ text-align: center;
+ width: 100%; }
+
+.navigation__item {
+ margin: 1rem; }
+
+.navigation__link:link, .navigation__link:visited {
+ display: inline-block;
+ font-size: 3rem;
+ font-weight: 300;
+ padding: 1rem 2rem;
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ background-image: linear-gradient(120deg, transparent 0%, transparent 50%, #fff 50%);
+ background-size: 225%;
+ transition: all .4s; }
+ .navigation__link:link span, .navigation__link:visited span {
+ display: inline-block;
+ margin-right: 1.5rem; }
+
+.navigation__link:hover, .navigation__link a:active {
+ background-position: 100%;
+ color: #7ed56f;
+ transform: translateX(1rem); }
+
+.navigation__checkbox:checked ~ .navigation__background {
+ transform: scale(80); }
+
+.navigation__checkbox:checked ~ .navigation__nav {
+ opacity: 1;
+ width: 100%; }
+
+.navigation__icon {
+ position: relative;
+ margin-top: 3.5rem; }
+ .navigation__icon, .navigation__icon::before, .navigation__icon::after {
+ width: 3rem;
+ height: .2rem;
+ background-color: #777;
+ display: inline-block; }
+ .navigation__icon::before, .navigation__icon::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ transition: all .2s; }
+ .navigation__icon::before {
+ top: -.8rem; }
+ .navigation__icon::after {
+ top: .8rem; }
+
+.navigation__button:hover .navigation__icon::before {
+ top: -1rem; }
+
+.navigation__button:hover .navigation__icon::after {
+ top: 1rem; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon {
+ background-color: transparent; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::before {
+ top: 0;
+ transform: rotate(135deg); }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::after {
+ top: 0;
+ transform: rotate(-135deg); }
+
+.section-about {
+ background-color: #f7f7f7;
+ padding: 25rem 0;
+ margin-top: -20vh; }
+ @media (max-width: 56.25em) {
+ .section-about {
+ padding: 10rem 0; } }
+
+.section-features {
+ padding: 20rem 0;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/nat-4.jpg);
+ background-size: cover;
+ margin-top: -10rem;
+ transform: skewY(-7deg); }
+ .section-features > * {
+ transform: skewY(7deg); }
+ @media (max-width: 56.25em) {
+ .section-features {
+ padding: 10rem 0; } }
+
+.section-tours {
+ background-color: #f7f7f7;
+ padding: 25rem 0 15rem 0;
+ margin-top: -10rem; }
+ @media (max-width: 56.25em) {
+ .section-tours {
+ padding: 15rem 0; } }
+
+.section-stories {
+ position: relative;
+ padding: 15rem 0; }
+ @media (max-width: 56.25em) {
+ .section-stories {
+ padding: 10rem 0; } }
+
+.section-booking {
+ padding: 15rem 0;
+ background-image: linear-gradient(to right bottom, #55c57a, #28b485); }
+
+.book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 50%, transparent 50%), url(../img/nat-10.jpg);
+ background-size: 100%;
+ border-radius: 0.3rem;
+ box-shadow: 0 1.5rem 4rem black;
+ background-size: cover; }
+ @media (max-width: 75em) {
+ .book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 70%, transparent 70%), url(../img/nat-10.jpg);
+ background-size: cover; } }
+ @media (max-width: 56.25em) {
+ .book {
+ background-image: linear-gradient(to right, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 100%), url(../img/nat-10.jpg); } }
+ .book__form {
+ width: 50%;
+ padding: 6rem; }
+ @media (max-width: 75em) {
+ .book__form {
+ width: 90%; } }
diff --git a/css/style.prefix.css b/css/style.prefix.css
new file mode 100644
index 0000000..849b314
--- /dev/null
+++ b/css/style.prefix.css
@@ -0,0 +1,1520 @@
+@charset "UTF-8";
+
+@font-face {
+ font-family: "linea-basic-10";
+ src:url("fonts/linea-basic-10.eot");
+ src:url("fonts/linea-basic-10.eot?#iefix") format("embedded-opentype"),
+ url("fonts/linea-basic-10.woff") format("woff"),
+ url("fonts/linea-basic-10.ttf") format("truetype"),
+ url("fonts/linea-basic-10.svg#linea-basic-10") format("svg");
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+[data-icon]:before {
+ font-family: "linea-basic-10" !important;
+ content: attr(data-icon);
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ font-family: "linea-basic-10" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-basic-accelerator:before {
+ content: "a";
+}
+.icon-basic-alarm:before {
+ content: "b";
+}
+.icon-basic-anchor:before {
+ content: "c";
+}
+.icon-basic-anticlockwise:before {
+ content: "d";
+}
+.icon-basic-archive:before {
+ content: "e";
+}
+.icon-basic-archive-full:before {
+ content: "f";
+}
+.icon-basic-ban:before {
+ content: "g";
+}
+.icon-basic-battery-charge:before {
+ content: "h";
+}
+.icon-basic-battery-empty:before {
+ content: "i";
+}
+.icon-basic-battery-full:before {
+ content: "j";
+}
+.icon-basic-battery-half:before {
+ content: "k";
+}
+.icon-basic-bolt:before {
+ content: "l";
+}
+.icon-basic-book:before {
+ content: "m";
+}
+.icon-basic-book-pen:before {
+ content: "n";
+}
+.icon-basic-book-pencil:before {
+ content: "o";
+}
+.icon-basic-bookmark:before {
+ content: "p";
+}
+.icon-basic-calculator:before {
+ content: "q";
+}
+.icon-basic-calendar:before {
+ content: "r";
+}
+.icon-basic-cards-diamonds:before {
+ content: "s";
+}
+.icon-basic-cards-hearts:before {
+ content: "t";
+}
+.icon-basic-case:before {
+ content: "u";
+}
+.icon-basic-chronometer:before {
+ content: "v";
+}
+.icon-basic-clessidre:before {
+ content: "w";
+}
+.icon-basic-clock:before {
+ content: "x";
+}
+.icon-basic-clockwise:before {
+ content: "y";
+}
+.icon-basic-cloud:before {
+ content: "z";
+}
+.icon-basic-clubs:before {
+ content: "A";
+}
+.icon-basic-compass:before {
+ content: "B";
+}
+.icon-basic-cup:before {
+ content: "C";
+}
+.icon-basic-diamonds:before {
+ content: "D";
+}
+.icon-basic-display:before {
+ content: "E";
+}
+.icon-basic-download:before {
+ content: "F";
+}
+.icon-basic-exclamation:before {
+ content: "G";
+}
+.icon-basic-eye:before {
+ content: "H";
+}
+.icon-basic-eye-closed:before {
+ content: "I";
+}
+.icon-basic-female:before {
+ content: "J";
+}
+.icon-basic-flag1:before {
+ content: "K";
+}
+.icon-basic-flag2:before {
+ content: "L";
+}
+.icon-basic-floppydisk:before {
+ content: "M";
+}
+.icon-basic-folder:before {
+ content: "N";
+}
+.icon-basic-folder-multiple:before {
+ content: "O";
+}
+.icon-basic-gear:before {
+ content: "P";
+}
+.icon-basic-geolocalize-01:before {
+ content: "Q";
+}
+.icon-basic-geolocalize-05:before {
+ content: "R";
+}
+.icon-basic-globe:before {
+ content: "S";
+}
+.icon-basic-gunsight:before {
+ content: "T";
+}
+.icon-basic-hammer:before {
+ content: "U";
+}
+.icon-basic-headset:before {
+ content: "V";
+}
+.icon-basic-heart:before {
+ content: "W";
+}
+.icon-basic-heart-broken:before {
+ content: "X";
+}
+.icon-basic-helm:before {
+ content: "Y";
+}
+.icon-basic-home:before {
+ content: "Z";
+}
+.icon-basic-info:before {
+ content: "0";
+}
+.icon-basic-ipod:before {
+ content: "1";
+}
+.icon-basic-joypad:before {
+ content: "2";
+}
+.icon-basic-key:before {
+ content: "3";
+}
+.icon-basic-keyboard:before {
+ content: "4";
+}
+.icon-basic-laptop:before {
+ content: "5";
+}
+.icon-basic-life-buoy:before {
+ content: "6";
+}
+.icon-basic-lightbulb:before {
+ content: "7";
+}
+.icon-basic-link:before {
+ content: "8";
+}
+.icon-basic-lock:before {
+ content: "9";
+}
+.icon-basic-lock-open:before {
+ content: "!";
+}
+.icon-basic-magic-mouse:before {
+ content: "\"";
+}
+.icon-basic-magnifier:before {
+ content: "#";
+}
+.icon-basic-magnifier-minus:before {
+ content: "$";
+}
+.icon-basic-magnifier-plus:before {
+ content: "%";
+}
+.icon-basic-mail:before {
+ content: "&";
+}
+.icon-basic-mail-multiple:before {
+ content: "'";
+}
+.icon-basic-mail-open:before {
+ content: "(";
+}
+.icon-basic-mail-open-text:before {
+ content: ")";
+}
+.icon-basic-male:before {
+ content: "*";
+}
+.icon-basic-map:before {
+ content: "+";
+}
+.icon-basic-message:before {
+ content: ",";
+}
+.icon-basic-message-multiple:before {
+ content: "-";
+}
+.icon-basic-message-txt:before {
+ content: ".";
+}
+.icon-basic-mixer2:before {
+ content: "/";
+}
+.icon-basic-mouse:before {
+ content: ":";
+}
+.icon-basic-notebook:before {
+ content: ";";
+}
+.icon-basic-notebook-pen:before {
+ content: "<";
+}
+.icon-basic-notebook-pencil:before {
+ content: "=";
+}
+.icon-basic-paperplane:before {
+ content: ">";
+}
+.icon-basic-pencil-ruler:before {
+ content: "?";
+}
+.icon-basic-pencil-ruler-pen:before {
+ content: "@";
+}
+.icon-basic-photo:before {
+ content: "[";
+}
+.icon-basic-picture:before {
+ content: "]";
+}
+.icon-basic-picture-multiple:before {
+ content: "^";
+}
+.icon-basic-pin1:before {
+ content: "_";
+}
+.icon-basic-pin2:before {
+ content: "`";
+}
+.icon-basic-postcard:before {
+ content: "{";
+}
+.icon-basic-postcard-multiple:before {
+ content: "|";
+}
+.icon-basic-printer:before {
+ content: "}";
+}
+.icon-basic-question:before {
+ content: "~";
+}
+.icon-basic-rss:before {
+ content: "\\";
+}
+.icon-basic-server:before {
+ content: "\e000";
+}
+.icon-basic-server2:before {
+ content: "\e001";
+}
+.icon-basic-server-cloud:before {
+ content: "\e002";
+}
+.icon-basic-server-download:before {
+ content: "\e003";
+}
+.icon-basic-server-upload:before {
+ content: "\e004";
+}
+.icon-basic-settings:before {
+ content: "\e005";
+}
+.icon-basic-share:before {
+ content: "\e006";
+}
+.icon-basic-sheet:before {
+ content: "\e007";
+}
+.icon-basic-sheet-multiple:before {
+ content: "\e008";
+}
+.icon-basic-sheet-pen:before {
+ content: "\e009";
+}
+.icon-basic-sheet-pencil:before {
+ content: "\e00a";
+}
+.icon-basic-sheet-txt:before {
+ content: "\e00b";
+}
+.icon-basic-signs:before {
+ content: "\e00c";
+}
+.icon-basic-smartphone:before {
+ content: "\e00d";
+}
+.icon-basic-spades:before {
+ content: "\e00e";
+}
+.icon-basic-spread:before {
+ content: "\e00f";
+}
+.icon-basic-spread-bookmark:before {
+ content: "\e010";
+}
+.icon-basic-spread-text:before {
+ content: "\e011";
+}
+.icon-basic-spread-text-bookmark:before {
+ content: "\e012";
+}
+.icon-basic-star:before {
+ content: "\e013";
+}
+.icon-basic-tablet:before {
+ content: "\e014";
+}
+.icon-basic-target:before {
+ content: "\e015";
+}
+.icon-basic-todo:before {
+ content: "\e016";
+}
+.icon-basic-todo-pen:before {
+ content: "\e017";
+}
+.icon-basic-todo-pencil:before {
+ content: "\e018";
+}
+.icon-basic-todo-txt:before {
+ content: "\e019";
+}
+.icon-basic-todolist-pen:before {
+ content: "\e01a";
+}
+.icon-basic-todolist-pencil:before {
+ content: "\e01b";
+}
+.icon-basic-trashcan:before {
+ content: "\e01c";
+}
+.icon-basic-trashcan-full:before {
+ content: "\e01d";
+}
+.icon-basic-trashcan-refresh:before {
+ content: "\e01e";
+}
+.icon-basic-trashcan-remove:before {
+ content: "\e01f";
+}
+.icon-basic-upload:before {
+ content: "\e020";
+}
+.icon-basic-usb:before {
+ content: "\e021";
+}
+.icon-basic-video:before {
+ content: "\e022";
+}
+.icon-basic-watch:before {
+ content: "\e023";
+}
+.icon-basic-webpage:before {
+ content: "\e024";
+}
+.icon-basic-webpage-img-txt:before {
+ content: "\e025";
+}
+.icon-basic-webpage-multiple:before {
+ content: "\e026";
+}
+.icon-basic-webpage-txt:before {
+ content: "\e027";
+}
+.icon-basic-world:before {
+ content: "\e028";
+}
+
+/* Media Query
+- phone
+- tab-port
+- tab-land
+- big-desk
+*/
+*,
+*::after,
+*::bofore {
+ margin: 0;
+ padding: 0;
+ box-sizing: inherit; }
+
+html {
+ font-size: 62.5%;
+ /* Set to 10 to make calculation easier. 10% as it's 62.5% pf default browser font-size 16px; */ }
+ @media only screen and (max-width: 75em) {
+ html {
+ font-size: 56.25%; } }
+ @media only screen and (max-width: 56.25em) {
+ html {
+ font-size: 50%; } }
+
+body {
+ box-sizing: border-box;
+ padding: 3rem; }
+ @media only screen and (max-width: 56.25em) {
+ body {
+ padding: 0;
+ margin: 0; } }
+
+::-moz-selection {
+ background-color: #7ed56f;
+ color: #fff; }
+
+::selection {
+ background-color: #7ed56f;
+ color: #fff; }
+
+.u-centre-text {
+ text-align: center !important; }
+
+.u-margin-bottom-small {
+ margin-bottom: 1.5rem !important; }
+
+.u-margin-bottom-medium {
+ margin-bottom: 4rem !important; }
+ @media only screen and (max-width: 56.25em) {
+ .u-margin-bottom-medium {
+ margin-bottom: 3rem !important; } }
+
+.u-margin-bottom-large {
+ margin-bottom: 8rem !important; }
+ @media only screen and (max-width: 56.25em) {
+ .u-margin-bottom-large {
+ margin-bottom: 5rem !important; } }
+
+.u-margin-top-large {
+ margin-top: 8rem !important; }
+
+@-webkit-keyframes moveInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-10rem);
+ transform: translateX(-10rem); }
+ 80% {
+ -webkit-transform: translateX(2rem);
+ transform: translateX(2rem); }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0); } }
+
+@keyframes moveInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-10rem);
+ transform: translateX(-10rem); }
+ 80% {
+ -webkit-transform: translateX(2rem);
+ transform: translateX(2rem); }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0); } }
+
+@-webkit-keyframes moveInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(10rem);
+ transform: translateX(10rem); }
+ 80% {
+ -webkit-transform: translateX(-2rem);
+ transform: translateX(-2rem); }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0); } }
+
+@keyframes moveInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(10rem);
+ transform: translateX(10rem); }
+ 80% {
+ -webkit-transform: translateX(-2rem);
+ transform: translateX(-2rem); }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0); } }
+
+@-webkit-keyframes moveInButton {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(5rem);
+ transform: translateY(5rem); }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0); } }
+
+@keyframes moveInButton {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(5rem);
+ transform: translateY(5rem); }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0); } }
+
+body {
+ font-family: "Lato", sans-serif;
+ font-weight: 400;
+ line-height: 1.7;
+ color: #777; }
+
+.paragraph {
+ font-size: 1.6rem; }
+ .paragraph:not(:last-child) {
+ margin-bottom: 3rem; }
+
+.bg-video {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: -1;
+ opacity: .8;
+ overflow: hidden; }
+ .bg-video__content {
+ width: 100%;
+ height: 100%;
+ -o-object-fit: cover;
+ object-fit: cover; }
+
+.btn:hover {
+ -webkit-transform: translateY(-0.3rem);
+ transform: translateY(-0.3rem);
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.btn:active, .btn:focus {
+ outline: none;
+ -webkit-transform: translateY(-0.1rem);
+ transform: translateY(-0.1rem);
+ box-shadow: 0 0.5rem 21rem rgba(0, 0, 0, 0.2); }
+
+.btn, .btn:link, .btn:visited {
+ text-transform: uppercase;
+ text-decoration: none;
+ padding: 1.5rem 4rem;
+ display: inline-block;
+ border-radius: 10rem;
+ transition: all .2s;
+ position: relative;
+ font-size: 1.6rem;
+ border: none;
+ cursor: pointer; }
+
+.btn::after {
+ content: "";
+ display: inline-block;
+ height: 100%;
+ width: 100%;
+ border-radius: 10rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ transition: all .4s; }
+
+.btn--homepage-header {
+ -webkit-animation: moveInButton .75s ease-out;
+ animation: moveInButton .75s ease-out;
+ -webkit-animation-fill-mode: backwards;
+ animation-fill-mode: backwards; }
+
+.btn--white {
+ background-color: #fff;
+ color: #777; }
+ .btn--white::after {
+ background-color: #fff; }
+ .btn--white:hover::after {
+ -webkit-transform: scaleX(1.4) scaleY(1.6);
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn--green {
+ background-color: #7ed56f;
+ color: #fff; }
+ .btn--green::after {
+ background-color: #7ed56f; }
+ .btn--green:hover::after {
+ -webkit-transform: scaleX(1.4) scaleY(1.6);
+ transform: scaleX(1.4) scaleY(1.6);
+ opacity: 0; }
+
+.btn-text:link, .btn-text:visited {
+ color: #7ed56f;
+ display: inline-block;
+ border-bottom: 1px solid #7ed56f;
+ padding: .3rem;
+ font-size: 1.6rem;
+ transition: all .2s; }
+
+.btn-text:hover {
+ background-color: #7ed56f;
+ color: #fff;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ -webkit-transform: translateY(-2px);
+ transform: translateY(-2px); }
+
+.btn-text:active {
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
+ -webkit-transform: translateY(-2px);
+ transform: translateY(-2px); }
+
+.card {
+ -webkit-perspective: 150rem;
+ perspective: 150rem;
+ -moz-perspective: 150rem;
+ position: relative;
+ height: 50rem; }
+ .card__side {
+ height: 50rem;
+ color: #fff;
+ font-size: 2rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ transition: all .8s ease;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ border-radius: 0.3rem;
+ overflow: hidden;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side--front {
+ background-color: #fff; }
+ .card__side--back {
+ -webkit-transform: rotateY(180deg);
+ transform: rotateY(180deg); }
+ .card__side--back-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900); }
+ .card__side--back-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a); }
+ .card__side--back-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa); }
+ .card:hover .card__side--front {
+ -webkit-transform: rotateY(-180deg);
+ transform: rotateY(-180deg); }
+ .card:hover .card__side--back {
+ -webkit-transform: rotateY(0deg);
+ transform: rotateY(0deg); }
+ .card__picture {
+ background-size: cover;
+ height: 23rem;
+ background-blend-mode: screen;
+ clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ border-top-left-radius: 0.3rem;
+ border-top-right-radius: 0.3rem; }
+ .card__picture-1 {
+ background-image: linear-gradient(to right bottom, #ff7730, #ffb900), url("/img/nat-5.jpg"); }
+ .card__picture-2 {
+ background-image: linear-gradient(to right bottom, #7ed56f, #55c57a), url("/img/nat-6.jpg"); }
+ .card__picture-3 {
+ background-image: linear-gradient(to right bottom, #2998ff, #5643fa), url("/img/nat-7.jpg"); }
+ .card__heading {
+ color: #fff;
+ font-size: 2.8rem;
+ font-weight: 300;
+ text-transform: uppercase;
+ position: absolute;
+ text-align: right;
+ top: 12rem;
+ right: 2rem;
+ width: 65%; }
+ .card__heading-span {
+ padding: 1rem 1.5rem;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone; }
+ .card__heading-span-1 {
+ background-image: linear-gradient(to right bottom, rgba(255, 119, 48, 0.85), rgba(255, 185, 0, 0.85)); }
+ .card__heading-span-2 {
+ background-image: linear-gradient(to right bottom, rgba(126, 213, 111, 0.85), rgba(85, 197, 122, 0.85)); }
+ .card__heading-span-3 {
+ background-image: linear-gradient(to right bottom, rgba(41, 152, 255, 0.85), rgba(86, 67, 250, 0.85)); }
+ .card__details {
+ padding: 3rem; }
+ .card__details ul {
+ list-style: none;
+ width: 80%;
+ margin: 0 auto;
+ color: #777; }
+ .card__details ul li {
+ text-align: center;
+ font-size: 1.5rem;
+ padding: 1rem; }
+ .card__details ul li:not(:last-child) {
+ border-bottom: 1px #f7f7f7 solid; }
+ .card__cta {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ width: 70%;
+ text-align: center; }
+ .card__price-box {
+ color: #fff;
+ margin-bottom: 8rem; }
+ .card__price-only {
+ font-size: 1.4rem;
+ text-align: center;
+ text-transform: uppercase; }
+ .card__price-value {
+ font-size: 6rem;
+ font-weight: 100; }
+ @media only screen and (max-width: 56.25em), only screen and (hover: none) {
+ .card {
+ height: auto;
+ border-radius: 0.3rem;
+ background-color: #fff;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15); }
+ .card__side {
+ height: auto;
+ position: relative;
+ box-shadow: none; }
+ .card__side--back {
+ -webkit-transform: rotateY(0);
+ transform: rotateY(0);
+ -webkit-clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%);
+ clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%); }
+ .card:hover .card__side--front {
+ -webkit-transform: rotateY(0);
+ transform: rotateY(0); }
+ .card__cta {
+ position: relative;
+ top: 0;
+ left: 0;
+ width: 100%;
+ -webkit-transform: translate(0);
+ transform: translate(0);
+ padding-top: 7rem;
+ padding-bottom: 3rem; }
+ .card__price-box {
+ line-height: 0;
+ margin-bottom: 0; }
+ .card__price-value {
+ font-size: 4rem; }
+ .card__price-only {
+ margin: 0; } }
+
+.composition {
+ position: relative; }
+ .composition__photo {
+ width: 55%;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.4);
+ border-radius: 2px;
+ position: absolute;
+ z-index: 10;
+ transition: all .2s;
+ outline-offset: 2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo {
+ float: left;
+ position: relative;
+ width: 33.3333%;
+ box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.2);
+ transition: all .2; } }
+ .composition__photo--p1 {
+ left: 0;
+ top: -2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p1 {
+ top: 0rem;
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2); } }
+ .composition__photo--p2 {
+ right: 0;
+ top: 2rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p2 {
+ top: 0rem;
+ -webkit-transform: scale(1.3);
+ transform: scale(1.3);
+ z-index: 2000; } }
+ .composition__photo--p3 {
+ left: 20%;
+ top: 10rem; }
+ @media only screen and (max-width: 56.25em) {
+ .composition__photo--p3 {
+ top: 0rem;
+ left: 0;
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2); } }
+ .composition__photo:hover {
+ outline: 1.5rem solid #7ed56f;
+ -webkit-transform: scale(1.05);
+ transform: scale(1.05);
+ box-shadow: 0 2.5rem 4rem rgba(0, 0, 0, 0.5);
+ z-index: 20; }
+ .composition:hover .composition__photo:not(:hover) {
+ -webkit-transform: scale(0.9);
+ transform: scale(0.9); }
+
+.feature-box {
+ background-color: rgba(255, 255, 255, 0.8);
+ font-size: 1.5rem;
+ padding: 2.5rem;
+ text-align: center;
+ border-radius: 3px;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.15);
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s; }
+ @media only screen and (max-width: 56.25em) {
+ .feature-box {
+ padding: 2rem; } }
+ .feature-box__icon {
+ font-size: 6rem;
+ margin-bottom: .5rem;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent; }
+ .feature-box:hover {
+ -webkit-transform: translateY(-1.5rem);
+ transform: translateY(-1.5rem); }
+
+.form__group:not(:last-child) {
+ margin-bottom: 2rem; }
+
+.form__input {
+ font-size: 1.5rem;
+ font-family: inherit;
+ color: inherit;
+ padding: 1.5rem 2rem;
+ border-radius: .2rem;
+ background-color: #fff;
+ border: none;
+ border-bottom: 0.3rem solid transparent;
+ width: 75%;
+ display: block;
+ -webkit-transform: all .3s;
+ transform: all .3s; }
+ .form__input:focus {
+ outline: none;
+ box-shadow: 0.1rem 2rem rgba(0, 0, 0, 0.1);
+ border-bottom: 3px solid #7ed56f; }
+ .form__input:focus:invalid {
+ border-bottom: 3px solid #ff7730; }
+ .form__input::-webkit-input-placeholder {
+ color: #999; }
+
+.form__label {
+ font-size: 1.2rem;
+ font-weight: 700;
+ margin-left: 2rem;
+ margin-top: .7rem;
+ display: block;
+ transition: all .3s; }
+
+.form__input:placeholder-shown + .form__label {
+ opacity: 0;
+ visibility: hidden;
+ -webkit-transform: translateX(-4rem);
+ transform: translateX(-4rem); }
+
+.form__radio-input {
+ display: none; }
+
+.form__radio-group {
+ width: 49%;
+ display: inline-block; }
+ @media only screen and (max-width: 75em) {
+ .form__radio-group {
+ width: 100%;
+ margin-bottom: 3rem; } }
+
+.form__radio-label {
+ font-size: 1.6rem;
+ cursor: pointer;
+ position: relative;
+ padding-left: 5rem; }
+
+.form__radio-button {
+ height: 3rem;
+ width: 3rem;
+ border: 5px solid #7ed56f;
+ display: inline-block;
+ position: absolute;
+ top: -.4rem;
+ left: 0;
+ border-radius: 50%; }
+ .form__radio-button::after {
+ content: "";
+ height: 1rem;
+ width: 1rem;
+ border-radius: 50%;
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ background-color: #7ed56f;
+ opacity: 0;
+ transition: all .2s; }
+
+.form__radio-input:checked ~ .form__radio-label .form__radio-button::after {
+ opacity: 1; }
+
+/* Header Title */
+.heading-primary {
+ color: #fff;
+ text-transform: uppercase;
+ /* Makes animation smoother */
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ margin-bottom: 6rem; }
+ .heading-primary--main {
+ display: block;
+ font-size: 6rem;
+ font-weight: 400;
+ letter-spacing: 3.5rem;
+ -webkit-animation-name: moveInLeft;
+ animation-name: moveInLeft;
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ /* animation-delay: 3s; */
+ /* animation-iteration-count: 3; */
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in; }
+ @media only screen and (max-width: 37.5em) {
+ .heading-primary--main {
+ letter-spacing: 1rem;
+ font-size: 5rem; } }
+ .heading-primary--secondry {
+ display: block;
+ font-size: 2rem;
+ font-weight: 700;
+ letter-spacing: 1.7rem;
+ -webkit-animation: moveInRight 1s ease-in;
+ animation: moveInRight 1s ease-in; }
+ @media only screen and (max-width: 37.5em) {
+ .heading-primary--secondry {
+ letter-spacing: .5rem; } }
+
+.heading-secondary {
+ font-size: 3.5rem;
+ text-transform: uppercase;
+ font-weight: 700;
+ display: inline-block;
+ background-image: linear-gradient(to right, #55c57a, #28b485);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ letter-spacing: .2rem;
+ -webkit-transform: all .2s;
+ transform: all .2s; }
+ @media only screen and (max-width: 56.25em) {
+ .heading-secondary {
+ font-size: 3rem; } }
+ @media only screen and (max-width: 37.5em) {
+ .heading-secondary {
+ font-size: 2.5rem; } }
+ .heading-secondary:hover {
+ -webkit-transform: skewY(2deg) scale(1.1);
+ transform: skewY(2deg) scale(1.1);
+ text-shadow: 0.5rem 1rem 2rem rgba(0, 0, 0, 0.2); }
+
+.heading-tertiary {
+ font-size: 1.6rem;
+ font-weight: 700;
+ text-transform: uppercase; }
+
+.popup {
+ background-color: rgba(0, 0, 0, 0.8);
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 3000;
+ opacity: 0;
+ visibility: hidden;
+ transition: all .3s; }
+ @supports ((-webkit-backdrop-filter: blur(10px)) or (backdrop-filter: blur(10px))) {
+ .popup {
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px); } }
+ .popup:target {
+ visibility: visible;
+ opacity: 1; }
+ .popup:target .popup__modal {
+ opacity: 1;
+ -webkit-transform: translate(-50%, -50%) scale(1);
+ transform: translate(-50%, -50%) scale(1); }
+ .popup__close:link, .popup__close:visited {
+ color: #777;
+ position: absolute;
+ right: 2.5rem;
+ font-size: 3rem;
+ text-decoration: none;
+ display: inline-block;
+ -webkit-transform: all .2s;
+ transform: all .2s;
+ line-height: 1; }
+ .popup__close :hover {
+ color: #999; }
+ .popup__modal {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ background-color: #fff;
+ width: 75%;
+ box-shadow: 0 2rem 4rem rgba(0, 0, 0, 0.2);
+ display: table;
+ overflow: hidden;
+ border-radius: .3rem;
+ opacity: 0;
+ -webkit-transform: translate(-50%, -50%) scale(0.5);
+ transform: translate(-50%, -50%) scale(0.5);
+ transition: all .2s .2s; }
+ .popup__images {
+ width: 33.333333333%;
+ display: table-cell; }
+ @media only screen and (max-width: 75em) {
+ .popup__images {
+ display: none; } }
+ .popup__image {
+ display: block;
+ width: 100%; }
+ .popup__content {
+ width: 66.6666666666%;
+ vertical-align: middle;
+ text-align: center;
+ display: table-cell;
+ padding: 1rem 3em; }
+ .popup__text {
+ font-size: 1.4rem;
+ margin-bottom: 4rem;
+ text-align: left;
+ -moz-column-count: 2;
+ -moz-column-gap: 4rem;
+ -moz-column-rule: 1px solid #f7f7f7;
+ -webkit-column-count: 2;
+ column-count: 2;
+ -webkit-column-gap: 4rem;
+ column-gap: 4rem;
+ -webkit-column-rule: 1px solid #f7f7f7;
+ column-rule: 1px solid #f7f7f7;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto; }
+
+.story {
+ width: 75%;
+ margin: 0 auto;
+ box-shadow: 0 3rem 6rem rgba(0, 0, 0, 0.2);
+ background-color: rgba(255, 255, 255, 0.6);
+ border-radius: 0.3rem;
+ padding: 6rem;
+ padding-left: 9rem;
+ font-size: 1.6rem;
+ -webkit-transform: skewX(-12deg);
+ transform: skewX(-12deg); }
+ @media only screen and (max-width: 56.25em) {
+ .story {
+ width: 100%;
+ padding: 4rem;
+ padding-left: 0; } }
+ @media only screen and (max-width: 37.5em) {
+ .story {
+ -webkit-transform: skewX(0);
+ transform: skewX(0); } }
+ .story__shape {
+ width: 15rem;
+ height: 15rem;
+ float: left;
+ position: relative;
+ overflow: hidden;
+ -webkit-transform: translateX(-3rem) skewX(12deg);
+ transform: translateX(-3rem) skewX(12deg);
+ border-radius: 50%; }
+ @supports ((-webkit-clip-path: polygon(0, 0)) or (clip-path: polygon(0, 0))) or (-webkit-clip-path: polygon(0 0)) {
+ .story__shape {
+ clip-path: circle(50% at 50% 50%);
+ -webkit-clip-path: circle(50% at 50% 50%);
+ shape-outside: circle(50% at 50% 50%);
+ border-radius: none; } }
+ @media only screen and (max-width: 37.5em) {
+ .story__shape {
+ -webkit-transform: translateX(-3rem) skewX(0);
+ transform: translateX(-3rem) skewX(0); } }
+ .story__img {
+ height: 100%;
+ -webkit-transform: translateX(-4rem) scale(1.4);
+ transform: translateX(-4rem) scale(1.4);
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ transition: all .5s; }
+ .story__text {
+ -webkit-transform: skewX(12deg);
+ transform: skewX(12deg); }
+ @media only screen and (max-width: 37.5em) {
+ .story__text {
+ -webkit-transform: skewX(0);
+ transform: skewX(0); } }
+ .story__caption {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ color: #fff;
+ text-transform: uppercase;
+ font-size: 1.7rem;
+ text-align: center;
+ opacity: 0;
+ -webkit-transform: translate(-50%, 20%);
+ transform: translate(-50%, 20%);
+ transition: all .5s;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden; }
+ .story:hover .story__caption {
+ opacity: 1;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%); }
+ .story:hover .story__img {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ -webkit-filter: blur(3px) brightness(80%);
+ filter: blur(3px) brightness(80%); }
+
+.footer {
+ background-color: #333;
+ padding: 10rem 0;
+ font-size: 1.4rem;
+ color: #f7f7f7; }
+ @media only screen and (max-width: 56.25em) {
+ .footer {
+ padding: 10rem 2rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .footer {
+ padding: 8rem 0; } }
+ .footer__logo-box {
+ text-align: center;
+ margin-bottom: 8rem; }
+ .footer__logo {
+ width: 15rem; }
+ .footer__navigation {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block; }
+ @media only screen and (max-width: 56.25em) {
+ .footer__navigation {
+ width: 100%;
+ text-align: center; } }
+ .footer__list {
+ list-style: none;
+ padding: 0; }
+ .footer__list__item {
+ display: inline-block; }
+ .footer__list__item:not(:last-child) {
+ margin-right: 1.5rem; }
+ .footer__link:link, .footer__link:visited {
+ color: #f7f7f7;
+ text-decoration: none;
+ text-transform: uppercase;
+ display: inline-block;
+ transition: all .2s; }
+ .footer__link:hover, .footer__link:active {
+ color: #7ed56f;
+ box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.4);
+ -webkit-transform: rotate(5deg) scale(1.3);
+ transform: rotate(5deg) scale(1.3); }
+ .footer__copyright {
+ border-top: 1px solid #f7f7f7;
+ padding-top: 2rem;
+ display: inline-block;
+ width: 80%;
+ float: right; }
+ @media only screen and (max-width: 56.25em) {
+ .footer__copyright {
+ float: none;
+ width: 100%; } }
+
+.row {
+ max-width: 114rem;
+ margin: 0 auto; }
+ .row:not(:last-child) {
+ margin-bottom: 8rem; }
+ @media only screen and (max-width: 56.25em) {
+ .row:not(:last-child) {
+ margin-bottom: 6rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .row {
+ max-width: 50rem;
+ padding: 0 3rem; } }
+ .row:after {
+ content: "";
+ display: table;
+ clear: both; }
+ .row [class^="col-"] {
+ float: left; }
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 6rem; }
+ @media only screen and (max-width: 56.25em) {
+ .row [class^="col-"]:not(:last-child) {
+ margin-right: 0;
+ margin-bottom: 6rem; } }
+ @media only screen and (max-width: 56.25em) {
+ .row [class^="col-"] {
+ width: 100% !important; } }
+ .row .col-1-of-2 {
+ width: calc((100% - 6rem) / 2); }
+ .row .col-1-of-3 {
+ width: calc((100% - 2 * 6rem) / 3); }
+ .row .col-2-of-3 {
+ width: calc(2 * ((100% - 2 * 6rem) / 3) + 6rem); }
+ .row .col-1-of-4 {
+ width: calc((100% - 3 * 6rem) / 4); }
+ .row .col-2-of-4 {
+ width: calc(2 * ((100% - 3 * 6rem) / 4) + 6rem); }
+ .row .col-3-of-4 {
+ width: calc(3 * ((100% - 3 * 6rem) / 4) + 2 * 6rem); }
+
+/* Header */
+.header {
+ height: 85vh;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero-small.jpg);
+ background-size: cover;
+ background-position: top;
+ position: relative; }
+ @supports ((-webkit-clip-path: polygon(0 0)) or (clip-path: polygon(0 0))) or (-webkit-clip-path: polygon(0 0)) {
+ .header {
+ -webkit-clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%);
+ height: 95vh; } }
+ @media only screen and (-webkit-min-device-pixel-ratio: 2) and (min-width: 37.5em), only screen and (min-resolution: 192dpi) and (min-width: 37.5em), only screen and (min-width: 125em) {
+ .header {
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/hero.jpg); } }
+ .header__logo-box {
+ position: absolute;
+ top: 4rem;
+ left: 4rem; }
+ .header__logo {
+ height: 3.5rem; }
+ .header__main {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ text-align: center; }
+
+.navigation__checkbox {
+ display: none; }
+
+.navigation__button {
+ background-color: #fff;
+ height: 7rem;
+ width: 7rem;
+ position: fixed;
+ top: 6rem;
+ right: 6rem;
+ border-radius: 50%;
+ z-index: 2000;
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.1);
+ text-align: center;
+ cursor: pointer; }
+ @media only screen and (max-width: 56.25em) {
+ .navigation__button {
+ top: 4rem;
+ right: 4rem; } }
+ @media only screen and (max-width: 37.5em) {
+ .navigation__button {
+ top: 3rem;
+ right: 3rem; } }
+
+.navigation__background {
+ height: 6rem;
+ width: 6rem;
+ border-radius: 50%;
+ position: fixed;
+ top: 6.5rem;
+ right: 6.5rem;
+ background-image: radial-gradient(#55c57a, #28b485);
+ z-index: 1000;
+ transition: -webkit-transform 0.8s cubic-bezier(0.86, 0, 0.07, 1);
+ transition: transform 0.8s cubic-bezier(0.86, 0, 0.07, 1);
+ transition: transform 0.8s cubic-bezier(0.86, 0, 0.07, 1), -webkit-transform 0.8s cubic-bezier(0.86, 0, 0.07, 1); }
+ @media only screen and (max-width: 56.25em) {
+ .navigation__background {
+ top: 4.5rem;
+ right: 4.5rem; } }
+
+.navigation__nav {
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ right: 0;
+ z-index: 1500;
+ opacity: 0;
+ width: 0;
+ transition: all .8s; }
+
+.navigation__list {
+ top: 50%;
+ left: 50%;
+ position: absolute;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ list-style: none;
+ text-align: center;
+ width: 100%; }
+
+.navigation__item {
+ margin: 1rem; }
+
+.navigation__link:link, .navigation__link:visited {
+ display: inline-block;
+ font-size: 3rem;
+ font-weight: 300;
+ padding: 1rem 2rem;
+ color: #fff;
+ text-decoration: none;
+ text-transform: uppercase;
+ background-image: linear-gradient(120deg, transparent 0%, transparent 50%, #fff 50%);
+ background-size: 225%;
+ transition: all .4s; }
+ .navigation__link:link span, .navigation__link:visited span {
+ display: inline-block;
+ margin-right: 1.5rem; }
+
+.navigation__link:hover, .navigation__link a:active {
+ background-position: 100%;
+ color: #7ed56f;
+ -webkit-transform: translateX(1rem);
+ transform: translateX(1rem); }
+
+.navigation__checkbox:checked ~ .navigation__background {
+ -webkit-transform: scale(80);
+ transform: scale(80); }
+
+.navigation__checkbox:checked ~ .navigation__nav {
+ opacity: 1;
+ width: 100%; }
+
+.navigation__icon {
+ position: relative;
+ margin-top: 3.5rem; }
+ .navigation__icon, .navigation__icon::before, .navigation__icon::after {
+ width: 3rem;
+ height: .2rem;
+ background-color: #777;
+ display: inline-block; }
+ .navigation__icon::before, .navigation__icon::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ transition: all .2s; }
+ .navigation__icon::before {
+ top: -.8rem; }
+ .navigation__icon::after {
+ top: .8rem; }
+
+.navigation__button:hover .navigation__icon::before {
+ top: -1rem; }
+
+.navigation__button:hover .navigation__icon::after {
+ top: 1rem; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon {
+ background-color: transparent; }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::before {
+ top: 0;
+ -webkit-transform: rotate(135deg);
+ transform: rotate(135deg); }
+
+.navigation__checkbox:checked + .navigation__button .navigation__icon::after {
+ top: 0;
+ -webkit-transform: rotate(-135deg);
+ transform: rotate(-135deg); }
+
+.section-about {
+ background-color: #f7f7f7;
+ padding: 25rem 0;
+ margin-top: -20vh; }
+ @media only screen and (max-width: 56.25em) {
+ .section-about {
+ padding: 10rem 0; } }
+
+.section-features {
+ padding: 20rem 0;
+ background-image: linear-gradient(to right bottom, rgba(85, 197, 122, 0.8), rgba(40, 180, 133, 0.8)), url(../img/nat-4.jpg);
+ background-size: cover;
+ margin-top: -10rem;
+ -webkit-transform: skewY(-7deg);
+ transform: skewY(-7deg); }
+ .section-features > * {
+ -webkit-transform: skewY(7deg);
+ transform: skewY(7deg); }
+ @media only screen and (max-width: 56.25em) {
+ .section-features {
+ padding: 10rem 0; } }
+
+.section-tours {
+ background-color: #f7f7f7;
+ padding: 25rem 0 15rem 0;
+ margin-top: -10rem; }
+ @media only screen and (max-width: 56.25em) {
+ .section-tours {
+ padding: 15rem 0; } }
+
+.section-stories {
+ position: relative;
+ padding: 15rem 0; }
+ @media only screen and (max-width: 56.25em) {
+ .section-stories {
+ padding: 10rem 0; } }
+
+.section-booking {
+ padding: 15rem 0;
+ background-image: linear-gradient(to right bottom, #55c57a, #28b485); }
+
+.book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 50%, transparent 50%), url(../img/nat-10.jpg);
+ background-size: 100%;
+ border-radius: 0.3rem;
+ box-shadow: 0 1.5rem 4rem black;
+ background-size: cover; }
+ @media only screen and (max-width: 75em) {
+ .book {
+ background-image: linear-gradient(105deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 70%, transparent 70%), url(../img/nat-10.jpg);
+ background-size: cover; } }
+ @media only screen and (max-width: 56.25em) {
+ .book {
+ background-image: linear-gradient(to right, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.9) 100%), url(../img/nat-10.jpg); } }
+ .book__form {
+ width: 50%;
+ padding: 6rem; }
+ @media only screen and (max-width: 75em) {
+ .book__form {
+ width: 90%; } }
+
+/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLmNvbmNhdC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCOztBQUVqQjtFQUNFLDhCQUE4QjtFQUM5QixvQ0FBb0M7RUFDcEM7OztpRUFHK0Q7RUFDL0Qsb0JBQW9CO0VBQ3BCLG1CQUFtQjs7Q0FFcEI7O0FBRUQ7RUFDRSx5Q0FBeUM7RUFDekMseUJBQXlCO0VBQ3pCLDhCQUE4QjtFQUM5QiwrQkFBK0I7RUFDL0IsZ0NBQWdDO0VBQ2hDLGdDQUFnQztFQUNoQyxZQUFZO0VBQ1osZUFBZTtFQUNmLG9DQUFvQztFQUNwQyxtQ0FBbUM7Q0FDcEM7O0FBRUQ7O0VBRUUseUNBQXlDO0VBQ3pDLDhCQUE4QjtFQUM5QiwrQkFBK0I7RUFDL0IsZ0NBQWdDO0VBQ2hDLGdDQUFnQztFQUNoQyxZQUFZO0VBQ1osZUFBZTtFQUNmLG9DQUFvQztFQUNwQyxtQ0FBbUM7Q0FDcEM7O0FBRUQ7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxjQUFjO0NBQ2Y7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxhQUFhO0NBQ2Q7QUFDRDtFQUNFLGFBQWE7Q0FDZDtBQUNEO0VBQ0UsYUFBYTtDQUNkO0FBQ0Q7RUFDRSxjQUFjO0NBQ2Y7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCO0FBQ0Q7RUFDRSxpQkFBaUI7Q0FDbEI7QUFDRDtFQUNFLGlCQUFpQjtDQUNsQjtBQUNEO0VBQ0UsaUJBQWlCO0NBQ2xCOztBQUVEOzs7OztFQUtFO0FBQ0Y7OztFQUdFLFVBQVU7RUFDVixXQUFXO0VBQ1gsb0JBQW9CLEVBQUU7O0FBRXhCO0VBQ0UsaUJBQWlCO0VBQ2pCLGlHQUFpRyxFQUFFO0VBQ25HO0lBQ0U7TUFDRSxrQkFBa0IsRUFBRSxFQUFFO0VBQzFCO0lBQ0U7TUFDRSxlQUFlLEVBQUUsRUFBRTs7QUFFekI7RUFDRSx1QkFBdUI7RUFDdkIsY0FBYyxFQUFFO0VBQ2hCO0lBQ0U7TUFDRSxXQUFXO01BQ1gsVUFBVSxFQUFFLEVBQUU7O0FBRXBCO0VBQ0UsMEJBQTBCO0VBQzFCLFlBQVksRUFBRTs7QUFGaEI7RUFDRSwwQkFBMEI7RUFDMUIsWUFBWSxFQUFFOztBQUVoQjtFQUNFLDhCQUE4QixFQUFFOztBQUVsQztFQUNFLGlDQUFpQyxFQUFFOztBQUVyQztFQUNFLCtCQUErQixFQUFFO0VBQ2pDO0lBQ0U7TUFDRSwrQkFBK0IsRUFBRSxFQUFFOztBQUV6QztFQUNFLCtCQUErQixFQUFFO0VBQ2pDO0lBQ0U7TUFDRSwrQkFBK0IsRUFBRSxFQUFFOztBQUV6QztFQUNFLDRCQUE0QixFQUFFOztBQUVoQztFQUNFO0lBQ0UsV0FBVztJQUNYLHNDQUE4QjtZQUE5Qiw4QkFBOEIsRUFBRTtFQUNsQztJQUNFLG9DQUE0QjtZQUE1Qiw0QkFBNEIsRUFBRTtFQUNoQztJQUNFLFdBQVc7SUFDWCxpQ0FBeUI7WUFBekIseUJBQXlCLEVBQUUsRUFBRTs7QUFSakM7RUFDRTtJQUNFLFdBQVc7SUFDWCxzQ0FBOEI7WUFBOUIsOEJBQThCLEVBQUU7RUFDbEM7SUFDRSxvQ0FBNEI7WUFBNUIsNEJBQTRCLEVBQUU7RUFDaEM7SUFDRSxXQUFXO0lBQ1gsaUNBQXlCO1lBQXpCLHlCQUF5QixFQUFFLEVBQUU7O0FBRWpDO0VBQ0U7SUFDRSxXQUFXO0lBQ1gscUNBQTZCO1lBQTdCLDZCQUE2QixFQUFFO0VBQ2pDO0lBQ0UscUNBQTZCO1lBQTdCLDZCQUE2QixFQUFFO0VBQ2pDO0lBQ0UsV0FBVztJQUNYLGlDQUF5QjtZQUF6Qix5QkFBeUIsRUFBRSxFQUFFOztBQVJqQztFQUNFO0lBQ0UsV0FBVztJQUNYLHFDQUE2QjtZQUE3Qiw2QkFBNkIsRUFBRTtFQUNqQztJQUNFLHFDQUE2QjtZQUE3Qiw2QkFBNkIsRUFBRTtFQUNqQztJQUNFLFdBQVc7SUFDWCxpQ0FBeUI7WUFBekIseUJBQXlCLEVBQUUsRUFBRTs7QUFFakM7RUFDRTtJQUNFLFdBQVc7SUFDWCxvQ0FBNEI7WUFBNUIsNEJBQTRCLEVBQUU7RUFDaEM7SUFDRSxXQUFXO0lBQ1gsaUNBQXlCO1lBQXpCLHlCQUF5QixFQUFFLEVBQUU7O0FBTmpDO0VBQ0U7SUFDRSxXQUFXO0lBQ1gsb0NBQTRCO1lBQTVCLDRCQUE0QixFQUFFO0VBQ2hDO0lBQ0UsV0FBVztJQUNYLGlDQUF5QjtZQUF6Qix5QkFBeUIsRUFBRSxFQUFFOztBQUVqQztFQUNFLGdDQUFnQztFQUNoQyxpQkFBaUI7RUFDakIsaUJBQWlCO0VBQ2pCLFlBQVksRUFBRTs7QUFFaEI7RUFDRSxrQkFBa0IsRUFBRTtFQUNwQjtJQUNFLG9CQUFvQixFQUFFOztBQUUxQjtFQUNFLG1CQUFtQjtFQUNuQixPQUFPO0VBQ1AsUUFBUTtFQUNSLGFBQWE7RUFDYixZQUFZO0VBQ1osWUFBWTtFQUNaLFlBQVk7RUFDWixpQkFBaUIsRUFBRTtFQUNuQjtJQUNFLFlBQVk7SUFDWixhQUFhO0lBQ2IscUJBQWtCO09BQWxCLGtCQUFrQixFQUFFOztBQUV4QjtFQUNFLHVDQUErQjtVQUEvQiwrQkFBK0I7RUFDL0IsMkNBQTJDLEVBQUU7O0FBRS9DO0VBQ0UsY0FBYztFQUNkLHVDQUErQjtVQUEvQiwrQkFBK0I7RUFDL0IsOENBQThDLEVBQUU7O0FBRWxEO0VBQ0UsMEJBQTBCO0VBQzFCLHNCQUFzQjtFQUN0QixxQkFBcUI7RUFDckIsc0JBQXNCO0VBQ3RCLHFCQUFxQjtFQUNyQixvQkFBb0I7RUFDcEIsbUJBQW1CO0VBQ25CLGtCQUFrQjtFQUNsQixhQUFhO0VBQ2IsZ0JBQWdCLEVBQUU7O0FBRXBCO0VBQ0UsWUFBWTtFQUNaLHNCQUFzQjtFQUN0QixhQUFhO0VBQ2IsWUFBWTtFQUNaLHFCQUFxQjtFQUNyQixtQkFBbUI7RUFDbkIsT0FBTztFQUNQLFFBQVE7RUFDUixZQUFZO0VBQ1osb0JBQW9CLEVBQUU7O0FBRXhCO0VBQ0UsOENBQXNDO1VBQXRDLHNDQUFzQztFQUN0Qyx1Q0FBK0I7VUFBL0IsK0JBQStCLEVBQUU7O0FBRW5DO0VBQ0UsdUJBQXVCO0VBQ3ZCLFlBQVksRUFBRTtFQUNkO0lBQ0UsdUJBQXVCLEVBQUU7RUFDM0I7SUFDRSwyQ0FBbUM7WUFBbkMsbUNBQW1DO0lBQ25DLFdBQVcsRUFBRTs7QUFFakI7RUFDRSwwQkFBMEI7RUFDMUIsWUFBWSxFQUFFO0VBQ2Q7SUFDRSwwQkFBMEIsRUFBRTtFQUM5QjtJQUNFLDJDQUFtQztZQUFuQyxtQ0FBbUM7SUFDbkMsV0FBVyxFQUFFOztBQUVqQjtFQUNFLGVBQWU7RUFDZixzQkFBc0I7RUFDdEIsaUNBQWlDO0VBQ2pDLGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsb0JBQW9CLEVBQUU7O0FBRXhCO0VBQ0UsMEJBQTBCO0VBQzFCLFlBQVk7RUFDWiw0Q0FBNEM7RUFDNUMsb0NBQTRCO1VBQTVCLDRCQUE0QixFQUFFOztBQUVoQztFQUNFLDRDQUE0QztFQUM1QyxvQ0FBNEI7VUFBNUIsNEJBQTRCLEVBQUU7O0FBRWhDO0VBQ0UsNEJBQW9CO1VBQXBCLG9CQUFvQjtFQUNwQix5QkFBeUI7RUFDekIsbUJBQW1CO0VBQ25CLGNBQWMsRUFBRTtFQUNoQjtJQUNFLGNBQWM7SUFDZCxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixPQUFPO0lBQ1AsUUFBUTtJQUNSLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsb0NBQW9DO0lBQ3BDLDRCQUE0QjtJQUM1QixzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLDhDQUE4QyxFQUFFO0lBQ2hEO01BQ0UsdUJBQXVCLEVBQUU7SUFDM0I7TUFDRSxtQ0FBMkI7Y0FBM0IsMkJBQTJCLEVBQUU7TUFDN0I7UUFDRSxxRUFBcUUsRUFBRTtNQUN6RTtRQUNFLHFFQUFxRSxFQUFFO01BQ3pFO1FBQ0UscUVBQXFFLEVBQUU7RUFDN0U7SUFDRSxvQ0FBNEI7WUFBNUIsNEJBQTRCLEVBQUU7RUFDaEM7SUFDRSxpQ0FBeUI7WUFBekIseUJBQXlCLEVBQUU7RUFDN0I7SUFDRSx1QkFBdUI7SUFDdkIsY0FBYztJQUNkLDhCQUE4QjtJQUM5QixrREFBa0Q7SUFDbEQsMERBQTBEO0lBQzFELCtCQUErQjtJQUMvQixnQ0FBZ0MsRUFBRTtJQUNsQztNQUNFLDRGQUE0RixFQUFFO0lBQ2hHO01BQ0UsNEZBQTRGLEVBQUU7SUFDaEc7TUFDRSw0RkFBNEYsRUFBRTtFQUNsRztJQUNFLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLDBCQUEwQjtJQUMxQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVyxFQUFFO0VBQ2Y7SUFDRSxxQkFBcUI7SUFDckIsNEJBQTRCO0lBQzVCLG9DQUFvQyxFQUFFO0lBQ3RDO01BQ0Usc0dBQXNHLEVBQUU7SUFDMUc7TUFDRSx3R0FBd0csRUFBRTtJQUM1RztNQUNFLHNHQUFzRyxFQUFFO0VBQzVHO0lBQ0UsY0FBYyxFQUFFO0lBQ2hCO01BQ0UsaUJBQWlCO01BQ2pCLFdBQVc7TUFDWCxlQUFlO01BQ2YsWUFBWSxFQUFFO01BQ2Q7UUFDRSxtQkFBbUI7UUFDbkIsa0JBQWtCO1FBQ2xCLGNBQWMsRUFBRTtRQUNoQjtVQUNFLGlDQUFpQyxFQUFFO0VBQzNDO0lBQ0UsU0FBUztJQUNULFVBQVU7SUFDVixtQkFBbUI7SUFDbkIseUNBQWlDO1lBQWpDLGlDQUFpQztJQUNqQyxXQUFXO0lBQ1gsbUJBQW1CLEVBQUU7RUFDdkI7SUFDRSxZQUFZO0lBQ1osb0JBQW9CLEVBQUU7RUFDeEI7SUFDRSxrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLDBCQUEwQixFQUFFO0VBQzlCO0lBQ0UsZ0JBQWdCO0lBQ2hCLGlCQUFpQixFQUFFO0VBQ3JCO0lBQ0U7TUFDRSxhQUFhO01BQ2Isc0JBQXNCO01BQ3RCLHVCQUF1QjtNQUN2Qiw4Q0FBOEMsRUFBRTtNQUNoRDtRQUNFLGFBQWE7UUFDYixtQkFBbUI7UUFDbkIsaUJBQWlCLEVBQUU7UUFDbkI7VUFDRSw4QkFBc0I7a0JBQXRCLHNCQUFzQjtVQUN0Qiw2REFBcUQ7a0JBQXJELHFEQUFxRCxFQUFFO01BQzNEO1FBQ0UsOEJBQXNCO2dCQUF0QixzQkFBc0IsRUFBRTtNQUMxQjtRQUNFLG1CQUFtQjtRQUNuQixPQUFPO1FBQ1AsUUFBUTtRQUNSLFlBQVk7UUFDWixnQ0FBd0I7Z0JBQXhCLHdCQUF3QjtRQUN4QixrQkFBa0I7UUFDbEIscUJBQXFCLEVBQUU7TUFDekI7UUFDRSxlQUFlO1FBQ2YsaUJBQWlCLEVBQUU7TUFDckI7UUFDRSxnQkFBZ0IsRUFBRTtNQUNwQjtRQUNFLFVBQVUsRUFBRSxFQUFFOztBQUV0QjtFQUNFLG1CQUFtQixFQUFFO0VBQ3JCO0lBQ0UsV0FBVztJQUNYLDZDQUE2QztJQUM3QyxtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIscUJBQXFCLEVBQUU7SUFDdkI7TUFDRTtRQUNFLFlBQVk7UUFDWixtQkFBbUI7UUFDbkIsZ0JBQWdCO1FBQ2hCLDZDQUE2QztRQUM3QyxtQkFBbUIsRUFBRSxFQUFFO0lBQzNCO01BQ0UsUUFBUTtNQUNSLFdBQVcsRUFBRTtNQUNiO1FBQ0U7VUFDRSxVQUFVO1VBQ1YsOEJBQXNCO2tCQUF0QixzQkFBc0IsRUFBRSxFQUFFO0lBQ2hDO01BQ0UsU0FBUztNQUNULFVBQVUsRUFBRTtNQUNaO1FBQ0U7VUFDRSxVQUFVO1VBQ1YsOEJBQXNCO2tCQUF0QixzQkFBc0I7VUFDdEIsY0FBYyxFQUFFLEVBQUU7SUFDeEI7TUFDRSxVQUFVO01BQ1YsV0FBVyxFQUFFO01BQ2I7UUFDRTtVQUNFLFVBQVU7VUFDVixRQUFRO1VBQ1IsOEJBQXNCO2tCQUF0QixzQkFBc0IsRUFBRSxFQUFFO0lBQ2hDO01BQ0UsOEJBQThCO01BQzlCLCtCQUF1QjtjQUF2Qix1QkFBdUI7TUFDdkIsNkNBQTZDO01BQzdDLFlBQVksRUFBRTtFQUNsQjtJQUNFLDhCQUFzQjtZQUF0QixzQkFBc0IsRUFBRTs7QUFFNUI7RUFDRSwyQ0FBMkM7RUFDM0Msa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLDhDQUE4QztFQUM5QyxrQ0FBMEI7RUFBMUIsMEJBQTBCO0VBQTFCLGlEQUEwQixFQUFFO0VBQzVCO0lBQ0U7TUFDRSxjQUFjLEVBQUUsRUFBRTtFQUN0QjtJQUNFLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDhEQUE4RDtJQUM5RCw4QkFBOEI7SUFDOUIsc0JBQXNCO0lBQ3RCLG1CQUFtQixFQUFFO0VBQ3ZCO0lBQ0UsdUNBQStCO1lBQS9CLCtCQUErQixFQUFFOztBQUVyQztFQUNFLG9CQUFvQixFQUFFOztBQUV4QjtFQUNFLGtCQUFrQjtFQUNsQixxQkFBcUI7RUFDckIsZUFBZTtFQUNmLHFCQUFxQjtFQUNyQixxQkFBcUI7RUFDckIsdUJBQXVCO0VBQ3ZCLGFBQWE7RUFDYix3Q0FBd0M7RUFDeEMsV0FBVztFQUNYLGVBQWU7RUFDZiwyQkFBbUI7VUFBbkIsbUJBQW1CLEVBQUU7RUFDckI7SUFDRSxjQUFjO0lBQ2QsMkNBQTJDO0lBQzNDLGlDQUFpQyxFQUFFO0VBQ3JDO0lBQ0UsaUNBQWlDLEVBQUU7RUFDckM7SUFDRSxZQUFZLEVBQUU7O0FBRWxCO0VBQ0Usa0JBQWtCO0VBQ2xCLGlCQUFpQjtFQUNqQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixvQkFBb0IsRUFBRTs7QUFFeEI7RUFDRSxXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLHFDQUE2QjtVQUE3Qiw2QkFBNkIsRUFBRTs7QUFFakM7RUFDRSxjQUFjLEVBQUU7O0FBRWxCO0VBQ0UsV0FBVztFQUNYLHNCQUFzQixFQUFFO0VBQ3hCO0lBQ0U7TUFDRSxZQUFZO01BQ1osb0JBQW9CLEVBQUUsRUFBRTs7QUFFOUI7RUFDRSxrQkFBa0I7RUFDbEIsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixtQkFBbUIsRUFBRTs7QUFFdkI7RUFDRSxhQUFhO0VBQ2IsWUFBWTtFQUNaLDBCQUEwQjtFQUMxQixzQkFBc0I7RUFDdEIsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixRQUFRO0VBQ1IsbUJBQW1CLEVBQUU7RUFDckI7SUFDRSxZQUFZO0lBQ1osYUFBYTtJQUNiLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsU0FBUztJQUNULFVBQVU7SUFDVixtQkFBbUI7SUFDbkIseUNBQWlDO1lBQWpDLGlDQUFpQztJQUNqQywwQkFBMEI7SUFDMUIsV0FBVztJQUNYLG9CQUFvQixFQUFFOztBQUUxQjtFQUNFLFdBQVcsRUFBRTs7QUFFZixrQkFBa0I7QUFDbEI7RUFDRSxZQUFZO0VBQ1osMEJBQTBCO0VBQzFCLDhCQUE4QjtFQUM5QixvQ0FBNEI7VUFBNUIsNEJBQTRCO0VBQzVCLG9CQUFvQixFQUFFO0VBQ3RCO0lBQ0UsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLG1DQUEyQjtZQUEzQiwyQkFBMkI7SUFDM0IsK0JBQXVCO1lBQXZCLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsbUNBQW1DO0lBQ25DLDJDQUFtQztZQUFuQyxtQ0FBbUMsRUFBRTtJQUNyQztNQUNFO1FBQ0UscUJBQXFCO1FBQ3JCLGdCQUFnQixFQUFFLEVBQUU7RUFDMUI7SUFDRSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsMENBQWtDO1lBQWxDLGtDQUFrQyxFQUFFO0lBQ3BDO01BQ0U7UUFDRSxzQkFBc0IsRUFBRSxFQUFFOztBQUVsQztFQUNFLGtCQUFrQjtFQUNsQiwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLHNCQUFzQjtFQUN0Qiw4REFBOEQ7RUFDOUQsOEJBQThCO0VBQzlCLHNCQUFzQjtFQUN0QixtQkFBbUI7RUFDbkIsc0JBQXNCO0VBQ3RCLDJCQUFtQjtVQUFuQixtQkFBbUIsRUFBRTtFQUNyQjtJQUNFO01BQ0UsZ0JBQWdCLEVBQUUsRUFBRTtFQUN4QjtJQUNFO01BQ0Usa0JBQWtCLEVBQUUsRUFBRTtFQUMxQjtJQUNFLDBDQUFrQztZQUFsQyxrQ0FBa0M7SUFDbEMsaURBQWlELEVBQUU7O0FBRXZEO0VBQ0Usa0JBQWtCO0VBQ2xCLGlCQUFpQjtFQUNqQiwwQkFBMEIsRUFBRTs7QUFFOUI7RUFDRSxxQ0FBcUM7RUFDckMsY0FBYztFQUNkLGdCQUFnQjtFQUNoQixPQUFPO0VBQ1AsUUFBUTtFQUNSLFlBQVk7RUFDWixjQUFjO0VBQ2QsV0FBVztFQUNYLG1CQUFtQjtFQUNuQixvQkFBb0IsRUFBRTtFQUN0QjtJQUNFO01BQ0Usb0NBQW9DO01BQ3BDLDRCQUE0QixFQUFFLEVBQUU7RUFDcEM7SUFDRSxvQkFBb0I7SUFDcEIsV0FBVyxFQUFFO0VBQ2Y7SUFDRSxXQUFXO0lBQ1gsa0RBQTBDO1lBQTFDLDBDQUEwQyxFQUFFO0VBQzlDO0lBQ0UsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsMkJBQW1CO1lBQW5CLG1CQUFtQjtJQUNuQixlQUFlLEVBQUU7RUFDbkI7SUFDRSxZQUFZLEVBQUU7RUFDaEI7SUFDRSxTQUFTO0lBQ1QsVUFBVTtJQUNWLG1CQUFtQjtJQUNuQix5Q0FBaUM7WUFBakMsaUNBQWlDO0lBQ2pDLHVCQUF1QjtJQUN2QixXQUFXO0lBQ1gsMkNBQTJDO0lBQzNDLGVBQWU7SUFDZixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLFdBQVc7SUFDWCxvREFBNEM7WUFBNUMsNENBQTRDO0lBQzVDLHdCQUF3QixFQUFFO0VBQzVCO0lBQ0UscUJBQXFCO0lBQ3JCLG9CQUFvQixFQUFFO0lBQ3RCO01BQ0U7UUFDRSxjQUFjLEVBQUUsRUFBRTtFQUN4QjtJQUNFLGVBQWU7SUFDZixZQUFZLEVBQUU7RUFDaEI7SUFDRSxzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsa0JBQWtCLEVBQUU7RUFDdEI7SUFDRSxrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLG9DQUFvQztJQUNwQyx3QkFBZ0I7WUFBaEIsZ0JBQWdCO0lBQ2hCLHlCQUFpQjtZQUFqQixpQkFBaUI7SUFDakIsdUNBQStCO1lBQS9CLCtCQUErQjtJQUUvQixrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLGNBQWMsRUFBRTs7QUFFcEI7RUFDRSxXQUFXO0VBQ1gsZUFBZTtFQUNmLDJDQUEyQztFQUMzQywyQ0FBMkM7RUFDM0Msc0JBQXNCO0VBQ3RCLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLGlDQUF5QjtVQUF6Qix5QkFBeUIsRUFBRTtFQUMzQjtJQUNFO01BQ0UsWUFBWTtNQUNaLGNBQWM7TUFDZCxnQkFBZ0IsRUFBRSxFQUFFO0VBQ3hCO0lBQ0U7TUFDRSw0QkFBb0I7Y0FBcEIsb0JBQW9CLEVBQUUsRUFBRTtFQUM1QjtJQUNFLGFBQWE7SUFDYixjQUFjO0lBQ2QsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsa0RBQTBDO1lBQTFDLDBDQUEwQztJQUMxQyxtQkFBbUIsRUFBRTtJQUNyQjtNQUNFO1FBQ0Usa0NBQWtDO1FBQ2xDLDBDQUEwQztRQUUxQyxzQ0FBc0M7UUFDdEMsb0JBQW9CLEVBQUUsRUFBRTtJQUM1QjtNQUNFO1FBQ0UsOENBQXNDO2dCQUF0QyxzQ0FBc0MsRUFBRSxFQUFFO0VBQ2hEO0lBQ0UsYUFBYTtJQUNiLGdEQUF3QztZQUF4Qyx3Q0FBd0M7SUFDeEMsb0NBQTRCO1lBQTVCLDRCQUE0QjtJQUM1QixvQkFBb0IsRUFBRTtFQUN4QjtJQUNFLGdDQUF3QjtZQUF4Qix3QkFBd0IsRUFBRTtJQUMxQjtNQUNFO1FBQ0UsNEJBQW9CO2dCQUFwQixvQkFBb0IsRUFBRSxFQUFFO0VBQzlCO0lBQ0UsbUJBQW1CO0lBQ25CLFNBQVM7SUFDVCxVQUFVO0lBQ1YsWUFBWTtJQUNaLDBCQUEwQjtJQUMxQixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCx3Q0FBZ0M7WUFBaEMsZ0NBQWdDO0lBQ2hDLG9CQUFvQjtJQUNwQixvQ0FBNEI7WUFBNUIsNEJBQTRCLEVBQUU7RUFDaEM7SUFDRSxXQUFXO0lBQ1gseUNBQWlDO1lBQWpDLGlDQUFpQyxFQUFFO0VBQ3JDO0lBQ0UsV0FBVztJQUNYLDRCQUFvQjtZQUFwQixvQkFBb0I7SUFDcEIsMENBQWtDO1lBQWxDLGtDQUFrQyxFQUFFOztBQUV4QztFQUNFLHVCQUF1QjtFQUN2QixpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLGVBQWUsRUFBRTtFQUNqQjtJQUNFO01BQ0Usb0JBQW9CLEVBQUUsRUFBRTtFQUM1QjtJQUNFO01BQ0UsZ0JBQWdCLEVBQUUsRUFBRTtFQUN4QjtJQUNFLG1CQUFtQjtJQUNuQixvQkFBb0IsRUFBRTtFQUN4QjtJQUNFLGFBQWEsRUFBRTtFQUNqQjtJQUNFLDhCQUE4QjtJQUM5QixrQkFBa0I7SUFDbEIsc0JBQXNCLEVBQUU7SUFDeEI7TUFDRTtRQUNFLFlBQVk7UUFDWixtQkFBbUIsRUFBRSxFQUFFO0VBQzdCO0lBQ0UsaUJBQWlCO0lBQ2pCLFdBQVcsRUFBRTtJQUNiO01BQ0Usc0JBQXNCLEVBQUU7TUFDeEI7UUFDRSxxQkFBcUIsRUFBRTtFQUM3QjtJQUNFLGVBQWU7SUFDZixzQkFBc0I7SUFDdEIsMEJBQTBCO0lBQzFCLHNCQUFzQjtJQUN0QixvQkFBb0IsRUFBRTtFQUN4QjtJQUNFLGVBQWU7SUFDZiwyQ0FBMkM7SUFDM0MsMkNBQW1DO1lBQW5DLG1DQUFtQyxFQUFFO0VBQ3ZDO0lBQ0UsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixzQkFBc0I7SUFDdEIsV0FBVztJQUNYLGFBQWEsRUFBRTtJQUNmO01BQ0U7UUFDRSxZQUFZO1FBQ1osWUFBWSxFQUFFLEVBQUU7O0FBRXhCO0VBQ0Usa0JBQWtCO0VBQ2xCLGVBQWUsRUFBRTtFQUNqQjtJQUNFLG9CQUFvQixFQUFFO0lBQ3RCO01BQ0U7UUFDRSxvQkFBb0IsRUFBRSxFQUFFO0VBQzlCO0lBQ0U7TUFDRSxpQkFBaUI7TUFDakIsZ0JBQWdCLEVBQUUsRUFBRTtFQUN4QjtJQUNFLFlBQVk7SUFDWixlQUFlO0lBQ2YsWUFBWSxFQUFFO0VBQ2hCO0lBQ0UsWUFBWSxFQUFFO0lBQ2Q7TUFDRSxtQkFBbUIsRUFBRTtNQUNyQjtRQUNFO1VBQ0UsZ0JBQWdCO1VBQ2hCLG9CQUFvQixFQUFFLEVBQUU7SUFDOUI7TUFDRTtRQUNFLHVCQUF1QixFQUFFLEVBQUU7RUFDakM7SUFDRSwrQkFBK0IsRUFBRTtFQUNuQztJQUNFLG1DQUFtQyxFQUFFO0VBQ3ZDO0lBQ0UsZ0RBQWdELEVBQUU7RUFDcEQ7SUFDRSxtQ0FBbUMsRUFBRTtFQUN2QztJQUNFLGdEQUFnRCxFQUFFO0VBQ3BEO0lBQ0Usb0RBQW9ELEVBQUU7O0FBRTFELFlBQVk7QUFDWjtFQUNFLGFBQWE7RUFDYixpSUFBaUk7RUFDakksdUJBQXVCO0VBQ3ZCLHlCQUF5QjtFQUN6QixtQkFBbUIsRUFBRTtFQUNyQjtJQUNFO01BQ0UsMkRBQTJEO01BQzNELG1EQUFtRDtNQUNuRCxhQUFhLEVBQUUsRUFBRTtFQUNyQjtJQUNFO01BQ0UsMkhBQTJILEVBQUUsRUFBRTtFQUNuSTtJQUNFLG1CQUFtQjtJQUNuQixVQUFVO0lBQ1YsV0FBVyxFQUFFO0VBQ2Y7SUFDRSxlQUFlLEVBQUU7RUFDbkI7SUFDRSxtQkFBbUI7SUFDbkIsU0FBUztJQUNULFVBQVU7SUFDVix5Q0FBaUM7WUFBakMsaUNBQWlDO0lBQ2pDLG1CQUFtQixFQUFFOztBQUV6QjtFQUNFLGNBQWMsRUFBRTs7QUFFbEI7RUFDRSx1QkFBdUI7RUFDdkIsYUFBYTtFQUNiLFlBQVk7RUFDWixnQkFBZ0I7RUFDaEIsVUFBVTtFQUNWLFlBQVk7RUFDWixtQkFBbUI7RUFDbkIsY0FBYztFQUNkLDJDQUEyQztFQUMzQyxtQkFBbUI7RUFDbkIsZ0JBQWdCLEVBQUU7RUFDbEI7SUFDRTtNQUNFLFVBQVU7TUFDVixZQUFZLEVBQUUsRUFBRTtFQUNwQjtJQUNFO01BQ0UsVUFBVTtNQUNWLFlBQVksRUFBRSxFQUFFOztBQUV0QjtFQUNFLGFBQWE7RUFDYixZQUFZO0VBQ1osbUJBQW1CO0VBQ25CLGdCQUFnQjtFQUNoQixZQUFZO0VBQ1osY0FBYztFQUNkLG9EQUFvRDtFQUNwRCxjQUFjO0VBQ2Qsa0VBQTBEO0VBQTFELDBEQUEwRDtFQUExRCxpSEFBMEQsRUFBRTtFQUM1RDtJQUNFO01BQ0UsWUFBWTtNQUNaLGNBQWMsRUFBRSxFQUFFOztBQUV4QjtFQUNFLGNBQWM7RUFDZCxnQkFBZ0I7RUFDaEIsT0FBTztFQUNQLFNBQVM7RUFDVCxjQUFjO0VBQ2QsV0FBVztFQUNYLFNBQVM7RUFDVCxvQkFBb0IsRUFBRTs7QUFFeEI7RUFDRSxTQUFTO0VBQ1QsVUFBVTtFQUNWLG1CQUFtQjtFQUNuQix5Q0FBaUM7VUFBakMsaUNBQWlDO0VBQ2pDLGlCQUFpQjtFQUNqQixtQkFBbUI7RUFDbkIsWUFBWSxFQUFFOztBQUVoQjtFQUNFLGFBQWEsRUFBRTs7QUFFakI7RUFDRSxzQkFBc0I7RUFDdEIsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQixtQkFBbUI7RUFDbkIsWUFBWTtFQUNaLHNCQUFzQjtFQUN0QiwwQkFBMEI7RUFDMUIscUZBQXFGO0VBQ3JGLHNCQUFzQjtFQUN0QixvQkFBb0IsRUFBRTtFQUN0QjtJQUNFLHNCQUFzQjtJQUN0QixxQkFBcUIsRUFBRTs7QUFFM0I7RUFDRSwwQkFBMEI7RUFDMUIsZUFBZTtFQUNmLG9DQUE0QjtVQUE1Qiw0QkFBNEIsRUFBRTs7QUFFaEM7RUFDRSw2QkFBcUI7VUFBckIscUJBQXFCLEVBQUU7O0FBRXpCO0VBQ0UsV0FBVztFQUNYLFlBQVksRUFBRTs7QUFFaEI7RUFDRSxtQkFBbUI7RUFDbkIsbUJBQW1CLEVBQUU7RUFDckI7SUFDRSxZQUFZO0lBQ1osY0FBYztJQUNkLHVCQUF1QjtJQUN2QixzQkFBc0IsRUFBRTtFQUMxQjtJQUNFLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsUUFBUTtJQUNSLG9CQUFvQixFQUFFO0VBQ3hCO0lBQ0UsWUFBWSxFQUFFO0VBQ2hCO0lBQ0UsV0FBVyxFQUFFOztBQUVqQjtFQUNFLFdBQVcsRUFBRTs7QUFFZjtFQUNFLFVBQVUsRUFBRTs7QUFFZDtFQUNFLDhCQUE4QixFQUFFOztBQUVsQztFQUNFLE9BQU87RUFDUCxrQ0FBMEI7VUFBMUIsMEJBQTBCLEVBQUU7O0FBRTlCO0VBQ0UsT0FBTztFQUNQLG1DQUEyQjtVQUEzQiwyQkFBMkIsRUFBRTs7QUFFL0I7RUFDRSwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLGtCQUFrQixFQUFFO0VBQ3BCO0lBQ0U7TUFDRSxpQkFBaUIsRUFBRSxFQUFFOztBQUUzQjtFQUNFLGlCQUFpQjtFQUNqQiw0SEFBNEg7RUFDNUgsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixnQ0FBd0I7VUFBeEIsd0JBQXdCLEVBQUU7RUFDMUI7SUFDRSwrQkFBdUI7WUFBdkIsdUJBQXVCLEVBQUU7RUFDM0I7SUFDRTtNQUNFLGlCQUFpQixFQUFFLEVBQUU7O0FBRTNCO0VBQ0UsMEJBQTBCO0VBQzFCLHlCQUF5QjtFQUN6QixtQkFBbUIsRUFBRTtFQUNyQjtJQUNFO01BQ0UsaUJBQWlCLEVBQUUsRUFBRTs7QUFFM0I7RUFDRSxtQkFBbUI7RUFDbkIsaUJBQWlCLEVBQUU7RUFDbkI7SUFDRTtNQUNFLGlCQUFpQixFQUFFLEVBQUU7O0FBRTNCO0VBQ0UsaUJBQWlCO0VBQ2pCLHFFQUFxRSxFQUFFOztBQUV6RTtFQUNFLDhJQUE4STtFQUM5SSxzQkFBc0I7RUFDdEIsc0JBQXNCO0VBQ3RCLGdDQUFnQztFQUNoQyx1QkFBdUIsRUFBRTtFQUN6QjtJQUNFO01BQ0UsOElBQThJO01BQzlJLHVCQUF1QixFQUFFLEVBQUU7RUFDL0I7SUFDRTtNQUNFLGdJQUFnSSxFQUFFLEVBQUU7RUFDeEk7SUFDRSxXQUFXO0lBQ1gsY0FBYyxFQUFFO0lBQ2hCO01BQ0U7UUFDRSxXQUFXLEVBQUUsRUFBRSIsImZpbGUiOiJzdHlsZS5wcmVmaXguY3NzIiwic291cmNlc0NvbnRlbnQiOlsiQGNoYXJzZXQgXCJVVEYtOFwiO1xyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgZm9udC1mYW1pbHk6IFwibGluZWEtYmFzaWMtMTBcIjtcclxuICBzcmM6dXJsKFwiZm9udHMvbGluZWEtYmFzaWMtMTAuZW90XCIpO1xyXG4gIHNyYzp1cmwoXCJmb250cy9saW5lYS1iYXNpYy0xMC5lb3Q/I2llZml4XCIpIGZvcm1hdChcImVtYmVkZGVkLW9wZW50eXBlXCIpLFxyXG4gICAgdXJsKFwiZm9udHMvbGluZWEtYmFzaWMtMTAud29mZlwiKSBmb3JtYXQoXCJ3b2ZmXCIpLFxyXG4gICAgdXJsKFwiZm9udHMvbGluZWEtYmFzaWMtMTAudHRmXCIpIGZvcm1hdChcInRydWV0eXBlXCIpLFxyXG4gICAgdXJsKFwiZm9udHMvbGluZWEtYmFzaWMtMTAuc3ZnI2xpbmVhLWJhc2ljLTEwXCIpIGZvcm1hdChcInN2Z1wiKTtcclxuICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcclxuXHJcbn1cclxuXHJcbltkYXRhLWljb25dOmJlZm9yZSB7XHJcbiAgZm9udC1mYW1pbHk6IFwibGluZWEtYmFzaWMtMTBcIiAhaW1wb3J0YW50O1xyXG4gIGNvbnRlbnQ6IGF0dHIoZGF0YS1pY29uKTtcclxuICBmb250LXN0eWxlOiBub3JtYWwgIWltcG9ydGFudDtcclxuICBmb250LXdlaWdodDogbm9ybWFsICFpbXBvcnRhbnQ7XHJcbiAgZm9udC12YXJpYW50OiBub3JtYWwgIWltcG9ydGFudDtcclxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG4gIHNwZWFrOiBub25lO1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xyXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XHJcbn1cclxuXHJcbltjbGFzc149XCJpY29uLVwiXTpiZWZvcmUsXHJcbltjbGFzcyo9XCIgaWNvbi1cIl06YmVmb3JlIHtcclxuICBmb250LWZhbWlseTogXCJsaW5lYS1iYXNpYy0xMFwiICFpbXBvcnRhbnQ7XHJcbiAgZm9udC1zdHlsZTogbm9ybWFsICFpbXBvcnRhbnQ7XHJcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbCAhaW1wb3J0YW50O1xyXG4gIGZvbnQtdmFyaWFudDogbm9ybWFsICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxuICBzcGVhazogbm9uZTtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcclxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xyXG59XHJcblxyXG4uaWNvbi1iYXNpYy1hY2NlbGVyYXRvcjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiYVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWFsYXJtOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJiXCI7XHJcbn1cclxuLmljb24tYmFzaWMtYW5jaG9yOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJjXCI7XHJcbn1cclxuLmljb24tYmFzaWMtYW50aWNsb2Nrd2lzZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiZFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWFyY2hpdmU6YmVmb3JlIHtcclxuICBjb250ZW50OiBcImVcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1hcmNoaXZlLWZ1bGw6YmVmb3JlIHtcclxuICBjb250ZW50OiBcImZcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1iYW46YmVmb3JlIHtcclxuICBjb250ZW50OiBcImdcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1iYXR0ZXJ5LWNoYXJnZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiaFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWJhdHRlcnktZW1wdHk6YmVmb3JlIHtcclxuICBjb250ZW50OiBcImlcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1iYXR0ZXJ5LWZ1bGw6YmVmb3JlIHtcclxuICBjb250ZW50OiBcImpcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1iYXR0ZXJ5LWhhbGY6YmVmb3JlIHtcclxuICBjb250ZW50OiBcImtcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1ib2x0OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJsXCI7XHJcbn1cclxuLmljb24tYmFzaWMtYm9vazpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwibVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWJvb2stcGVuOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJuXCI7XHJcbn1cclxuLmljb24tYmFzaWMtYm9vay1wZW5jaWw6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIm9cIjtcclxufVxyXG4uaWNvbi1iYXNpYy1ib29rbWFyazpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwicFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWNhbGN1bGF0b3I6YmVmb3JlIHtcclxuICBjb250ZW50OiBcInFcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1jYWxlbmRhcjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiclwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWNhcmRzLWRpYW1vbmRzOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJzXCI7XHJcbn1cclxuLmljb24tYmFzaWMtY2FyZHMtaGVhcnRzOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJ0XCI7XHJcbn1cclxuLmljb24tYmFzaWMtY2FzZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwidVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWNocm9ub21ldGVyOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJ2XCI7XHJcbn1cclxuLmljb24tYmFzaWMtY2xlc3NpZHJlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJ3XCI7XHJcbn1cclxuLmljb24tYmFzaWMtY2xvY2s6YmVmb3JlIHtcclxuICBjb250ZW50OiBcInhcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1jbG9ja3dpc2U6YmVmb3JlIHtcclxuICBjb250ZW50OiBcInlcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1jbG91ZDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwielwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWNsdWJzOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJBXCI7XHJcbn1cclxuLmljb24tYmFzaWMtY29tcGFzczpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiQlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWN1cDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiQ1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLWRpYW1vbmRzOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJEXCI7XHJcbn1cclxuLmljb24tYmFzaWMtZGlzcGxheTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiRVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWRvd25sb2FkOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJGXCI7XHJcbn1cclxuLmljb24tYmFzaWMtZXhjbGFtYXRpb246YmVmb3JlIHtcclxuICBjb250ZW50OiBcIkdcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1leWU6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIkhcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1leWUtY2xvc2VkOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJJXCI7XHJcbn1cclxuLmljb24tYmFzaWMtZmVtYWxlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJKXCI7XHJcbn1cclxuLmljb24tYmFzaWMtZmxhZzE6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIktcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1mbGFnMjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiTFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWZsb3BweWRpc2s6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIk1cIjtcclxufVxyXG4uaWNvbi1iYXNpYy1mb2xkZXI6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIk5cIjtcclxufVxyXG4uaWNvbi1iYXNpYy1mb2xkZXItbXVsdGlwbGU6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIk9cIjtcclxufVxyXG4uaWNvbi1iYXNpYy1nZWFyOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJQXCI7XHJcbn1cclxuLmljb24tYmFzaWMtZ2VvbG9jYWxpemUtMDE6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlFcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1nZW9sb2NhbGl6ZS0wNTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiUlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWdsb2JlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJTXCI7XHJcbn1cclxuLmljb24tYmFzaWMtZ3Vuc2lnaHQ6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlRcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1oYW1tZXI6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlVcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1oZWFkc2V0OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJWXCI7XHJcbn1cclxuLmljb24tYmFzaWMtaGVhcnQ6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIldcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1oZWFydC1icm9rZW46YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlhcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1oZWxtOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJZXCI7XHJcbn1cclxuLmljb24tYmFzaWMtaG9tZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiWlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWluZm86YmVmb3JlIHtcclxuICBjb250ZW50OiBcIjBcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1pcG9kOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCIxXCI7XHJcbn1cclxuLmljb24tYmFzaWMtam95cGFkOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCIyXCI7XHJcbn1cclxuLmljb24tYmFzaWMta2V5OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCIzXCI7XHJcbn1cclxuLmljb24tYmFzaWMta2V5Ym9hcmQ6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIjRcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1sYXB0b3A6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIjVcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1saWZlLWJ1b3k6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIjZcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1saWdodGJ1bGI6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIjdcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1saW5rOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCI4XCI7XHJcbn1cclxuLmljb24tYmFzaWMtbG9jazpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiOVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLWxvY2stb3BlbjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiIVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLW1hZ2ljLW1vdXNlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXFwiXCI7XHJcbn1cclxuLmljb24tYmFzaWMtbWFnbmlmaWVyOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCIjXCI7XHJcbn1cclxuLmljb24tYmFzaWMtbWFnbmlmaWVyLW1pbnVzOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCIkXCI7XHJcbn1cclxuLmljb24tYmFzaWMtbWFnbmlmaWVyLXBsdXM6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIiVcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1tYWlsOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCImXCI7XHJcbn1cclxuLmljb24tYmFzaWMtbWFpbC1tdWx0aXBsZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiJ1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLW1haWwtb3BlbjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiKFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLW1haWwtb3Blbi10ZXh0OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCIpXCI7XHJcbn1cclxuLmljb24tYmFzaWMtbWFsZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiKlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLW1hcDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiK1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLW1lc3NhZ2U6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIixcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1tZXNzYWdlLW11bHRpcGxlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCItXCI7XHJcbn1cclxuLmljb24tYmFzaWMtbWVzc2FnZS10eHQ6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIi5cIjtcclxufVxyXG4uaWNvbi1iYXNpYy1taXhlcjI6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIi9cIjtcclxufVxyXG4uaWNvbi1iYXNpYy1tb3VzZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiOlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLW5vdGVib29rOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCI7XCI7XHJcbn1cclxuLmljb24tYmFzaWMtbm90ZWJvb2stcGVuOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCI8XCI7XHJcbn1cclxuLmljb24tYmFzaWMtbm90ZWJvb2stcGVuY2lsOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCI9XCI7XHJcbn1cclxuLmljb24tYmFzaWMtcGFwZXJwbGFuZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiPlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXBlbmNpbC1ydWxlcjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiP1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLXBlbmNpbC1ydWxlci1wZW46YmVmb3JlIHtcclxuICBjb250ZW50OiBcIkBcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1waG90bzpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiW1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLXBpY3R1cmU6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIl1cIjtcclxufVxyXG4uaWNvbi1iYXNpYy1waWN0dXJlLW11bHRpcGxlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJeXCI7XHJcbn1cclxuLmljb24tYmFzaWMtcGluMTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiX1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLXBpbjI6YmVmb3JlIHtcclxuICBjb250ZW50OiBcImBcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1wb3N0Y2FyZDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwie1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLXBvc3RjYXJkLW11bHRpcGxlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJ8XCI7XHJcbn1cclxuLmljb24tYmFzaWMtcHJpbnRlcjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwifVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXF1ZXN0aW9uOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJ+XCI7XHJcbn1cclxuLmljb24tYmFzaWMtcnNzOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXFxcXCI7XHJcbn1cclxuLmljb24tYmFzaWMtc2VydmVyOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMDBcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1zZXJ2ZXIyOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMDFcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1zZXJ2ZXItY2xvdWQ6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAwMlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXNlcnZlci1kb3dubG9hZDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDAzXCI7XHJcbn1cclxuLmljb24tYmFzaWMtc2VydmVyLXVwbG9hZDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDA0XCI7XHJcbn1cclxuLmljb24tYmFzaWMtc2V0dGluZ3M6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAwNVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXNoYXJlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMDZcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1zaGVldDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDA3XCI7XHJcbn1cclxuLmljb24tYmFzaWMtc2hlZXQtbXVsdGlwbGU6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAwOFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXNoZWV0LXBlbjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDA5XCI7XHJcbn1cclxuLmljb24tYmFzaWMtc2hlZXQtcGVuY2lsOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMGFcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1zaGVldC10eHQ6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAwYlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXNpZ25zOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMGNcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1zbWFydHBob25lOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMGRcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1zcGFkZXM6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAwZVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXNwcmVhZDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDBmXCI7XHJcbn1cclxuLmljb24tYmFzaWMtc3ByZWFkLWJvb2ttYXJrOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMTBcIjtcclxufVxyXG4uaWNvbi1iYXNpYy1zcHJlYWQtdGV4dDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDExXCI7XHJcbn1cclxuLmljb24tYmFzaWMtc3ByZWFkLXRleHQtYm9va21hcms6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAxMlwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXN0YXI6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAxM1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLXRhYmxldDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDE0XCI7XHJcbn1cclxuLmljb24tYmFzaWMtdGFyZ2V0OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMTVcIjtcclxufVxyXG4uaWNvbi1iYXNpYy10b2RvOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMTZcIjtcclxufVxyXG4uaWNvbi1iYXNpYy10b2RvLXBlbjpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDE3XCI7XHJcbn1cclxuLmljb24tYmFzaWMtdG9kby1wZW5jaWw6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAxOFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXRvZG8tdHh0OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMTlcIjtcclxufVxyXG4uaWNvbi1iYXNpYy10b2RvbGlzdC1wZW46YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAxYVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXRvZG9saXN0LXBlbmNpbDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDFiXCI7XHJcbn1cclxuLmljb24tYmFzaWMtdHJhc2hjYW46YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAxY1wiO1xyXG59XHJcbi5pY29uLWJhc2ljLXRyYXNoY2FuLWZ1bGw6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAxZFwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXRyYXNoY2FuLXJlZnJlc2g6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAxZVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXRyYXNoY2FuLXJlbW92ZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDFmXCI7XHJcbn1cclxuLmljb24tYmFzaWMtdXBsb2FkOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMjBcIjtcclxufVxyXG4uaWNvbi1iYXNpYy11c2I6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAyMVwiO1xyXG59XHJcbi5pY29uLWJhc2ljLXZpZGVvOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMjJcIjtcclxufVxyXG4uaWNvbi1iYXNpYy13YXRjaDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDIzXCI7XHJcbn1cclxuLmljb24tYmFzaWMtd2VicGFnZTpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDI0XCI7XHJcbn1cclxuLmljb24tYmFzaWMtd2VicGFnZS1pbWctdHh0OmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMjVcIjtcclxufVxyXG4uaWNvbi1iYXNpYy13ZWJwYWdlLW11bHRpcGxlOmJlZm9yZSB7XHJcbiAgY29udGVudDogXCJcXGUwMjZcIjtcclxufVxyXG4uaWNvbi1iYXNpYy13ZWJwYWdlLXR4dDpiZWZvcmUge1xyXG4gIGNvbnRlbnQ6IFwiXFxlMDI3XCI7XHJcbn1cclxuLmljb24tYmFzaWMtd29ybGQ6YmVmb3JlIHtcclxuICBjb250ZW50OiBcIlxcZTAyOFwiO1xyXG59XHJcblxuLyogTWVkaWEgUXVlcnkgXHJcbi0gcGhvbmVcclxuLSB0YWItcG9ydFxyXG4tIHRhYi1sYW5kXHJcbi0gYmlnLWRlc2tcclxuKi9cbiosXG4qOjphZnRlcixcbio6OmJvZm9yZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgYm94LXNpemluZzogaW5oZXJpdDsgfVxuXG5odG1sIHtcbiAgZm9udC1zaXplOiA2Mi41JTtcbiAgLyogU2V0IHRvIDEwIHRvIG1ha2UgY2FsY3VsYXRpb24gZWFzaWVyLiAgMTAlIGFzIGl0J3MgNjIuNSUgcGYgZGVmYXVsdCBicm93c2VyIGZvbnQtc2l6ZSAxNnB4OyAqLyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzVlbSkge1xuICAgIGh0bWwge1xuICAgICAgZm9udC1zaXplOiA1Ni4yNSU7IH0gfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pIHtcbiAgICBodG1sIHtcbiAgICAgIGZvbnQtc2l6ZTogNTAlOyB9IH1cblxuYm9keSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDNyZW07IH1cbiAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgYm9keSB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgbWFyZ2luOiAwOyB9IH1cblxuOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2VkNTZmO1xuICBjb2xvcjogI2ZmZjsgfVxuXG4udS1jZW50cmUtdGV4dCB7XG4gIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50OyB9XG5cbi51LW1hcmdpbi1ib3R0b20tc21hbGwge1xuICBtYXJnaW4tYm90dG9tOiAxLjVyZW0gIWltcG9ydGFudDsgfVxuXG4udS1tYXJnaW4tYm90dG9tLW1lZGl1bSB7XG4gIG1hcmdpbi1ib3R0b206IDRyZW0gIWltcG9ydGFudDsgfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pIHtcbiAgICAudS1tYXJnaW4tYm90dG9tLW1lZGl1bSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAzcmVtICFpbXBvcnRhbnQ7IH0gfVxuXG4udS1tYXJnaW4tYm90dG9tLWxhcmdlIHtcbiAgbWFyZ2luLWJvdHRvbTogOHJlbSAhaW1wb3J0YW50OyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC51LW1hcmdpbi1ib3R0b20tbGFyZ2Uge1xuICAgICAgbWFyZ2luLWJvdHRvbTogNXJlbSAhaW1wb3J0YW50OyB9IH1cblxuLnUtbWFyZ2luLXRvcC1sYXJnZSB7XG4gIG1hcmdpbi10b3A6IDhyZW0gIWltcG9ydGFudDsgfVxuXG5Aa2V5ZnJhbWVzIG1vdmVJbkxlZnQge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwcmVtKTsgfVxuICA4MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgycmVtKTsgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfSB9XG5cbkBrZXlmcmFtZXMgbW92ZUluUmlnaHQge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTByZW0pOyB9XG4gIDgwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0ycmVtKTsgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfSB9XG5cbkBrZXlmcmFtZXMgbW92ZUluQnV0dG9uIHtcbiAgMCUge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDVyZW0pOyB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyB9IH1cblxuYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBcIkxhdG9cIiwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgbGluZS1oZWlnaHQ6IDEuNztcbiAgY29sb3I6ICM3Nzc7IH1cblxuLnBhcmFncmFwaCB7XG4gIGZvbnQtc2l6ZTogMS42cmVtOyB9XG4gIC5wYXJhZ3JhcGg6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgbWFyZ2luLWJvdHRvbTogM3JlbTsgfVxuXG4uYmctdmlkZW8ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgei1pbmRleDogLTE7XG4gIG9wYWNpdHk6IC44O1xuICBvdmVyZmxvdzogaGlkZGVuOyB9XG4gIC5iZy12aWRlb19fY29udGVudCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG9iamVjdC1maXQ6IGNvdmVyOyB9XG5cbi5idG46aG92ZXIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuM3JlbSk7XG4gIGJveC1zaGFkb3c6IDAgMXJlbSAycmVtIHJnYmEoMCwgMCwgMCwgMC4yKTsgfVxuXG4uYnRuOmFjdGl2ZSwgLmJ0bjpmb2N1cyB7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMC4xcmVtKTtcbiAgYm94LXNoYWRvdzogMCAwLjVyZW0gMjFyZW0gcmdiYSgwLCAwLCAwLCAwLjIpOyB9XG5cbi5idG4sIC5idG46bGluaywgLmJ0bjp2aXNpdGVkIHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBwYWRkaW5nOiAxLjVyZW0gNHJlbTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiAxMHJlbTtcbiAgdHJhbnNpdGlvbjogYWxsIC4ycztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmb250LXNpemU6IDEuNnJlbTtcbiAgYm9yZGVyOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7IH1cblxuLmJ0bjo6YWZ0ZXIge1xuICBjb250ZW50OiBcIlwiO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDEwcmVtO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogLTE7XG4gIHRyYW5zaXRpb246IGFsbCAuNHM7IH1cblxuLmJ0bi0taG9tZXBhZ2UtaGVhZGVyIHtcbiAgYW5pbWF0aW9uOiBtb3ZlSW5CdXR0b24gLjc1cyBlYXNlLW91dDtcbiAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYmFja3dhcmRzOyB9XG5cbi5idG4tLXdoaXRlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY29sb3I6ICM3Nzc7IH1cbiAgLmJ0bi0td2hpdGU6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB9XG4gIC5idG4tLXdoaXRlOmhvdmVyOjphZnRlciB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZVgoMS40KSBzY2FsZVkoMS42KTtcbiAgICBvcGFjaXR5OiAwOyB9XG5cbi5idG4tLWdyZWVuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzdlZDU2ZjtcbiAgY29sb3I6ICNmZmY7IH1cbiAgLmJ0bi0tZ3JlZW46OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2VkNTZmOyB9XG4gIC5idG4tLWdyZWVuOmhvdmVyOjphZnRlciB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZVgoMS40KSBzY2FsZVkoMS42KTtcbiAgICBvcGFjaXR5OiAwOyB9XG5cbi5idG4tdGV4dDpsaW5rLCAuYnRuLXRleHQ6dmlzaXRlZCB7XG4gIGNvbG9yOiAjN2VkNTZmO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjN2VkNTZmO1xuICBwYWRkaW5nOiAuM3JlbTtcbiAgZm9udC1zaXplOiAxLjZyZW07XG4gIHRyYW5zaXRpb246IGFsbCAuMnM7IH1cblxuLmJ0bi10ZXh0OmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzdlZDU2ZjtcbiAgY29sb3I6ICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXJlbSAycmVtIHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTsgfVxuXG4uYnRuLXRleHQ6YWN0aXZlIHtcbiAgYm94LXNoYWRvdzogMCAxcmVtIDJyZW0gcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOyB9XG5cbi5jYXJkIHtcbiAgcGVyc3BlY3RpdmU6IDE1MHJlbTtcbiAgLW1vei1wZXJzcGVjdGl2ZTogMTUwcmVtO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogNTByZW07IH1cbiAgLmNhcmRfX3NpZGUge1xuICAgIGhlaWdodDogNTByZW07XG4gICAgY29sb3I6ICNmZmY7XG4gICAgZm9udC1zaXplOiAycmVtO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjhzIGVhc2U7XG4gICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJveC1zaGFkb3c6IDAgMS41cmVtIDRyZW0gcmdiYSgwLCAwLCAwLCAwLjE1KTsgfVxuICAgIC5jYXJkX19zaWRlLS1mcm9udCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB9XG4gICAgLmNhcmRfX3NpZGUtLWJhY2sge1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGVZKDE4MGRlZyk7IH1cbiAgICAgIC5jYXJkX19zaWRlLS1iYWNrLTEge1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQgYm90dG9tLCAjZmY3NzMwLCAjZmZiOTAwKTsgfVxuICAgICAgLmNhcmRfX3NpZGUtLWJhY2stMiB7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCBib3R0b20sICM3ZWQ1NmYsICM1NWM1N2EpOyB9XG4gICAgICAuY2FyZF9fc2lkZS0tYmFjay0zIHtcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0IGJvdHRvbSwgIzI5OThmZiwgIzU2NDNmYSk7IH1cbiAgLmNhcmQ6aG92ZXIgLmNhcmRfX3NpZGUtLWZyb250IHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZVkoLTE4MGRlZyk7IH1cbiAgLmNhcmQ6aG92ZXIgLmNhcmRfX3NpZGUtLWJhY2sge1xuICAgIHRyYW5zZm9ybTogcm90YXRlWSgwZGVnKTsgfVxuICAuY2FyZF9fcGljdHVyZSB7XG4gICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgICBoZWlnaHQ6IDIzcmVtO1xuICAgIGJhY2tncm91bmQtYmxlbmQtbW9kZTogc2NyZWVuO1xuICAgIGNsaXAtcGF0aDogcG9seWdvbigwIDAsIDEwMCUgMCwgMTAwJSA5MCUsIDAgMTAwJSk7XG4gICAgLXdlYmtpdC1jbGlwLXBhdGg6IHBvbHlnb24oMCAwLCAxMDAlIDAsIDEwMCUgOTAlLCAwIDEwMCUpO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4zcmVtOyB9XG4gICAgLmNhcmRfX3BpY3R1cmUtMSB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQgYm90dG9tLCAjZmY3NzMwLCAjZmZiOTAwKSwgdXJsKFwiL2ltZy9uYXQtNS5qcGdcIik7IH1cbiAgICAuY2FyZF9fcGljdHVyZS0yIHtcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCBib3R0b20sICM3ZWQ1NmYsICM1NWM1N2EpLCB1cmwoXCIvaW1nL25hdC02LmpwZ1wiKTsgfVxuICAgIC5jYXJkX19waWN0dXJlLTMge1xuICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0IGJvdHRvbSwgIzI5OThmZiwgIzU2NDNmYSksIHVybChcIi9pbWcvbmF0LTcuanBnXCIpOyB9XG4gIC5jYXJkX19oZWFkaW5nIHtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBmb250LXNpemU6IDIuOHJlbTtcbiAgICBmb250LXdlaWdodDogMzAwO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHRvcDogMTJyZW07XG4gICAgcmlnaHQ6IDJyZW07XG4gICAgd2lkdGg6IDY1JTsgfVxuICAuY2FyZF9faGVhZGluZy1zcGFuIHtcbiAgICBwYWRkaW5nOiAxcmVtIDEuNXJlbTtcbiAgICBib3gtZGVjb3JhdGlvbi1icmVhazogY2xvbmU7XG4gICAgLXdlYmtpdC1ib3gtZGVjb3JhdGlvbi1icmVhazogY2xvbmU7IH1cbiAgICAuY2FyZF9faGVhZGluZy1zcGFuLTEge1xuICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0IGJvdHRvbSwgcmdiYSgyNTUsIDExOSwgNDgsIDAuODUpLCByZ2JhKDI1NSwgMTg1LCAwLCAwLjg1KSk7IH1cbiAgICAuY2FyZF9faGVhZGluZy1zcGFuLTIge1xuICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0IGJvdHRvbSwgcmdiYSgxMjYsIDIxMywgMTExLCAwLjg1KSwgcmdiYSg4NSwgMTk3LCAxMjIsIDAuODUpKTsgfVxuICAgIC5jYXJkX19oZWFkaW5nLXNwYW4tMyB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQgYm90dG9tLCByZ2JhKDQxLCAxNTIsIDI1NSwgMC44NSksIHJnYmEoODYsIDY3LCAyNTAsIDAuODUpKTsgfVxuICAuY2FyZF9fZGV0YWlscyB7XG4gICAgcGFkZGluZzogM3JlbTsgfVxuICAgIC5jYXJkX19kZXRhaWxzIHVsIHtcbiAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICB3aWR0aDogODAlO1xuICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICBjb2xvcjogIzc3NzsgfVxuICAgICAgLmNhcmRfX2RldGFpbHMgdWwgbGkge1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgICAgICBwYWRkaW5nOiAxcmVtOyB9XG4gICAgICAgIC5jYXJkX19kZXRhaWxzIHVsIGxpOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCAjZjdmN2Y3IHNvbGlkOyB9XG4gIC5jYXJkX19jdGEge1xuICAgIHRvcDogNTAlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgd2lkdGg6IDcwJTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH1cbiAgLmNhcmRfX3ByaWNlLWJveCB7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgbWFyZ2luLWJvdHRvbTogOHJlbTsgfVxuICAuY2FyZF9fcHJpY2Utb25seSB7XG4gICAgZm9udC1zaXplOiAxLjRyZW07XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH1cbiAgLmNhcmRfX3ByaWNlLXZhbHVlIHtcbiAgICBmb250LXNpemU6IDZyZW07XG4gICAgZm9udC13ZWlnaHQ6IDEwMDsgfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pLCBvbmx5IHNjcmVlbiBhbmQgKGhvdmVyOiBub25lKSB7XG4gICAgLmNhcmQge1xuICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMS41cmVtIDRyZW0gcmdiYSgwLCAwLCAwLCAwLjE1KTsgfVxuICAgICAgLmNhcmRfX3NpZGUge1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsgfVxuICAgICAgICAuY2FyZF9fc2lkZS0tYmFjayB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGVZKDApO1xuICAgICAgICAgIGNsaXAtcGF0aDogcG9seWdvbigwIDE1JSwgMTAwJSAwLCAxMDAlIDEwMCUsIDAgMTAwJSk7IH1cbiAgICAgIC5jYXJkOmhvdmVyIC5jYXJkX19zaWRlLS1mcm9udCB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlWSgwKTsgfVxuICAgICAgLmNhcmRfX2N0YSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCk7XG4gICAgICAgIHBhZGRpbmctdG9wOiA3cmVtO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3JlbTsgfVxuICAgICAgLmNhcmRfX3ByaWNlLWJveCB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwOyB9XG4gICAgICAuY2FyZF9fcHJpY2UtdmFsdWUge1xuICAgICAgICBmb250LXNpemU6IDRyZW07IH1cbiAgICAgIC5jYXJkX19wcmljZS1vbmx5IHtcbiAgICAgICAgbWFyZ2luOiAwOyB9IH1cblxuLmNvbXBvc2l0aW9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG4gIC5jb21wb3NpdGlvbl9fcGhvdG8ge1xuICAgIHdpZHRoOiA1NSU7XG4gICAgYm94LXNoYWRvdzogMCAxLjVyZW0gNHJlbSByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAxMDtcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjJzO1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycmVtOyB9XG4gICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgICAuY29tcG9zaXRpb25fX3Bob3RvIHtcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgd2lkdGg6IDMzLjMzMzMlO1xuICAgICAgICBib3gtc2hhZG93OiAwIDEuNXJlbSAzcmVtIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIC4yOyB9IH1cbiAgICAuY29tcG9zaXRpb25fX3Bob3RvLS1wMSB7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgdG9wOiAtMnJlbTsgfVxuICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgICAgIC5jb21wb3NpdGlvbl9fcGhvdG8tLXAxIHtcbiAgICAgICAgICB0b3A6IDByZW07XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpOyB9IH1cbiAgICAuY29tcG9zaXRpb25fX3Bob3RvLS1wMiB7XG4gICAgICByaWdodDogMDtcbiAgICAgIHRvcDogMnJlbTsgfVxuICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgICAgIC5jb21wb3NpdGlvbl9fcGhvdG8tLXAyIHtcbiAgICAgICAgICB0b3A6IDByZW07XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjMpO1xuICAgICAgICAgIHotaW5kZXg6IDIwMDA7IH0gfVxuICAgIC5jb21wb3NpdGlvbl9fcGhvdG8tLXAzIHtcbiAgICAgIGxlZnQ6IDIwJTtcbiAgICAgIHRvcDogMTByZW07IH1cbiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgICAgICAuY29tcG9zaXRpb25fX3Bob3RvLS1wMyB7XG4gICAgICAgICAgdG9wOiAwcmVtO1xuICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpOyB9IH1cbiAgICAuY29tcG9zaXRpb25fX3Bob3RvOmhvdmVyIHtcbiAgICAgIG91dGxpbmU6IDEuNXJlbSBzb2xpZCAjN2VkNTZmO1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMi41cmVtIDRyZW0gcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgICAgei1pbmRleDogMjA7IH1cbiAgLmNvbXBvc2l0aW9uOmhvdmVyIC5jb21wb3NpdGlvbl9fcGhvdG86bm90KDpob3Zlcikge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45KTsgfVxuXG4uZmVhdHVyZS1ib3gge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xuICBwYWRkaW5nOiAyLjVyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3gtc2hhZG93OiAwIDEuNXJlbSA0cmVtIHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuM3M7IH1cbiAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgLmZlYXR1cmUtYm94IHtcbiAgICAgIHBhZGRpbmc6IDJyZW07IH0gfVxuICAuZmVhdHVyZS1ib3hfX2ljb24ge1xuICAgIGZvbnQtc2l6ZTogNnJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAuNXJlbTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjNTVjNTdhLCAjMjhiNDg1KTtcbiAgICAtd2Via2l0LWJhY2tncm91bmQtY2xpcDogdGV4dDtcbiAgICBiYWNrZ3JvdW5kLWNsaXA6IHRleHQ7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50OyB9XG4gIC5mZWF0dXJlLWJveDpob3ZlciB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjVyZW0pOyB9XG5cbi5mb3JtX19ncm91cDpub3QoOmxhc3QtY2hpbGQpIHtcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTsgfVxuXG4uZm9ybV9faW5wdXQge1xuICBmb250LXNpemU6IDEuNXJlbTtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBwYWRkaW5nOiAxLjVyZW0gMnJlbTtcbiAgYm9yZGVyLXJhZGl1czogLjJyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLWJvdHRvbTogMC4zcmVtIHNvbGlkIHRyYW5zcGFyZW50O1xuICB3aWR0aDogNzUlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgdHJhbnNmb3JtOiBhbGwgLjNzOyB9XG4gIC5mb3JtX19pbnB1dDpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwLjFyZW0gMnJlbSByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICM3ZWQ1NmY7IH1cbiAgLmZvcm1fX2lucHV0OmZvY3VzOmludmFsaWQge1xuICAgIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjZmY3NzMwOyB9XG4gIC5mb3JtX19pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6ICM5OTk7IH1cblxuLmZvcm1fX2xhYmVsIHtcbiAgZm9udC1zaXplOiAxLjJyZW07XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIG1hcmdpbi1sZWZ0OiAycmVtO1xuICBtYXJnaW4tdG9wOiAuN3JlbTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHRyYW5zaXRpb246IGFsbCAuM3M7IH1cblxuLmZvcm1fX2lucHV0OnBsYWNlaG9sZGVyLXNob3duICsgLmZvcm1fX2xhYmVsIHtcbiAgb3BhY2l0eTogMDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTRyZW0pOyB9XG5cbi5mb3JtX19yYWRpby1pbnB1dCB7XG4gIGRpc3BsYXk6IG5vbmU7IH1cblxuLmZvcm1fX3JhZGlvLWdyb3VwIHtcbiAgd2lkdGg6IDQ5JTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzVlbSkge1xuICAgIC5mb3JtX19yYWRpby1ncm91cCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIG1hcmdpbi1ib3R0b206IDNyZW07IH0gfVxuXG4uZm9ybV9fcmFkaW8tbGFiZWwge1xuICBmb250LXNpemU6IDEuNnJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHBhZGRpbmctbGVmdDogNXJlbTsgfVxuXG4uZm9ybV9fcmFkaW8tYnV0dG9uIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgYm9yZGVyOiA1cHggc29saWQgIzdlZDU2ZjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLS40cmVtO1xuICBsZWZ0OiAwO1xuICBib3JkZXItcmFkaXVzOiA1MCU7IH1cbiAgLmZvcm1fX3JhZGlvLWJ1dHRvbjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgaGVpZ2h0OiAxcmVtO1xuICAgIHdpZHRoOiAxcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZWQ1NmY7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjJzOyB9XG5cbi5mb3JtX19yYWRpby1pbnB1dDpjaGVja2VkIH4gLmZvcm1fX3JhZGlvLWxhYmVsIC5mb3JtX19yYWRpby1idXR0b246OmFmdGVyIHtcbiAgb3BhY2l0eTogMTsgfVxuXG4vKiBIZWFkZXIgVGl0bGUgKi9cbi5oZWFkaW5nLXByaW1hcnkge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgLyogTWFrZXMgYW5pbWF0aW9uIHNtb290aGVyICovXG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgbWFyZ2luLWJvdHRvbTogNnJlbTsgfVxuICAuaGVhZGluZy1wcmltYXJ5LS1tYWluIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBmb250LXNpemU6IDZyZW07XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBsZXR0ZXItc3BhY2luZzogMy41cmVtO1xuICAgIGFuaW1hdGlvbi1uYW1lOiBtb3ZlSW5MZWZ0O1xuICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMXM7XG4gICAgLyogYW5pbWF0aW9uLWRlbGF5OiAzczsgKi9cbiAgICAvKiBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAzOyAqL1xuICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47IH1cbiAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDM3LjVlbSkge1xuICAgICAgLmhlYWRpbmctcHJpbWFyeS0tbWFpbiB7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAxcmVtO1xuICAgICAgICBmb250LXNpemU6IDVyZW07IH0gfVxuICAuaGVhZGluZy1wcmltYXJ5LS1zZWNvbmRyeSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZm9udC1zaXplOiAycmVtO1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgbGV0dGVyLXNwYWNpbmc6IDEuN3JlbTtcbiAgICBhbmltYXRpb246IG1vdmVJblJpZ2h0IDFzIGVhc2UtaW47IH1cbiAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDM3LjVlbSkge1xuICAgICAgLmhlYWRpbmctcHJpbWFyeS0tc2Vjb25kcnkge1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogLjVyZW07IH0gfVxuXG4uaGVhZGluZy1zZWNvbmRhcnkge1xuICBmb250LXNpemU6IDMuNXJlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICM1NWM1N2EsICMyOGI0ODUpO1xuICAtd2Via2l0LWJhY2tncm91bmQtY2xpcDogdGV4dDtcbiAgYmFja2dyb3VuZC1jbGlwOiB0ZXh0O1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGxldHRlci1zcGFjaW5nOiAuMnJlbTtcbiAgdHJhbnNmb3JtOiBhbGwgLjJzOyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC5oZWFkaW5nLXNlY29uZGFyeSB7XG4gICAgICBmb250LXNpemU6IDNyZW07IH0gfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDM3LjVlbSkge1xuICAgIC5oZWFkaW5nLXNlY29uZGFyeSB7XG4gICAgICBmb250LXNpemU6IDIuNXJlbTsgfSB9XG4gIC5oZWFkaW5nLXNlY29uZGFyeTpob3ZlciB7XG4gICAgdHJhbnNmb3JtOiBza2V3WSgyZGVnKSBzY2FsZSgxLjEpO1xuICAgIHRleHQtc2hhZG93OiAwLjVyZW0gMXJlbSAycmVtIHJnYmEoMCwgMCwgMCwgMC4yKTsgfVxuXG4uaGVhZGluZy10ZXJ0aWFyeSB7XG4gIGZvbnQtc2l6ZTogMS42cmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9XG5cbi5wb3B1cCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTtcbiAgaGVpZ2h0OiAxMDB2aDtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICB6LWluZGV4OiAzMDAwO1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIHRyYW5zaXRpb246IGFsbCAuM3M7IH1cbiAgQHN1cHBvcnRzICgtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KSkgb3IgKGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KSkge1xuICAgIC5wb3B1cCB7XG4gICAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTtcbiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsgfSB9XG4gIC5wb3B1cDp0YXJnZXQge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTsgfVxuICAucG9wdXA6dGFyZ2V0IC5wb3B1cF9fbW9kYWwge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMSk7IH1cbiAgLnBvcHVwX19jbG9zZTpsaW5rLCAucG9wdXBfX2Nsb3NlOnZpc2l0ZWQge1xuICAgIGNvbG9yOiAjNzc3O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMi41cmVtO1xuICAgIGZvbnQtc2l6ZTogM3JlbTtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRyYW5zZm9ybTogYWxsIC4ycztcbiAgICBsaW5lLWhlaWdodDogMTsgfVxuICAucG9wdXBfX2Nsb3NlIDpob3ZlciB7XG4gICAgY29sb3I6ICM5OTk7IH1cbiAgLnBvcHVwX19tb2RhbCB7XG4gICAgdG9wOiA1MCU7XG4gICAgbGVmdDogNTAlO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIHdpZHRoOiA3NSU7XG4gICAgYm94LXNoYWRvdzogMCAycmVtIDRyZW0gcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgIGRpc3BsYXk6IHRhYmxlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm9yZGVyLXJhZGl1czogLjNyZW07XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgwLjUpO1xuICAgIHRyYW5zaXRpb246IGFsbCAuMnMgLjJzOyB9XG4gIC5wb3B1cF9faW1hZ2VzIHtcbiAgICB3aWR0aDogMzMuMzMzMzMzMzMzJTtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOyB9XG4gICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NWVtKSB7XG4gICAgICAucG9wdXBfX2ltYWdlcyB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7IH0gfVxuICAucG9wdXBfX2ltYWdlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTsgfVxuICAucG9wdXBfX2NvbnRlbnQge1xuICAgIHdpZHRoOiA2Ni42NjY2NjY2NjY2JTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIHBhZGRpbmc6IDFyZW0gM2VtOyB9XG4gIC5wb3B1cF9fdGV4dCB7XG4gICAgZm9udC1zaXplOiAxLjRyZW07XG4gICAgbWFyZ2luLWJvdHRvbTogNHJlbTtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIC1tb3otY29sdW1uLWNvdW50OiAyO1xuICAgIC1tb3otY29sdW1uLWdhcDogNHJlbTtcbiAgICAtbW96LWNvbHVtbi1ydWxlOiAxcHggc29saWQgI2Y3ZjdmNztcbiAgICBjb2x1bW4tY291bnQ6IDI7XG4gICAgY29sdW1uLWdhcDogNHJlbTtcbiAgICBjb2x1bW4tcnVsZTogMXB4IHNvbGlkICNmN2Y3Zjc7XG4gICAgLW1vei1oeXBoZW5zOiBhdXRvO1xuICAgIC1tcy1oeXBoZW5zOiBhdXRvO1xuICAgIC13ZWJraXQtaHlwaGVuczogYXV0bztcbiAgICBoeXBoZW5zOiBhdXRvOyB9XG5cbi5zdG9yeSB7XG4gIHdpZHRoOiA3NSU7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBib3gtc2hhZG93OiAwIDNyZW0gNnJlbSByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KTtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBwYWRkaW5nOiA2cmVtO1xuICBwYWRkaW5nLWxlZnQ6IDlyZW07XG4gIGZvbnQtc2l6ZTogMS42cmVtO1xuICB0cmFuc2Zvcm06IHNrZXdYKC0xMmRlZyk7IH1cbiAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgLnN0b3J5IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgcGFkZGluZzogNHJlbTtcbiAgICAgIHBhZGRpbmctbGVmdDogMDsgfSB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzcuNWVtKSB7XG4gICAgLnN0b3J5IHtcbiAgICAgIHRyYW5zZm9ybTogc2tld1goMCk7IH0gfVxuICAuc3RvcnlfX3NoYXBlIHtcbiAgICB3aWR0aDogMTVyZW07XG4gICAgaGVpZ2h0OiAxNXJlbTtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTNyZW0pIHNrZXdYKDEyZGVnKTtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7IH1cbiAgICBAc3VwcG9ydHMgKGNsaXAtcGF0aDogcG9seWdvbigwLCAwKSkgb3IgKC13ZWJraXQtY2xpcC1wYXRoOiBwb2x5Z29uKDAgMCkpIHtcbiAgICAgIC5zdG9yeV9fc2hhcGUge1xuICAgICAgICBjbGlwLXBhdGg6IGNpcmNsZSg1MCUgYXQgNTAlIDUwJSk7XG4gICAgICAgIC13ZWJraXQtY2xpcC1wYXRoOiBjaXJjbGUoNTAlIGF0IDUwJSA1MCUpO1xuICAgICAgICAtd2Via2l0LXNoYXBlLW91dHNpZGU6IGNpcmNsZSg1MCUgYXQgNTAlIDUwJSk7XG4gICAgICAgIHNoYXBlLW91dHNpZGU6IGNpcmNsZSg1MCUgYXQgNTAlIDUwJSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7IH0gfVxuICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzcuNWVtKSB7XG4gICAgICAuc3RvcnlfX3NoYXBlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zcmVtKSBza2V3WCgwKTsgfSB9XG4gIC5zdG9yeV9faW1nIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC00cmVtKSBzY2FsZSgxLjQpO1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjVzOyB9XG4gIC5zdG9yeV9fdGV4dCB7XG4gICAgdHJhbnNmb3JtOiBza2V3WCgxMmRlZyk7IH1cbiAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDM3LjVlbSkge1xuICAgICAgLnN0b3J5X190ZXh0IHtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgwKTsgfSB9XG4gIC5zdG9yeV9fY2FwdGlvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGZvbnQtc2l6ZTogMS43cmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDIwJSk7XG4gICAgdHJhbnNpdGlvbjogYWxsIC41cztcbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgLnN0b3J5OmhvdmVyIC5zdG9yeV9fY2FwdGlvbiB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgfVxuICAuc3Rvcnk6aG92ZXIgLnN0b3J5X19pbWcge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBmaWx0ZXI6IGJsdXIoM3B4KSBicmlnaHRuZXNzKDgwJSk7IH1cblxuLmZvb3RlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gIHBhZGRpbmc6IDEwcmVtIDA7XG4gIGZvbnQtc2l6ZTogMS40cmVtO1xuICBjb2xvcjogI2Y3ZjdmNzsgfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pIHtcbiAgICAuZm9vdGVyIHtcbiAgICAgIHBhZGRpbmc6IDEwcmVtIDJyZW07IH0gfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pIHtcbiAgICAuZm9vdGVyIHtcbiAgICAgIHBhZGRpbmc6IDhyZW0gMDsgfSB9XG4gIC5mb290ZXJfX2xvZ28tYm94IHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgbWFyZ2luLWJvdHRvbTogOHJlbTsgfVxuICAuZm9vdGVyX19sb2dvIHtcbiAgICB3aWR0aDogMTVyZW07IH1cbiAgLmZvb3Rlcl9fbmF2aWdhdGlvbiB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmN2Y3Zjc7XG4gICAgcGFkZGluZy10b3A6IDJyZW07XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9XG4gICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgICAuZm9vdGVyX19uYXZpZ2F0aW9uIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgfSB9XG4gIC5mb290ZXJfX2xpc3Qge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgcGFkZGluZzogMDsgfVxuICAgIC5mb290ZXJfX2xpc3RfX2l0ZW0ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9XG4gICAgICAuZm9vdGVyX19saXN0X19pdGVtOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEuNXJlbTsgfVxuICAuZm9vdGVyX19saW5rOmxpbmssIC5mb290ZXJfX2xpbms6dmlzaXRlZCB7XG4gICAgY29sb3I6ICNmN2Y3Zjc7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRyYW5zaXRpb246IGFsbCAuMnM7IH1cbiAgLmZvb3Rlcl9fbGluazpob3ZlciwgLmZvb3Rlcl9fbGluazphY3RpdmUge1xuICAgIGNvbG9yOiAjN2VkNTZmO1xuICAgIGJveC1zaGFkb3c6IDAgMXJlbSAycmVtIHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKSBzY2FsZSgxLjMpOyB9XG4gIC5mb290ZXJfX2NvcHlyaWdodCB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmN2Y3Zjc7XG4gICAgcGFkZGluZy10b3A6IDJyZW07XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiA4MCU7XG4gICAgZmxvYXQ6IHJpZ2h0OyB9XG4gICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgICAuZm9vdGVyX19jb3B5cmlnaHQge1xuICAgICAgICBmbG9hdDogbm9uZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7IH0gfVxuXG4ucm93IHtcbiAgbWF4LXdpZHRoOiAxMTRyZW07XG4gIG1hcmdpbjogMCBhdXRvOyB9XG4gIC5yb3c6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgbWFyZ2luLWJvdHRvbTogOHJlbTsgfVxuICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgICAgLnJvdzpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNnJlbTsgfSB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC5yb3cge1xuICAgICAgbWF4LXdpZHRoOiA1MHJlbTtcbiAgICAgIHBhZGRpbmc6IDAgM3JlbTsgfSB9XG4gIC5yb3c6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgZGlzcGxheTogdGFibGU7XG4gICAgY2xlYXI6IGJvdGg7IH1cbiAgLnJvdyBbY2xhc3NePVwiY29sLVwiXSB7XG4gICAgZmxvYXQ6IGxlZnQ7IH1cbiAgICAucm93IFtjbGFzc149XCJjb2wtXCJdOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgICAgbWFyZ2luLXJpZ2h0OiA2cmVtOyB9XG4gICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pIHtcbiAgICAgICAgLnJvdyBbY2xhc3NePVwiY29sLVwiXTpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogNnJlbTsgfSB9XG4gICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1Ni4yNWVtKSB7XG4gICAgICAucm93IFtjbGFzc149XCJjb2wtXCJdIHtcbiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfSB9XG4gIC5yb3cgLmNvbC0xLW9mLTIge1xuICAgIHdpZHRoOiBjYWxjKCgxMDAlIC0gNnJlbSkgLyAyKTsgfVxuICAucm93IC5jb2wtMS1vZi0zIHtcbiAgICB3aWR0aDogY2FsYygoMTAwJSAtIDIgKiA2cmVtKSAvIDMpOyB9XG4gIC5yb3cgLmNvbC0yLW9mLTMge1xuICAgIHdpZHRoOiBjYWxjKDIgKiAoKDEwMCUgLSAyICogNnJlbSkgLyAzKSArIDZyZW0pOyB9XG4gIC5yb3cgLmNvbC0xLW9mLTQge1xuICAgIHdpZHRoOiBjYWxjKCgxMDAlIC0gMyAqIDZyZW0pIC8gNCk7IH1cbiAgLnJvdyAuY29sLTItb2YtNCB7XG4gICAgd2lkdGg6IGNhbGMoMiAqICgoMTAwJSAtIDMgKiA2cmVtKSAvIDQpICsgNnJlbSk7IH1cbiAgLnJvdyAuY29sLTMtb2YtNCB7XG4gICAgd2lkdGg6IGNhbGMoMyAqICgoMTAwJSAtIDMgKiA2cmVtKSAvIDQpICsgMiAqIDZyZW0pOyB9XG5cbi8qIEhlYWRlciAqL1xuLmhlYWRlciB7XG4gIGhlaWdodDogODV2aDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0IGJvdHRvbSwgcmdiYSg4NSwgMTk3LCAxMjIsIDAuOCksIHJnYmEoNDAsIDE4MCwgMTMzLCAwLjgpKSwgdXJsKC4uL2ltZy9oZXJvLXNtYWxsLmpwZyk7XG4gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcDtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG4gIEBzdXBwb3J0cyAoY2xpcC1wYXRoOiBwb2x5Z29uKDAgMCkpIG9yICgtd2Via2l0LWNsaXAtcGF0aDogcG9seWdvbigwIDApKSB7XG4gICAgLmhlYWRlciB7XG4gICAgICAtd2Via2l0LWNsaXAtcGF0aDogcG9seWdvbigwIDAsIDEwMCUgMCwgMTAwJSA3NXZoLCAwIDEwMCUpO1xuICAgICAgY2xpcC1wYXRoOiBwb2x5Z29uKDAgMCwgMTAwJSAwLCAxMDAlIDc1dmgsIDAgMTAwJSk7XG4gICAgICBoZWlnaHQ6IDk1dmg7IH0gfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSBhbmQgKG1pbi13aWR0aDogMzcuNWVtKSwgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpIGFuZCAobWluLXdpZHRoOiAzNy41ZW0pLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI1ZW0pIHtcbiAgICAuaGVhZGVyIHtcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCBib3R0b20sIHJnYmEoODUsIDE5NywgMTIyLCAwLjgpLCByZ2JhKDQwLCAxODAsIDEzMywgMC44KSksIHVybCguLi9pbWcvaGVyby5qcGcpOyB9IH1cbiAgLmhlYWRlcl9fbG9nby1ib3gge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDRyZW07XG4gICAgbGVmdDogNHJlbTsgfVxuICAuaGVhZGVyX19sb2dvIHtcbiAgICBoZWlnaHQ6IDMuNXJlbTsgfVxuICAuaGVhZGVyX19tYWluIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA0MCU7XG4gICAgbGVmdDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjsgfVxuXG4ubmF2aWdhdGlvbl9fY2hlY2tib3gge1xuICBkaXNwbGF5OiBub25lOyB9XG5cbi5uYXZpZ2F0aW9uX19idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBoZWlnaHQ6IDdyZW07XG4gIHdpZHRoOiA3cmVtO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogNnJlbTtcbiAgcmlnaHQ6IDZyZW07XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgei1pbmRleDogMjAwMDtcbiAgYm94LXNoYWRvdzogMCAxcmVtIDNyZW0gcmdiYSgwLCAwLCAwLCAwLjEpO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjsgfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pIHtcbiAgICAubmF2aWdhdGlvbl9fYnV0dG9uIHtcbiAgICAgIHRvcDogNHJlbTtcbiAgICAgIHJpZ2h0OiA0cmVtOyB9IH1cbiAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzNy41ZW0pIHtcbiAgICAubmF2aWdhdGlvbl9fYnV0dG9uIHtcbiAgICAgIHRvcDogM3JlbTtcbiAgICAgIHJpZ2h0OiAzcmVtOyB9IH1cblxuLm5hdmlnYXRpb25fX2JhY2tncm91bmQge1xuICBoZWlnaHQ6IDZyZW07XG4gIHdpZHRoOiA2cmVtO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiA2LjVyZW07XG4gIHJpZ2h0OiA2LjVyZW07XG4gIGJhY2tncm91bmQtaW1hZ2U6IHJhZGlhbC1ncmFkaWVudCgjNTVjNTdhLCAjMjhiNDg1KTtcbiAgei1pbmRleDogMTAwMDtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuOHMgY3ViaWMtYmV6aWVyKDAuODYsIDAsIDAuMDcsIDEpOyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC5uYXZpZ2F0aW9uX19iYWNrZ3JvdW5kIHtcbiAgICAgIHRvcDogNC41cmVtO1xuICAgICAgcmlnaHQ6IDQuNXJlbTsgfSB9XG5cbi5uYXZpZ2F0aW9uX19uYXYge1xuICBoZWlnaHQ6IDEwMHZoO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIHotaW5kZXg6IDE1MDA7XG4gIG9wYWNpdHk6IDA7XG4gIHdpZHRoOiAwO1xuICB0cmFuc2l0aW9uOiBhbGwgLjhzOyB9XG5cbi5uYXZpZ2F0aW9uX19saXN0IHtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMTAwJTsgfVxuXG4ubmF2aWdhdGlvbl9faXRlbSB7XG4gIG1hcmdpbjogMXJlbTsgfVxuXG4ubmF2aWdhdGlvbl9fbGluazpsaW5rLCAubmF2aWdhdGlvbl9fbGluazp2aXNpdGVkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXNpemU6IDNyZW07XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIHBhZGRpbmc6IDFyZW0gMnJlbTtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDEyMGRlZywgdHJhbnNwYXJlbnQgMCUsIHRyYW5zcGFyZW50IDUwJSwgI2ZmZiA1MCUpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDIyNSU7XG4gIHRyYW5zaXRpb246IGFsbCAuNHM7IH1cbiAgLm5hdmlnYXRpb25fX2xpbms6bGluayBzcGFuLCAubmF2aWdhdGlvbl9fbGluazp2aXNpdGVkIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tcmlnaHQ6IDEuNXJlbTsgfVxuXG4ubmF2aWdhdGlvbl9fbGluazpob3ZlciwgLm5hdmlnYXRpb25fX2xpbmsgYTphY3RpdmUge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlO1xuICBjb2xvcjogIzdlZDU2ZjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDFyZW0pOyB9XG5cbi5uYXZpZ2F0aW9uX19jaGVja2JveDpjaGVja2VkIH4gLm5hdmlnYXRpb25fX2JhY2tncm91bmQge1xuICB0cmFuc2Zvcm06IHNjYWxlKDgwKTsgfVxuXG4ubmF2aWdhdGlvbl9fY2hlY2tib3g6Y2hlY2tlZCB+IC5uYXZpZ2F0aW9uX19uYXYge1xuICBvcGFjaXR5OiAxO1xuICB3aWR0aDogMTAwJTsgfVxuXG4ubmF2aWdhdGlvbl9faWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luLXRvcDogMy41cmVtOyB9XG4gIC5uYXZpZ2F0aW9uX19pY29uLCAubmF2aWdhdGlvbl9faWNvbjo6YmVmb3JlLCAubmF2aWdhdGlvbl9faWNvbjo6YWZ0ZXIge1xuICAgIHdpZHRoOiAzcmVtO1xuICAgIGhlaWdodDogLjJyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzc3NztcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH1cbiAgLm5hdmlnYXRpb25fX2ljb246OmJlZm9yZSwgLm5hdmlnYXRpb25fX2ljb246OmFmdGVyIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRyYW5zaXRpb246IGFsbCAuMnM7IH1cbiAgLm5hdmlnYXRpb25fX2ljb246OmJlZm9yZSB7XG4gICAgdG9wOiAtLjhyZW07IH1cbiAgLm5hdmlnYXRpb25fX2ljb246OmFmdGVyIHtcbiAgICB0b3A6IC44cmVtOyB9XG5cbi5uYXZpZ2F0aW9uX19idXR0b246aG92ZXIgLm5hdmlnYXRpb25fX2ljb246OmJlZm9yZSB7XG4gIHRvcDogLTFyZW07IH1cblxuLm5hdmlnYXRpb25fX2J1dHRvbjpob3ZlciAubmF2aWdhdGlvbl9faWNvbjo6YWZ0ZXIge1xuICB0b3A6IDFyZW07IH1cblxuLm5hdmlnYXRpb25fX2NoZWNrYm94OmNoZWNrZWQgKyAubmF2aWdhdGlvbl9fYnV0dG9uIC5uYXZpZ2F0aW9uX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cblxuLm5hdmlnYXRpb25fX2NoZWNrYm94OmNoZWNrZWQgKyAubmF2aWdhdGlvbl9fYnV0dG9uIC5uYXZpZ2F0aW9uX19pY29uOjpiZWZvcmUge1xuICB0b3A6IDA7XG4gIHRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7IH1cblxuLm5hdmlnYXRpb25fX2NoZWNrYm94OmNoZWNrZWQgKyAubmF2aWdhdGlvbl9fYnV0dG9uIC5uYXZpZ2F0aW9uX19pY29uOjphZnRlciB7XG4gIHRvcDogMDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoLTEzNWRlZyk7IH1cblxuLnNlY3Rpb24tYWJvdXQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3O1xuICBwYWRkaW5nOiAyNXJlbSAwO1xuICBtYXJnaW4tdG9wOiAtMjB2aDsgfVxuICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2LjI1ZW0pIHtcbiAgICAuc2VjdGlvbi1hYm91dCB7XG4gICAgICBwYWRkaW5nOiAxMHJlbSAwOyB9IH1cblxuLnNlY3Rpb24tZmVhdHVyZXMge1xuICBwYWRkaW5nOiAyMHJlbSAwO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQgYm90dG9tLCByZ2JhKDg1LCAxOTcsIDEyMiwgMC44KSwgcmdiYSg0MCwgMTgwLCAxMzMsIDAuOCkpLCB1cmwoLi4vaW1nL25hdC00LmpwZyk7XG4gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4gIG1hcmdpbi10b3A6IC0xMHJlbTtcbiAgdHJhbnNmb3JtOiBza2V3WSgtN2RlZyk7IH1cbiAgLnNlY3Rpb24tZmVhdHVyZXMgPiAqIHtcbiAgICB0cmFuc2Zvcm06IHNrZXdZKDdkZWcpOyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC5zZWN0aW9uLWZlYXR1cmVzIHtcbiAgICAgIHBhZGRpbmc6IDEwcmVtIDA7IH0gfVxuXG4uc2VjdGlvbi10b3VycyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7XG4gIHBhZGRpbmc6IDI1cmVtIDAgMTVyZW0gMDtcbiAgbWFyZ2luLXRvcDogLTEwcmVtOyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC5zZWN0aW9uLXRvdXJzIHtcbiAgICAgIHBhZGRpbmc6IDE1cmVtIDA7IH0gfVxuXG4uc2VjdGlvbi1zdG9yaWVzIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiAxNXJlbSAwOyB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC5zZWN0aW9uLXN0b3JpZXMge1xuICAgICAgcGFkZGluZzogMTByZW0gMDsgfSB9XG5cbi5zZWN0aW9uLWJvb2tpbmcge1xuICBwYWRkaW5nOiAxNXJlbSAwO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQgYm90dG9tLCAjNTVjNTdhLCAjMjhiNDg1KTsgfVxuXG4uYm9vayB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgxMDVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KSAwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpIDUwJSwgdHJhbnNwYXJlbnQgNTAlKSwgdXJsKC4uL2ltZy9uYXQtMTAuanBnKTtcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJveC1zaGFkb3c6IDAgMS41cmVtIDRyZW0gYmxhY2s7XG4gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7IH1cbiAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NWVtKSB7XG4gICAgLmJvb2sge1xuICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDEwNWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpIDAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSkgNzAlLCB0cmFuc3BhcmVudCA3MCUpLCB1cmwoLi4vaW1nL25hdC0xMC5qcGcpO1xuICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsgfSB9XG4gIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTYuMjVlbSkge1xuICAgIC5ib29rIHtcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpIDAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSkgMTAwJSksIHVybCguLi9pbWcvbmF0LTEwLmpwZyk7IH0gfVxuICAuYm9va19fZm9ybSB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBwYWRkaW5nOiA2cmVtOyB9XG4gICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NWVtKSB7XG4gICAgICAuYm9va19fZm9ybSB7XG4gICAgICAgIHdpZHRoOiA5MCU7IH0gfVxuIl19 */
\ No newline at end of file
diff --git a/grid-example.html b/grid-example.html
new file mode 100644
index 0000000..4336df1
--- /dev/null
+++ b/grid-example.html
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ GRID Example
+
+
+
+
+
+ 1 of 2
+
+
+ 1 of 2
+
+
+
+
+ 1 of 3
+
+
+ 1 of 3
+
+
+ 1 of 3
+
+
+
+
+ 1 of 3
+
+
+ 2 of 3
+
+
+
+
+ 1 of 4
+
+
+ 1 of 4
+
+
+ 1 of 4
+
+
+ 1 of 4
+
+
+
+
+ 1 of 4
+
+
+ 1 of 4
+
+
+ 2 of 4
+
+
+
+
+ 1 of 4
+
+
+ 3 of 4
+
+
+
+
+
diff --git a/img/favicon.png b/img/favicon.png
new file mode 100644
index 0000000..0ccb9a6
Binary files /dev/null and b/img/favicon.png differ
diff --git a/img/hero-small.jpg b/img/hero-small.jpg
new file mode 100644
index 0000000..f703c18
Binary files /dev/null and b/img/hero-small.jpg differ
diff --git a/img/hero.jpg b/img/hero.jpg
new file mode 100644
index 0000000..0b91dcd
Binary files /dev/null and b/img/hero.jpg differ
diff --git a/img/logo-green-1x.png b/img/logo-green-1x.png
new file mode 100644
index 0000000..de3a31e
Binary files /dev/null and b/img/logo-green-1x.png differ
diff --git a/img/logo-green-2x.png b/img/logo-green-2x.png
new file mode 100644
index 0000000..8d01b96
Binary files /dev/null and b/img/logo-green-2x.png differ
diff --git a/img/logo-green-small-1x.png b/img/logo-green-small-1x.png
new file mode 100644
index 0000000..9639ceb
Binary files /dev/null and b/img/logo-green-small-1x.png differ
diff --git a/img/logo-green-small-2x.png b/img/logo-green-small-2x.png
new file mode 100644
index 0000000..dd8a91e
Binary files /dev/null and b/img/logo-green-small-2x.png differ
diff --git a/img/logo-white.png b/img/logo-white.png
new file mode 100644
index 0000000..865fe23
Binary files /dev/null and b/img/logo-white.png differ
diff --git a/img/nat-1-large.jpg b/img/nat-1-large.jpg
new file mode 100644
index 0000000..4064e17
Binary files /dev/null and b/img/nat-1-large.jpg differ
diff --git a/img/nat-1.jpg b/img/nat-1.jpg
new file mode 100644
index 0000000..4b0919b
Binary files /dev/null and b/img/nat-1.jpg differ
diff --git a/img/nat-10.jpg b/img/nat-10.jpg
new file mode 100644
index 0000000..a01a76b
Binary files /dev/null and b/img/nat-10.jpg differ
diff --git a/img/nat-2-large.jpg b/img/nat-2-large.jpg
new file mode 100644
index 0000000..dff2ba9
Binary files /dev/null and b/img/nat-2-large.jpg differ
diff --git a/img/nat-2.jpg b/img/nat-2.jpg
new file mode 100644
index 0000000..c945721
Binary files /dev/null and b/img/nat-2.jpg differ
diff --git a/img/nat-3-large.jpg b/img/nat-3-large.jpg
new file mode 100644
index 0000000..47e20d1
Binary files /dev/null and b/img/nat-3-large.jpg differ
diff --git a/img/nat-3.jpg b/img/nat-3.jpg
new file mode 100644
index 0000000..843ad85
Binary files /dev/null and b/img/nat-3.jpg differ
diff --git a/img/nat-4.jpg b/img/nat-4.jpg
new file mode 100644
index 0000000..85f681b
Binary files /dev/null and b/img/nat-4.jpg differ
diff --git a/img/nat-5.jpg b/img/nat-5.jpg
new file mode 100644
index 0000000..4b7b256
Binary files /dev/null and b/img/nat-5.jpg differ
diff --git a/img/nat-6.jpg b/img/nat-6.jpg
new file mode 100644
index 0000000..4a4fc19
Binary files /dev/null and b/img/nat-6.jpg differ
diff --git a/img/nat-7.jpg b/img/nat-7.jpg
new file mode 100644
index 0000000..f36bd57
Binary files /dev/null and b/img/nat-7.jpg differ
diff --git a/img/nat-8.jpg b/img/nat-8.jpg
new file mode 100644
index 0000000..8087468
Binary files /dev/null and b/img/nat-8.jpg differ
diff --git a/img/nat-9.jpg b/img/nat-9.jpg
new file mode 100644
index 0000000..4980404
Binary files /dev/null and b/img/nat-9.jpg differ
diff --git a/img/video.mp4 b/img/video.mp4
new file mode 100644
index 0000000..856d9cb
Binary files /dev/null and b/img/video.mp4 differ
diff --git a/img/video.webm b/img/video.webm
new file mode 100644
index 0000000..01b0c85
Binary files /dev/null and b/img/video.webm differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..9f82a64
--- /dev/null
+++ b/index.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Natours | Exciting tours for adventurous people
+
+
+
+
+
+
+
+
+
+ Exciting tours for adventurous people
+
+
+
+
+
+
+ You're going to fall in love with nature.
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Sed, illo voluptatibus rerum iste, delectus ex quam repellendus quas dolor animi fugit, tenetur cum adipisci excepturi deleniti quae consequuntur blanditiis id?
+
+
+ Experience adventures like you never have before
+
+
+ Lorem ipsum, dolor sit amet consectetur adipisicing elit. Possimus magni vel dolore? Exercitationem culpa hic illum molestiae praesentium corporis cupiditate eum architecto veritatis, aspernatur, rem cumque vel ipsa deleniti earum.
+
+
+
Learn More →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Explore The World
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Labore, sint natus enim minima, omnis corporis laboriosam, inventore perferendis earum magni voluptas nobis praesentium ullam impedit itaque alias a facere vitae.
+
+
+
+
+
+
+
+
+ Meet Nature
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Labore, sint natus enim minima, omnis corporis laboriosam, inventore perferendis earum magni voluptas nobis praesentium ullam impedit itaque alias a facere vitae.
+
+
+
+
+
+
+
+
+ Find Your Way
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Labore, sint natus enim minima, omnis corporis laboriosam, inventore perferendis earum magni voluptas nobis praesentium ullam impedit itaque alias a facere vitae.
+
+
+
+
+
+
+
+
+ Live a healthier life
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Labore, sint natus enim minima, omnis corporis laboriosam, inventore perferendis earum magni voluptas nobis praesentium ullam impedit itaque alias a facere vitae.
+
+
+
+
+
+
+
+
+
+
+ Most popular tours
+
+
+
+
+
+
+
+
+
+
+
+ The sea explorer
+
+
+
+
+ 3 day tours
+ Up to 30 people
+ 2 Tour Guides
+ Sleep in cozy hotels
+ Difficulty: Easy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The forest hiker
+
+
+
+
+ 7 day tour
+ Up to 40 people
+ 9 Tour Guides
+ Sleep in tents
+ Difficulty: Medium
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The sea explorer
+
+
+
+
+ 12 day tours
+ Up to 10 people
+ 2 Tour Guides
+ Sleep in tent
+ Difficulty: Hard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Your browser is not supported!
+
+
+
+
+ We make people genueinly happy
+
+
+
+
+
+
+
+ Steve Jones
+
+
+
+
+ I had the best time ever!
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium eum in ut maiores aut eaque neque perferendis at id modi quidem quaerat amet eveniet accusantium, illum accusamus, mollitia consectetur assumenda?
+
+
+
+
+
+
+
+
+
+ Sarah Seagul
+
+
+
+
+ It was rubbish!
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium eum in ut maiores aut eaque neque perferendis at id modi quidem quaerat amet eveniet accusantium, illum accusamus, mollitia consectetur assumenda?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/netlify.toml b/netlify.toml
new file mode 100644
index 0000000..a6f2ce5
--- /dev/null
+++ b/netlify.toml
@@ -0,0 +1,3 @@
+[build]
+ command = "npm run build:css"
+ publish = ""
\ No newline at end of file
diff --git a/node_modules/.bin/atob b/node_modules/.bin/atob
new file mode 100644
index 0000000..59a6bf0
--- /dev/null
+++ b/node_modules/.bin/atob
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../atob/bin/atob.js" "$@"
+ ret=$?
+else
+ node "$basedir/../atob/bin/atob.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/atob.cmd b/node_modules/.bin/atob.cmd
new file mode 100644
index 0000000..b0df169
--- /dev/null
+++ b/node_modules/.bin/atob.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\atob\bin\atob.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/atob.ps1 b/node_modules/.bin/atob.ps1
new file mode 100644
index 0000000..d276879
--- /dev/null
+++ b/node_modules/.bin/atob.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../atob/bin/atob.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../atob/bin/atob.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/autoprefixer b/node_modules/.bin/autoprefixer
new file mode 100644
index 0000000..42d21a8
--- /dev/null
+++ b/node_modules/.bin/autoprefixer
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../autoprefixer/bin/autoprefixer" "$@"
+ ret=$?
+else
+ node "$basedir/../autoprefixer/bin/autoprefixer" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/autoprefixer.cmd b/node_modules/.bin/autoprefixer.cmd
new file mode 100644
index 0000000..0e8c4ed
--- /dev/null
+++ b/node_modules/.bin/autoprefixer.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\autoprefixer\bin\autoprefixer" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/autoprefixer.ps1 b/node_modules/.bin/autoprefixer.ps1
new file mode 100644
index 0000000..7d17191
--- /dev/null
+++ b/node_modules/.bin/autoprefixer.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../autoprefixer/bin/autoprefixer" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../autoprefixer/bin/autoprefixer" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/browserslist b/node_modules/.bin/browserslist
new file mode 100644
index 0000000..5c05ea1
--- /dev/null
+++ b/node_modules/.bin/browserslist
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../browserslist/cli.js" "$@"
+ ret=$?
+else
+ node "$basedir/../browserslist/cli.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/browserslist.cmd b/node_modules/.bin/browserslist.cmd
new file mode 100644
index 0000000..d3f1ca9
--- /dev/null
+++ b/node_modules/.bin/browserslist.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\browserslist\cli.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/browserslist.ps1 b/node_modules/.bin/browserslist.ps1
new file mode 100644
index 0000000..9fb149e
--- /dev/null
+++ b/node_modules/.bin/browserslist.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../browserslist/cli.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../browserslist/cli.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/concat b/node_modules/.bin/concat
new file mode 100644
index 0000000..1fdcd1c
--- /dev/null
+++ b/node_modules/.bin/concat
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../concat/bin/concat" "$@"
+ ret=$?
+else
+ node "$basedir/../concat/bin/concat" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/concat.cmd b/node_modules/.bin/concat.cmd
new file mode 100644
index 0000000..825848b
--- /dev/null
+++ b/node_modules/.bin/concat.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\concat\bin\concat" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/concat.ps1 b/node_modules/.bin/concat.ps1
new file mode 100644
index 0000000..9bb4c1c
--- /dev/null
+++ b/node_modules/.bin/concat.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../concat/bin/concat" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../concat/bin/concat" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/esparse b/node_modules/.bin/esparse
new file mode 100644
index 0000000..735d854
--- /dev/null
+++ b/node_modules/.bin/esparse
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../esprima/bin/esparse.js" "$@"
+ ret=$?
+else
+ node "$basedir/../esprima/bin/esparse.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/esparse.cmd b/node_modules/.bin/esparse.cmd
new file mode 100644
index 0000000..b8c6a63
--- /dev/null
+++ b/node_modules/.bin/esparse.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\esprima\bin\esparse.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/esparse.ps1 b/node_modules/.bin/esparse.ps1
new file mode 100644
index 0000000..567aea3
--- /dev/null
+++ b/node_modules/.bin/esparse.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../esprima/bin/esparse.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../esprima/bin/esparse.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/esvalidate b/node_modules/.bin/esvalidate
new file mode 100644
index 0000000..d278bc7
--- /dev/null
+++ b/node_modules/.bin/esvalidate
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../esprima/bin/esvalidate.js" "$@"
+ ret=$?
+else
+ node "$basedir/../esprima/bin/esvalidate.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/esvalidate.cmd b/node_modules/.bin/esvalidate.cmd
new file mode 100644
index 0000000..74859bd
--- /dev/null
+++ b/node_modules/.bin/esvalidate.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\esprima\bin\esvalidate.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/esvalidate.ps1 b/node_modules/.bin/esvalidate.ps1
new file mode 100644
index 0000000..b1ed174
--- /dev/null
+++ b/node_modules/.bin/esvalidate.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../esprima/bin/esvalidate.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../esprima/bin/esvalidate.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/js-yaml b/node_modules/.bin/js-yaml
new file mode 100644
index 0000000..4537030
--- /dev/null
+++ b/node_modules/.bin/js-yaml
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../js-yaml/bin/js-yaml.js" "$@"
+ ret=$?
+else
+ node "$basedir/../js-yaml/bin/js-yaml.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/js-yaml.cmd b/node_modules/.bin/js-yaml.cmd
new file mode 100644
index 0000000..9597bdf
--- /dev/null
+++ b/node_modules/.bin/js-yaml.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\js-yaml\bin\js-yaml.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/js-yaml.ps1 b/node_modules/.bin/js-yaml.ps1
new file mode 100644
index 0000000..728b322
--- /dev/null
+++ b/node_modules/.bin/js-yaml.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../js-yaml/bin/js-yaml.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../js-yaml/bin/js-yaml.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/live-server b/node_modules/.bin/live-server
new file mode 100644
index 0000000..9f99f1e
--- /dev/null
+++ b/node_modules/.bin/live-server
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../live-server/live-server.js" "$@"
+ ret=$?
+else
+ node "$basedir/../live-server/live-server.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/live-server.cmd b/node_modules/.bin/live-server.cmd
new file mode 100644
index 0000000..9542a46
--- /dev/null
+++ b/node_modules/.bin/live-server.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\live-server\live-server.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/live-server.ps1 b/node_modules/.bin/live-server.ps1
new file mode 100644
index 0000000..ef6c2e3
--- /dev/null
+++ b/node_modules/.bin/live-server.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../live-server/live-server.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../live-server/live-server.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime
new file mode 100644
index 0000000..91e5e16
--- /dev/null
+++ b/node_modules/.bin/mime
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../mime/cli.js" "$@"
+ ret=$?
+else
+ node "$basedir/../mime/cli.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/mime.cmd b/node_modules/.bin/mime.cmd
new file mode 100644
index 0000000..746a279
--- /dev/null
+++ b/node_modules/.bin/mime.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\mime\cli.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/mime.ps1 b/node_modules/.bin/mime.ps1
new file mode 100644
index 0000000..a6f6f47
--- /dev/null
+++ b/node_modules/.bin/mime.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../mime/cli.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../mime/cli.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp
new file mode 100644
index 0000000..bcd333f
--- /dev/null
+++ b/node_modules/.bin/mkdirp
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../mkdirp/bin/cmd.js" "$@"
+ ret=$?
+else
+ node "$basedir/../mkdirp/bin/cmd.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/mkdirp.cmd b/node_modules/.bin/mkdirp.cmd
new file mode 100644
index 0000000..c2c9350
--- /dev/null
+++ b/node_modules/.bin/mkdirp.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\mkdirp\bin\cmd.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/mkdirp.ps1 b/node_modules/.bin/mkdirp.ps1
new file mode 100644
index 0000000..35ce690
--- /dev/null
+++ b/node_modules/.bin/mkdirp.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../mkdirp/bin/cmd.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../mkdirp/bin/cmd.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/node-gyp b/node_modules/.bin/node-gyp
new file mode 100644
index 0000000..68303f9
--- /dev/null
+++ b/node_modules/.bin/node-gyp
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../node-gyp/bin/node-gyp.js" "$@"
+ ret=$?
+else
+ node "$basedir/../node-gyp/bin/node-gyp.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/node-gyp.cmd b/node_modules/.bin/node-gyp.cmd
new file mode 100644
index 0000000..9025417
--- /dev/null
+++ b/node_modules/.bin/node-gyp.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\node-gyp\bin\node-gyp.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/node-gyp.ps1 b/node_modules/.bin/node-gyp.ps1
new file mode 100644
index 0000000..5367845
--- /dev/null
+++ b/node_modules/.bin/node-gyp.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../node-gyp/bin/node-gyp.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../node-gyp/bin/node-gyp.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/node-sass b/node_modules/.bin/node-sass
new file mode 100644
index 0000000..09a024c
--- /dev/null
+++ b/node_modules/.bin/node-sass
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../node-sass/bin/node-sass" "$@"
+ ret=$?
+else
+ node "$basedir/../node-sass/bin/node-sass" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/node-sass.cmd b/node_modules/.bin/node-sass.cmd
new file mode 100644
index 0000000..9711abb
--- /dev/null
+++ b/node_modules/.bin/node-sass.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\node-sass\bin\node-sass" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/node-sass.ps1 b/node_modules/.bin/node-sass.ps1
new file mode 100644
index 0000000..609c622
--- /dev/null
+++ b/node_modules/.bin/node-sass.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../node-sass/bin/node-sass" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../node-sass/bin/node-sass" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt
new file mode 100644
index 0000000..e658aac
--- /dev/null
+++ b/node_modules/.bin/nopt
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../nopt/bin/nopt.js" "$@"
+ ret=$?
+else
+ node "$basedir/../nopt/bin/nopt.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/nopt.cmd b/node_modules/.bin/nopt.cmd
new file mode 100644
index 0000000..c92ec03
--- /dev/null
+++ b/node_modules/.bin/nopt.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\nopt\bin\nopt.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/nopt.ps1 b/node_modules/.bin/nopt.ps1
new file mode 100644
index 0000000..68c40bf
--- /dev/null
+++ b/node_modules/.bin/nopt.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../nopt/bin/nopt.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../nopt/bin/nopt.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/npm-run-all b/node_modules/.bin/npm-run-all
new file mode 100644
index 0000000..5437556
--- /dev/null
+++ b/node_modules/.bin/npm-run-all
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../npm-run-all/bin/npm-run-all/index.js" "$@"
+ ret=$?
+else
+ node "$basedir/../npm-run-all/bin/npm-run-all/index.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/npm-run-all.cmd b/node_modules/.bin/npm-run-all.cmd
new file mode 100644
index 0000000..f17c5a5
--- /dev/null
+++ b/node_modules/.bin/npm-run-all.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\npm-run-all\bin\npm-run-all\index.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/npm-run-all.ps1 b/node_modules/.bin/npm-run-all.ps1
new file mode 100644
index 0000000..098672c
--- /dev/null
+++ b/node_modules/.bin/npm-run-all.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/postcss b/node_modules/.bin/postcss
new file mode 100644
index 0000000..bb6bf99
--- /dev/null
+++ b/node_modules/.bin/postcss
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../postcss-cli/bin/postcss" "$@"
+ ret=$?
+else
+ node "$basedir/../postcss-cli/bin/postcss" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/postcss.cmd b/node_modules/.bin/postcss.cmd
new file mode 100644
index 0000000..e5855d7
--- /dev/null
+++ b/node_modules/.bin/postcss.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\postcss-cli\bin\postcss" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/postcss.ps1 b/node_modules/.bin/postcss.ps1
new file mode 100644
index 0000000..7eba338
--- /dev/null
+++ b/node_modules/.bin/postcss.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../postcss-cli/bin/postcss" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../postcss-cli/bin/postcss" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/rimraf b/node_modules/.bin/rimraf
new file mode 100644
index 0000000..a3e9f71
--- /dev/null
+++ b/node_modules/.bin/rimraf
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../rimraf/bin.js" "$@"
+ ret=$?
+else
+ node "$basedir/../rimraf/bin.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/rimraf.cmd b/node_modules/.bin/rimraf.cmd
new file mode 100644
index 0000000..698f4ba
--- /dev/null
+++ b/node_modules/.bin/rimraf.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\rimraf\bin.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/rimraf.ps1 b/node_modules/.bin/rimraf.ps1
new file mode 100644
index 0000000..a244a80
--- /dev/null
+++ b/node_modules/.bin/rimraf.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../rimraf/bin.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../rimraf/bin.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/run-p b/node_modules/.bin/run-p
new file mode 100644
index 0000000..5ec41fe
--- /dev/null
+++ b/node_modules/.bin/run-p
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../npm-run-all/bin/run-p/index.js" "$@"
+ ret=$?
+else
+ node "$basedir/../npm-run-all/bin/run-p/index.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/run-p.cmd b/node_modules/.bin/run-p.cmd
new file mode 100644
index 0000000..829b91c
--- /dev/null
+++ b/node_modules/.bin/run-p.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\npm-run-all\bin\run-p\index.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/run-p.ps1 b/node_modules/.bin/run-p.ps1
new file mode 100644
index 0000000..78de707
--- /dev/null
+++ b/node_modules/.bin/run-p.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../npm-run-all/bin/run-p/index.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../npm-run-all/bin/run-p/index.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/run-s b/node_modules/.bin/run-s
new file mode 100644
index 0000000..609b3dc
--- /dev/null
+++ b/node_modules/.bin/run-s
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../npm-run-all/bin/run-s/index.js" "$@"
+ ret=$?
+else
+ node "$basedir/../npm-run-all/bin/run-s/index.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/run-s.cmd b/node_modules/.bin/run-s.cmd
new file mode 100644
index 0000000..1ec5d1f
--- /dev/null
+++ b/node_modules/.bin/run-s.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\npm-run-all\bin\run-s\index.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/run-s.ps1 b/node_modules/.bin/run-s.ps1
new file mode 100644
index 0000000..185a907
--- /dev/null
+++ b/node_modules/.bin/run-s.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../npm-run-all/bin/run-s/index.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../npm-run-all/bin/run-s/index.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/sassgraph b/node_modules/.bin/sassgraph
new file mode 100644
index 0000000..cbd1f16
--- /dev/null
+++ b/node_modules/.bin/sassgraph
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../sass-graph/bin/sassgraph" "$@"
+ ret=$?
+else
+ node "$basedir/../sass-graph/bin/sassgraph" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/sassgraph.cmd b/node_modules/.bin/sassgraph.cmd
new file mode 100644
index 0000000..18fe8fa
--- /dev/null
+++ b/node_modules/.bin/sassgraph.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\sass-graph\bin\sassgraph" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/sassgraph.ps1 b/node_modules/.bin/sassgraph.ps1
new file mode 100644
index 0000000..2b832bc
--- /dev/null
+++ b/node_modules/.bin/sassgraph.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../sass-graph/bin/sassgraph" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../sass-graph/bin/sassgraph" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver
new file mode 100644
index 0000000..10497aa
--- /dev/null
+++ b/node_modules/.bin/semver
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../semver/bin/semver" "$@"
+ ret=$?
+else
+ node "$basedir/../semver/bin/semver" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/semver.cmd b/node_modules/.bin/semver.cmd
new file mode 100644
index 0000000..eb3aaa1
--- /dev/null
+++ b/node_modules/.bin/semver.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\semver\bin\semver" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/semver.ps1 b/node_modules/.bin/semver.ps1
new file mode 100644
index 0000000..a3315ff
--- /dev/null
+++ b/node_modules/.bin/semver.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../semver/bin/semver" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../semver/bin/semver" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/sshpk-conv b/node_modules/.bin/sshpk-conv
new file mode 100644
index 0000000..91957fa
--- /dev/null
+++ b/node_modules/.bin/sshpk-conv
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../sshpk/bin/sshpk-conv" "$@"
+ ret=$?
+else
+ node "$basedir/../sshpk/bin/sshpk-conv" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/sshpk-conv.cmd b/node_modules/.bin/sshpk-conv.cmd
new file mode 100644
index 0000000..42f9ce4
--- /dev/null
+++ b/node_modules/.bin/sshpk-conv.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\sshpk\bin\sshpk-conv" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/sshpk-conv.ps1 b/node_modules/.bin/sshpk-conv.ps1
new file mode 100644
index 0000000..d27c311
--- /dev/null
+++ b/node_modules/.bin/sshpk-conv.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-conv" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../sshpk/bin/sshpk-conv" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/sshpk-sign b/node_modules/.bin/sshpk-sign
new file mode 100644
index 0000000..0dd7644
--- /dev/null
+++ b/node_modules/.bin/sshpk-sign
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../sshpk/bin/sshpk-sign" "$@"
+ ret=$?
+else
+ node "$basedir/../sshpk/bin/sshpk-sign" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/sshpk-sign.cmd b/node_modules/.bin/sshpk-sign.cmd
new file mode 100644
index 0000000..17f60de
--- /dev/null
+++ b/node_modules/.bin/sshpk-sign.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\sshpk\bin\sshpk-sign" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/sshpk-sign.ps1 b/node_modules/.bin/sshpk-sign.ps1
new file mode 100644
index 0000000..10d9186
--- /dev/null
+++ b/node_modules/.bin/sshpk-sign.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-sign" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../sshpk/bin/sshpk-sign" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/sshpk-verify b/node_modules/.bin/sshpk-verify
new file mode 100644
index 0000000..04f5d05
--- /dev/null
+++ b/node_modules/.bin/sshpk-verify
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../sshpk/bin/sshpk-verify" "$@"
+ ret=$?
+else
+ node "$basedir/../sshpk/bin/sshpk-verify" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/sshpk-verify.cmd b/node_modules/.bin/sshpk-verify.cmd
new file mode 100644
index 0000000..4b81f35
--- /dev/null
+++ b/node_modules/.bin/sshpk-verify.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\sshpk\bin\sshpk-verify" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/sshpk-verify.ps1 b/node_modules/.bin/sshpk-verify.ps1
new file mode 100644
index 0000000..d5a23e2
--- /dev/null
+++ b/node_modules/.bin/sshpk-verify.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-verify" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../sshpk/bin/sshpk-verify" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/strip-indent b/node_modules/.bin/strip-indent
new file mode 100644
index 0000000..0f0810a
--- /dev/null
+++ b/node_modules/.bin/strip-indent
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../strip-indent/cli.js" "$@"
+ ret=$?
+else
+ node "$basedir/../strip-indent/cli.js" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/strip-indent.cmd b/node_modules/.bin/strip-indent.cmd
new file mode 100644
index 0000000..a5c6285
--- /dev/null
+++ b/node_modules/.bin/strip-indent.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\strip-indent\cli.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/strip-indent.ps1 b/node_modules/.bin/strip-indent.ps1
new file mode 100644
index 0000000..2185fab
--- /dev/null
+++ b/node_modules/.bin/strip-indent.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../strip-indent/cli.js" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../strip-indent/cli.js" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/uuid b/node_modules/.bin/uuid
new file mode 100644
index 0000000..9af3844
--- /dev/null
+++ b/node_modules/.bin/uuid
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../uuid/bin/uuid" "$@"
+ ret=$?
+else
+ node "$basedir/../uuid/bin/uuid" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/uuid.cmd b/node_modules/.bin/uuid.cmd
new file mode 100644
index 0000000..8154f4e
--- /dev/null
+++ b/node_modules/.bin/uuid.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\uuid\bin\uuid" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/uuid.ps1 b/node_modules/.bin/uuid.ps1
new file mode 100644
index 0000000..3fcb264
--- /dev/null
+++ b/node_modules/.bin/uuid.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../uuid/bin/uuid" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../uuid/bin/uuid" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/which b/node_modules/.bin/which
new file mode 100644
index 0000000..12cde79
--- /dev/null
+++ b/node_modules/.bin/which
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ "$basedir/node" "$basedir/../which/bin/which" "$@"
+ ret=$?
+else
+ node "$basedir/../which/bin/which" "$@"
+ ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/which.cmd b/node_modules/.bin/which.cmd
new file mode 100644
index 0000000..0664965
--- /dev/null
+++ b/node_modules/.bin/which.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%" "%dp0%\..\which\bin\which" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/which.ps1 b/node_modules/.bin/which.ps1
new file mode 100644
index 0000000..d023170
--- /dev/null
+++ b/node_modules/.bin/which.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ & "$basedir/node$exe" "$basedir/../which/bin/which" $args
+ $ret=$LASTEXITCODE
+} else {
+ & "node$exe" "$basedir/../which/bin/which" $args
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/@mrmlnc/readdir-enhanced/CHANGELOG.md b/node_modules/@mrmlnc/readdir-enhanced/CHANGELOG.md
new file mode 100644
index 0000000..6391ab6
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/CHANGELOG.md
@@ -0,0 +1,49 @@
+# Change Log
+All notable changes will be documented in this file.
+`readdir-enhanced` adheres to [Semantic Versioning](http://semver.org/).
+
+
+## [v2.2.0](https://github.com/BigstickCarpet/readdir-enhanced/tree/v2.2.0) (2018-01-09)
+
+- Refactored the codebase to use ES6 syntax (Node v4.x compatible)
+
+- You can now provide [your own implementation](https://github.com/BigstickCarpet/readdir-enhanced#custom-fs-methods) for the [filesystem module](https://nodejs.org/api/fs.html) that's used by `readdir-enhanced`. Just set the `fs` option to your implementation. Thanks to [@mrmlnc](https://github.com/mrmlnc) for the idea and [the PR](https://github.com/BigstickCarpet/readdir-enhanced/pull/10)!
+
+- [Better error handling](https://github.com/BigstickCarpet/readdir-enhanced/commit/0d330b68524bafbdeae11566a3e8af1bc3f184bf), especially around user-specified logic, such as `options.deep`, `options.filter`, and `options.fs`
+
+[Full Changelog](https://github.com/BigstickCarpet/readdir-enhanced/compare/v2.1.0...v2.2.0)
+
+
+## [v2.1.0](https://github.com/BigstickCarpet/readdir-enhanced/tree/v2.1.0) (2017-12-01)
+
+- The `fs.Stats` objects now include a `depth` property, which indicates the number of subdirectories beneath the base path. Thanks to [@mrmlnc](https://github.com/mrmlnc) for [the PR](https://github.com/BigstickCarpet/readdir-enhanced/pull/8)!
+
+[Full Changelog](https://github.com/BigstickCarpet/readdir-enhanced/compare/v2.0.0...v2.1.0)
+
+
+## [v2.0.0](https://github.com/BigstickCarpet/readdir-enhanced/tree/v2.0.0) (2017-11-15)
+
+- Dropped support for Node v0.x, which is no longer actively maintained. Please upgrade to Node 4 or newer.
+
+[Full Changelog](https://github.com/BigstickCarpet/readdir-enhanced/compare/v1.5.0...v2.0.0)
+
+
+## [v1.5.0](https://github.com/BigstickCarpet/readdir-enhanced/tree/v1.5.0) (2017-04-10)
+
+The [`deep` option](README.md#deep) can now be set to a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp), a [glob pattern](https://github.com/isaacs/node-glob#glob-primer), or a function, which allows you to customize which subdirectories get crawled. Of course, you can also still still set the `deep` option to `true` to crawl _all_ subdirectories, or a number if you just want to limit the recursion depth.
+
+[Full Changelog](https://github.com/BigstickCarpet/readdir-enhanced/compare/v1.4.0...v1.5.0)
+
+
+## [v1.4.0](https://github.com/BigstickCarpet/readdir-enhanced/tree/v1.4.0) (2016-08-26)
+
+The [`filter` option](README.md#filter) can now be set to a regular expression or a glob pattern string, which simplifies filtering based on file names. Of course, you can still set the `filter` option to a function if you need to perform more advanced filtering based on the [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) of each file.
+
+[Full Changelog](https://github.com/BigstickCarpet/readdir-enhanced/compare/v1.3.4...v1.4.0)
+
+
+## [v1.3.4](https://github.com/BigstickCarpet/readdir-enhanced/tree/v1.3.4) (2016-08-26)
+
+As of this release, `readdir-enhanced` is fully tested on all major Node versions (0.x, 4.x, 5.x, 6.x) on [linux](https://travis-ci.org/BigstickCarpet/readdir-enhanced) and [Windows](https://ci.appveyor.com/project/BigstickCarpet/readdir-enhanced/branch/master), with [nearly 100% code coverage](https://coveralls.io/github/BigstickCarpet/readdir-enhanced?branch=master). I do all of my local development and testing on MacOS, so that's covered too.
+
+[Full Changelog](https://github.com/BigstickCarpet/readdir-enhanced/compare/v1.0.1...v1.3.4)
diff --git a/node_modules/@mrmlnc/readdir-enhanced/LICENSE b/node_modules/@mrmlnc/readdir-enhanced/LICENSE
new file mode 100644
index 0000000..9ff003f
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/LICENSE
@@ -0,0 +1,23 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 James Messinger
+
+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.
+
+.
\ No newline at end of file
diff --git a/node_modules/@mrmlnc/readdir-enhanced/README.md b/node_modules/@mrmlnc/readdir-enhanced/README.md
new file mode 100644
index 0000000..bcf9b26
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/README.md
@@ -0,0 +1,347 @@
+Enhanced `fs.readdir()`
+=======================
+
+> :warning: This is «fork» for original `readdir-enhanced` package but with some monkey fixes.
+
+[![Build Status](https://api.travis-ci.org/BigstickCarpet/readdir-enhanced.svg?branch=master)](https://travis-ci.org/BigstickCarpet/readdir-enhanced)
+[![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/bigstickcarpet/readdir-enhanced?svg=true&branch=master&failingText=Windows%20build%20failing&passingText=Windows%20build%20passing)](https://ci.appveyor.com/project/BigstickCarpet/readdir-enhanced/branch/master)
+
+[![Coverage Status](https://coveralls.io/repos/github/BigstickCarpet/readdir-enhanced/badge.svg?branch=master)](https://coveralls.io/github/BigstickCarpet/readdir-enhanced?branch=master)
+[![Codacy Score](https://api.codacy.com/project/badge/Grade/178a817b6c864de7813fef457c0ed5ae)](https://www.codacy.com/public/jamesmessinger/readdir-enhanced)
+[![Inline docs](http://inch-ci.org/github/BigstickCarpet/readdir-enhanced.svg?branch=master&style=shields)](http://inch-ci.org/github/BigstickCarpet/readdir-enhanced)
+[![Dependencies](https://david-dm.org/BigstickCarpet/readdir-enhanced.svg)](https://david-dm.org/BigstickCarpet/readdir-enhanced)
+
+[![npm](https://img.shields.io/npm/v/readdir-enhanced.svg?maxAge=43200)](https://www.npmjs.com/package/readdir-enhanced)
+[![License](https://img.shields.io/npm/l/readdir-enhanced.svg?maxAge=2592000)](LICENSE)
+
+`readdir-enhanced` is a [backward-compatible](#backward-compatible) drop-in replacement for [`fs.readdir()`](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback) and [`fs.readdirSync()`](https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options) with tons of extra features ([filtering](#filter), [recursion](#deep), [absolute paths](#basepath), [stats](#stats), and more) as well as additional APIs for Promises, Streams, and EventEmitters.
+
+
+Pick Your API
+-----------------
+`readdir-enhanced` has multiple APIs, so you can pick whichever one you prefer. There are three main APIs:
+
+- **Synchronous API**
+aliases: `readdir.sync`, `readdir.readdirSync`
+Blocks the thread until all directory contents are read, and then returns all the results.
+
+- **Async API**
+aliases: `readdir`, `readdir.async`, `readdir.readdirAsync`
+Reads the starting directory contents asynchronously and buffers all the results until all contents have been read. Supports callback or Promise syntax (see example below).
+
+- **Streaming API**
+aliases: `readdir.stream`, `readdir.readdirStream`
+The streaming API reads the starting directory asynchronously and returns the results in real-time as they are read. The results can be [piped](https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options) to other Node.js streams, or you can listen for specific events via the [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter) interface. (see example below)
+
+```javascript
+var readdir = require('readdir-enhanced');
+var through2 = require('through2');
+
+// Synchronous API
+var files = readdir.sync('my/directory');
+
+// Callback API
+readdir.async('my/directory', function(err, files) { ... });
+
+// Promises API
+readdir.async('my/directory')
+ .then(function(files) { ... })
+ .catch(function(err) { ... });
+
+// EventEmitter API
+readdir.stream('my/directory')
+ .on('data', function(path) { ... })
+ .on('file', function(path) { ... })
+ .on('directory', function(path) { ... })
+ .on('symlink', function(path) { ... })
+ .on('error', function(err) { ... });
+
+// Streaming API
+var stream = readdir.stream('my/directory')
+ .pipe(through2.obj(function(data, enc, next) {
+ console.log(data);
+ this.push(data);
+ next();
+ });
+```
+
+
+
+Enhanced Features
+-----------------
+`readdir-enhanced` adds several features to the built-in `fs.readdir()` function. All of the enhanced features are opt-in, which makes `readdir-enhanced` [fully backward compatible by default](#backward-compatible). You can enable any of the features by passing-in an `options` argument as the second parameter.
+
+
+
+### Recursion
+By default, `readdir-enhanced` will only return the top-level contents of the starting directory. But you can set the `deep` option to recursively traverse the subdirectories and return their contents as well.
+
+#### Crawl ALL subdirectories
+
+The `deep` option can be set to `true` to traverse the entire directory structure.
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+readdir('my/directory', {deep: true}, function(err, files) {
+ console.log(files);
+ // => subdir1
+ // => subdir1/file.txt
+ // => subdir1/subdir2
+ // => subdir1/subdir2/file.txt
+ // => subdir1/subdir2/subdir3
+ // => subdir1/subdir2/subdir3/file.txt
+});
+```
+
+#### Crawl to a specific depth
+The `deep` option can be set to a number to only traverse that many levels deep. For example, calling `readdir('my/directory', {deep: 2})` will return `subdir1/file.txt` and `subdir1/subdir2/file.txt`, but it _won't_ return `subdir1/subdir2/subdir3/file.txt`.
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+readdir('my/directory', {deep: 2}, function(err, files) {
+ console.log(files);
+ // => subdir1
+ // => subdir1/file.txt
+ // => subdir1/subdir2
+ // => subdir1/subdir2/file.txt
+ // => subdir1/subdir2/subdir3
+});
+```
+
+#### Crawl subdirectories by name
+For simple use-cases, you can use a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) or a [glob pattern](https://github.com/isaacs/node-glob#glob-primer) to crawl only the directories whose path matches the pattern. The path is relative to the starting directory by default, but you can customize this via [`options.basePath`](#basepath).
+
+> **NOTE:** Glob patterns [_always_ use forward-slashes](https://github.com/isaacs/node-glob#windows), even on Windows. This _does not_ apply to regular expressions though. Regular expressions should use the appropraite path separator for the environment. Or, you can match both types of separators using `[\\/]`.
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+// Only crawl the "lib" and "bin" subdirectories
+// (notice that the "node_modules" subdirectory does NOT get crawled)
+readdir('my/directory', {deep: /lib|bin/}, function(err, files) {
+ console.log(files);
+ // => bin
+ // => bin/cli.js
+ // => lib
+ // => lib/index.js
+ // => node_modules
+ // => package.json
+});
+```
+
+#### Custom recursion logic
+For more advanced recursion, you can set the `deep` option to a function that accepts an [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object and returns a truthy value if the starting directory should be crawled.
+
+> **NOTE:** The [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that's passed to the function has additional `path` and `depth` properties. The `path` is relative to the starting directory by default, but you can customize this via [`options.basePath`](#basepath). The `depth` is the number of subdirectories beneath the base path (see [`options.deep`](#deep)).
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+// Crawl all subdirectories, except "node_modules"
+function ignoreNodeModules (stats) {
+ return stats.path.indexOf('node_modules') === -1;
+}
+
+readdir('my/directory', {deep: ignoreNodeModules}, function(err, files) {
+ console.log(files);
+ // => bin
+ // => bin/cli.js
+ // => lib
+ // => lib/index.js
+ // => node_modules
+ // => package.json
+});
+```
+
+
+
+### Filtering
+The `filter` option lets you limit the results based on any criteria you want.
+
+#### Filter by name
+For simple use-cases, you can use a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) or a [glob pattern](https://github.com/isaacs/node-glob#glob-primer) to filter items by their path. The path is relative to the starting directory by default, but you can customize this via [`options.basePath`](#basepath).
+
+> **NOTE:** Glob patterns [_always_ use forward-slashes](https://github.com/isaacs/node-glob#windows), even on Windows. This _does not_ apply to regular expressions though. Regular expressions should use the appropraite path separator for the environment. Or, you can match both types of separators using `[\\/]`.
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+// Find all .txt files
+readdir('my/directory', {filter: '*.txt'});
+
+// Find all package.json files
+readdir('my/directory', {filter: '**/package.json', deep: true});
+
+// Find everything with at least one number in the name
+readdir('my/directory', {filter: /\d+/});
+```
+
+#### Custom filtering logic
+For more advanced filtering, you can specify a filter function that accepts an [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object and returns a truthy value if the item should be included in the results.
+
+> **NOTE:** The [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that's passed to the filter function has additional `path` and `depth` properties. The `path` is relative to the starting directory by default, but you can customize this via [`options.basePath`](#basepath). The `depth` is the number of subdirectories beneath the base path (see [`options.deep`](#deep)).
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+// Only return file names containing an underscore
+function myFilter(stats) {
+ return stats.isFile() && stats.path.indexOf('_') >= 0;
+}
+
+readdir('my/directory', {filter: myFilter}, function(err, files) {
+ console.log(files);
+ // => __myFile.txt
+ // => my_other_file.txt
+ // => img_1.jpg
+ // => node_modules
+});
+```
+
+
+
+### Base Path
+By default all `readdir-enhanced` functions return paths that are relative to the starting directory. But you can use the `basePath` option to customize this. The `basePath` will be prepended to all of the returned paths. One common use-case for this is to set `basePath` to the absolute path of the starting directory, so that all of the returned paths will be absolute.
+
+```javascript
+var readdir = require('readdir-enhanced');
+var path = require('path');
+
+// Get absolute paths
+var absPath = path.resolve('my/dir');
+readdir('my/directory', {basePath: absPath}, function(err, files) {
+ console.log(files);
+ // => /absolute/path/to/my/directory/file1.txt
+ // => /absolute/path/to/my/directory/file2.txt
+ // => /absolute/path/to/my/directory/subdir
+});
+
+// Get paths relative to the working directory
+readdir('my/directory', {basePath: 'my/directory'}, function(err, files) {
+ console.log(files);
+ // => my/directory/file1.txt
+ // => my/directory/file2.txt
+ // => my/directory/subdir
+});
+```
+
+
+
+### Path Separator
+By default, `readdir-enhanced` uses the correct path separator for your OS (`\` on Windows, `/` on Linux & MacOS). But you can set the `sep` option to any separator character(s) that you want to use instead. This is usually used to ensure consistent path separators across different OSes.
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+// Always use Windows path separators
+readdir('my/directory', {sep: '\\', deep: true}, function(err, files) {
+ console.log(files);
+ // => subdir1
+ // => subdir1\file.txt
+ // => subdir1\subdir2
+ // => subdir1\subdir2\file.txt
+ // => subdir1\subdir2\subdir3
+ // => subdir1\subdir2\subdir3\file.txt
+});
+```
+
+
+### Custom FS methods
+By default, `readdir-enhanced` uses the default [Node.js FileSystem module](https://nodejs.org/api/fs.html) for methods like `fs.stat`, `fs.readdir` and `fs.lstat`. But in some situations, you can want to use your own FS methods (FTP, SSH, remote drive and etc). So you can provide your own implementation of FS methods by setting `options.fs` or specific methods, such as `options.fs.stat`.
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+function myCustomReaddirMethod(dir, callback) {
+ callback(null, ['__myFile.txt']);
+}
+
+var options = {
+ fs: {
+ readdir: myCustomReaddirMethod
+ }
+};
+
+readdir('my/directory', options, function(err, files) {
+ console.log(files);
+ // => __myFile.txt
+});
+```
+
+
+Get `fs.Stats` objects instead of strings
+------------------------
+All of the `readdir-enhanced` functions listed above return an array of strings (paths). But in some situations, the path isn't enough information. So, `readdir-enhanced` provides alternative versions of each function, which return an array of [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) objects instead of strings. The `fs.Stats` object contains all sorts of useful information, such as the size, the creation date/time, and helper methods such as `isFile()`, `isDirectory()`, `isSymbolicLink()`, etc.
+
+> **NOTE:** The [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) objects that are returned also have additional `path` and `depth` properties. The `path` is relative to the starting directory by default, but you can customize this via [`options.basePath`](#basepath). The `depth` is the number of subdirectories beneath the base path (see [`options.deep`](#deep)).
+
+To get `fs.Stats` objects instead of strings, just add the word "Stat" to the function name. As with the normal functions, each one is aliased (e.g. `readdir.async.stat` is the same as `readdir.readdirAsyncStat`), so you can use whichever naming style you prefer.
+
+```javascript
+var readdir = require('readdir-enhanced');
+
+// Synchronous API
+var stats = readdir.sync.stat('my/directory');
+var stats = readdir.readdirSyncStat('my/directory');
+
+// Async API
+readdir.async.stat('my/directory', function(err, stats) { ... });
+readdir.readdirAsyncStat('my/directory', function(err, stats) { ... });
+
+// Streaming API
+readdir.stream.stat('my/directory')
+ .on('data', function(stat) { ... })
+ .on('file', function(stat) { ... })
+ .on('directory', function(stat) { ... })
+ .on('symlink', function(stat) { ... });
+
+readdir.readdirStreamStat('my/directory')
+ .on('data', function(stat) { ... })
+ .on('file', function(stat) { ... })
+ .on('directory', function(stat) { ... })
+ .on('symlink', function(stat) { ... });
+
+```
+
+
+Backward Compatible
+--------------------
+`readdir-enhanced` is fully backward-compatible with Node.js' built-in `fs.readdir()` and `fs.readdirSync()` functions, so you can use it as a drop-in replacement in existing projects without affecting existing functionality, while still being able to use the enhanced features as needed.
+
+```javascript
+var readdir = require('readdir-enhanced');
+var readdirSync = readdir.sync;
+
+// Use it just like Node's built-in fs.readdir function
+readdir('my/directory', function(err, files) { ... });
+
+// Use it just like Node's built-in fs.readdirSync function
+var files = readdirSync('my/directory');
+```
+
+
+
+Contributing
+--------------------------
+I welcome any contributions, enhancements, and bug-fixes. [File an issue](https://github.com/BigstickCarpet/readdir-enhanced/issues) on GitHub and [submit a pull request](https://github.com/BigstickCarpet/readdir-enhanced/pulls).
+
+#### Building
+To build the project locally on your computer:
+
+1. __Clone this repo__
+`git clone https://github.com/bigstickcarpet/readdir-enhanced.git`
+
+2. __Install dependencies__
+`npm install`
+
+3. __Run the tests__
+`npm test`
+
+
+
+License
+--------------------------
+`readdir-enhanced` is 100% free and open-source, under the [MIT license](LICENSE). Use it however you want.
+
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js b/node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js
new file mode 100644
index 0000000..1ac9b2f
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js
@@ -0,0 +1,29 @@
+'use strict';
+
+module.exports = asyncForEach;
+
+/**
+ * Simultaneously processes all items in the given array.
+ *
+ * @param {array} array - The array to iterate over
+ * @param {function} iterator - The function to call for each item in the array
+ * @param {function} done - The function to call when all iterators have completed
+ */
+function asyncForEach (array, iterator, done) {
+ if (array.length === 0) {
+ // NOTE: Normally a bad idea to mix sync and async, but it's safe here because
+ // of the way that this method is currently used by DirectoryReader.
+ done();
+ return;
+ }
+
+ // Simultaneously process all items in the array.
+ let pending = array.length;
+ array.forEach(item => {
+ iterator(item, () => {
+ if (--pending === 0) {
+ done();
+ }
+ });
+ });
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js b/node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js
new file mode 100644
index 0000000..677e0b6
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js
@@ -0,0 +1,48 @@
+'use strict';
+
+module.exports = readdirAsync;
+
+const maybe = require('call-me-maybe');
+const DirectoryReader = require('../directory-reader');
+
+let asyncFacade = {
+ fs: require('fs'),
+ forEach: require('./for-each'),
+ async: true
+};
+
+/**
+ * Returns the buffered output from an asynchronous {@link DirectoryReader},
+ * via an error-first callback or a {@link Promise}.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @param {function} [callback]
+ * @param {object} internalOptions
+ */
+function readdirAsync (dir, options, callback, internalOptions) {
+ if (typeof options === 'function') {
+ callback = options;
+ options = undefined;
+ }
+
+ return maybe(callback, new Promise(((resolve, reject) => {
+ let results = [];
+
+ internalOptions.facade = asyncFacade;
+
+ let reader = new DirectoryReader(dir, options, internalOptions);
+ let stream = reader.stream;
+
+ stream.on('error', err => {
+ reject(err);
+ stream.pause();
+ });
+ stream.on('data', result => {
+ results.push(result);
+ });
+ stream.on('end', () => {
+ resolve(results);
+ });
+ })));
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/call.js b/node_modules/@mrmlnc/readdir-enhanced/lib/call.js
new file mode 100644
index 0000000..07e3d84
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/call.js
@@ -0,0 +1,54 @@
+'use strict';
+
+let call = module.exports = {
+ safe: safeCall,
+ once: callOnce,
+};
+
+/**
+ * Calls a function with the given arguments, and ensures that the error-first callback is _always_
+ * invoked exactly once, even if the function throws an error.
+ *
+ * @param {function} fn - The function to invoke
+ * @param {...*} args - The arguments to pass to the function. The final argument must be a callback function.
+ */
+function safeCall (fn, args) {
+ // Get the function arguments as an array
+ args = Array.prototype.slice.call(arguments, 1);
+
+ // Replace the callback function with a wrapper that ensures it will only be called once
+ let callback = call.once(args.pop());
+ args.push(callback);
+
+ try {
+ fn.apply(null, args);
+ }
+ catch (err) {
+ callback(err);
+ }
+}
+
+/**
+ * Returns a wrapper function that ensures the given callback function is only called once.
+ * Subsequent calls are ignored, unless the first argument is an Error, in which case the
+ * error is thrown.
+ *
+ * @param {function} fn - The function that should only be called once
+ * @returns {function}
+ */
+function callOnce (fn) {
+ let fulfilled = false;
+
+ return function onceWrapper (err) {
+ if (!fulfilled) {
+ fulfilled = true;
+ return fn.apply(this, arguments);
+ }
+ else if (err) {
+ // The callback has already been called, but now an error has occurred
+ // (most likely inside the callback function). So re-throw the error,
+ // so it gets handled further up the call stack
+ throw err;
+ }
+ };
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js b/node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js
new file mode 100644
index 0000000..569d793
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js
@@ -0,0 +1,380 @@
+'use strict';
+
+const Readable = require('stream').Readable;
+const EventEmitter = require('events').EventEmitter;
+const path = require('path');
+const normalizeOptions = require('./normalize-options');
+const stat = require('./stat');
+const call = require('./call');
+
+/**
+ * Asynchronously reads the contents of a directory and streams the results
+ * via a {@link stream.Readable}.
+ */
+class DirectoryReader {
+ /**
+ * @param {string} dir - The absolute or relative directory path to read
+ * @param {object} [options] - User-specified options, if any (see {@link normalizeOptions})
+ * @param {object} internalOptions - Internal options that aren't part of the public API
+ * @class
+ */
+ constructor (dir, options, internalOptions) {
+ this.options = options = normalizeOptions(options, internalOptions);
+
+ // Indicates whether we should keep reading
+ // This is set false if stream.Readable.push() returns false.
+ this.shouldRead = true;
+
+ // The directories to read
+ // (initialized with the top-level directory)
+ this.queue = [{
+ path: dir,
+ basePath: options.basePath,
+ posixBasePath: options.posixBasePath,
+ depth: 0
+ }];
+
+ // The number of directories that are currently being processed
+ this.pending = 0;
+
+ // The data that has been read, but not yet emitted
+ this.buffer = [];
+
+ this.stream = new Readable({ objectMode: true });
+ this.stream._read = () => {
+ // Start (or resume) reading
+ this.shouldRead = true;
+
+ // If we have data in the buffer, then send the next chunk
+ if (this.buffer.length > 0) {
+ this.pushFromBuffer();
+ }
+
+ // If we have directories queued, then start processing the next one
+ if (this.queue.length > 0) {
+ if (this.options.facade.sync) {
+ while (this.queue.length > 0) {
+ this.readNextDirectory();
+ }
+ }
+ else {
+ this.readNextDirectory();
+ }
+ }
+
+ this.checkForEOF();
+ };
+ }
+
+ /**
+ * Reads the next directory in the queue
+ */
+ readNextDirectory () {
+ let facade = this.options.facade;
+ let dir = this.queue.shift();
+ this.pending++;
+
+ // Read the directory listing
+ call.safe(facade.fs.readdir, dir.path, (err, items) => {
+ if (err) {
+ // fs.readdir threw an error
+ this.emit('error', err);
+ return this.finishedReadingDirectory();
+ }
+
+ try {
+ // Process each item in the directory (simultaneously, if async)
+ facade.forEach(
+ items,
+ this.processItem.bind(this, dir),
+ this.finishedReadingDirectory.bind(this, dir)
+ );
+ }
+ catch (err2) {
+ // facade.forEach threw an error
+ // (probably because fs.readdir returned an invalid result)
+ this.emit('error', err2);
+ this.finishedReadingDirectory();
+ }
+ });
+ }
+
+ /**
+ * This method is called after all items in a directory have been processed.
+ *
+ * NOTE: This does not necessarily mean that the reader is finished, since there may still
+ * be other directories queued or pending.
+ */
+ finishedReadingDirectory () {
+ this.pending--;
+
+ if (this.shouldRead) {
+ // If we have directories queued, then start processing the next one
+ if (this.queue.length > 0 && this.options.facade.async) {
+ this.readNextDirectory();
+ }
+
+ this.checkForEOF();
+ }
+ }
+
+ /**
+ * Determines whether the reader has finished processing all items in all directories.
+ * If so, then the "end" event is fired (via {@Readable#push})
+ */
+ checkForEOF () {
+ if (this.buffer.length === 0 && // The stuff we've already read
+ this.pending === 0 && // The stuff we're currently reading
+ this.queue.length === 0) { // The stuff we haven't read yet
+ // There's no more stuff!
+ this.stream.push(null);
+ }
+ }
+
+ /**
+ * Processes a single item in a directory.
+ *
+ * If the item is a directory, and `option.deep` is enabled, then the item will be added
+ * to the directory queue.
+ *
+ * If the item meets the filter criteria, then it will be emitted to the reader's stream.
+ *
+ * @param {object} dir - A directory object from the queue
+ * @param {string} item - The name of the item (name only, no path)
+ * @param {function} done - A callback function that is called after the item has been processed
+ */
+ processItem (dir, item, done) {
+ let stream = this.stream;
+ let options = this.options;
+
+ let itemPath = dir.basePath + item;
+ let posixPath = dir.posixBasePath + item;
+ let fullPath = path.join(dir.path, item);
+
+ // If `options.deep` is a number, and we've already recursed to the max depth,
+ // then there's no need to check fs.Stats to know if it's a directory.
+ // If `options.deep` is a function, then we'll need fs.Stats
+ let maxDepthReached = dir.depth >= options.recurseDepth;
+
+ // Do we need to call `fs.stat`?
+ let needStats =
+ !maxDepthReached || // we need the fs.Stats to know if it's a directory
+ options.stats || // the user wants fs.Stats objects returned
+ options.recurseFn || // we need fs.Stats for the recurse function
+ options.filterFn || // we need fs.Stats for the filter function
+ EventEmitter.listenerCount(stream, 'file') || // we need the fs.Stats to know if it's a file
+ EventEmitter.listenerCount(stream, 'directory') || // we need the fs.Stats to know if it's a directory
+ EventEmitter.listenerCount(stream, 'symlink'); // we need the fs.Stats to know if it's a symlink
+
+ // If we don't need stats, then exit early
+ if (!needStats) {
+ if (this.filter(itemPath, posixPath)) {
+ this.pushOrBuffer({ data: itemPath });
+ }
+ return done();
+ }
+
+ // Get the fs.Stats object for this path
+ stat(options.facade.fs, fullPath, (err, stats) => {
+ if (err) {
+ // fs.stat threw an error
+ this.emit('error', err);
+ return done();
+ }
+
+ try {
+ // Add the item's path to the fs.Stats object
+ // The base of this path, and its separators are determined by the options
+ // (i.e. options.basePath and options.sep)
+ stats.path = itemPath;
+
+ // Add depth of the path to the fs.Stats object for use this in the filter function
+ stats.depth = dir.depth;
+
+ if (this.shouldRecurse(stats, posixPath, maxDepthReached)) {
+ // Add this subdirectory to the queue
+ this.queue.push({
+ path: fullPath,
+ basePath: itemPath + options.sep,
+ posixBasePath: posixPath + '/',
+ depth: dir.depth + 1,
+ });
+ }
+
+ // Determine whether this item matches the filter criteria
+ if (this.filter(stats, posixPath)) {
+ this.pushOrBuffer({
+ data: options.stats ? stats : itemPath,
+ file: stats.isFile(),
+ directory: stats.isDirectory(),
+ symlink: stats.isSymbolicLink(),
+ });
+ }
+
+ done();
+ }
+ catch (err2) {
+ // An error occurred while processing the item
+ // (probably during a user-specified function, such as options.deep, options.filter, etc.)
+ this.emit('error', err2);
+ done();
+ }
+ });
+ }
+
+ /**
+ * Pushes the given chunk of data to the stream, or adds it to the buffer,
+ * depending on the state of the stream.
+ *
+ * @param {object} chunk
+ */
+ pushOrBuffer (chunk) {
+ // Add the chunk to the buffer
+ this.buffer.push(chunk);
+
+ // If we're still reading, then immediately emit the next chunk in the buffer
+ // (which may or may not be the chunk that we just added)
+ if (this.shouldRead) {
+ this.pushFromBuffer();
+ }
+ }
+
+ /**
+ * Immediately pushes the next chunk in the buffer to the reader's stream.
+ * The "data" event will always be fired (via {@link Readable#push}).
+ * In addition, the "file", "directory", and/or "symlink" events may be fired,
+ * depending on the type of properties of the chunk.
+ */
+ pushFromBuffer () {
+ let stream = this.stream;
+ let chunk = this.buffer.shift();
+
+ // Stream the data
+ try {
+ this.shouldRead = stream.push(chunk.data);
+ }
+ catch (err) {
+ this.emit('error', err);
+ }
+
+ // Also emit specific events, based on the type of chunk
+ chunk.file && this.emit('file', chunk.data);
+ chunk.symlink && this.emit('symlink', chunk.data);
+ chunk.directory && this.emit('directory', chunk.data);
+ }
+
+ /**
+ * Determines whether the given directory meets the user-specified recursion criteria.
+ * If the user didn't specify recursion criteria, then this function will default to true.
+ *
+ * @param {fs.Stats} stats - The directory's {@link fs.Stats} object
+ * @param {string} posixPath - The item's POSIX path (used for glob matching)
+ * @param {boolean} maxDepthReached - Whether we've already crawled the user-specified depth
+ * @returns {boolean}
+ */
+ shouldRecurse (stats, posixPath, maxDepthReached) {
+ let options = this.options;
+
+ if (maxDepthReached) {
+ // We've already crawled to the maximum depth. So no more recursion.
+ return false;
+ }
+ else if (!stats.isDirectory()) {
+ // It's not a directory. So don't try to crawl it.
+ return false;
+ }
+ else if (options.recurseGlob) {
+ // Glob patterns are always tested against the POSIX path, even on Windows
+ // https://github.com/isaacs/node-glob#windows
+ return options.recurseGlob.test(posixPath);
+ }
+ else if (options.recurseRegExp) {
+ // Regular expressions are tested against the normal path
+ // (based on the OS or options.sep)
+ return options.recurseRegExp.test(stats.path);
+ }
+ else if (options.recurseFn) {
+ try {
+ // Run the user-specified recursion criteria
+ return options.recurseFn.call(null, stats);
+ }
+ catch (err) {
+ // An error occurred in the user's code.
+ // In Sync and Async modes, this will return an error.
+ // In Streaming mode, we emit an "error" event, but continue processing
+ this.emit('error', err);
+ }
+ }
+ else {
+ // No recursion function was specified, and we're within the maximum depth.
+ // So crawl this directory.
+ return true;
+ }
+ }
+
+ /**
+ * Determines whether the given item meets the user-specified filter criteria.
+ * If the user didn't specify a filter, then this function will always return true.
+ *
+ * @param {string|fs.Stats} value - Either the item's path, or the item's {@link fs.Stats} object
+ * @param {string} posixPath - The item's POSIX path (used for glob matching)
+ * @returns {boolean}
+ */
+ filter (value, posixPath) {
+ let options = this.options;
+
+ if (options.filterGlob) {
+ // Glob patterns are always tested against the POSIX path, even on Windows
+ // https://github.com/isaacs/node-glob#windows
+ return options.filterGlob.test(posixPath);
+ }
+ else if (options.filterRegExp) {
+ // Regular expressions are tested against the normal path
+ // (based on the OS or options.sep)
+ return options.filterRegExp.test(value.path || value);
+ }
+ else if (options.filterFn) {
+ try {
+ // Run the user-specified filter function
+ return options.filterFn.call(null, value);
+ }
+ catch (err) {
+ // An error occurred in the user's code.
+ // In Sync and Async modes, this will return an error.
+ // In Streaming mode, we emit an "error" event, but continue processing
+ this.emit('error', err);
+ }
+ }
+ else {
+ // No filter was specified, so match everything
+ return true;
+ }
+ }
+
+ /**
+ * Emits an event. If one of the event listeners throws an error,
+ * then an "error" event is emitted.
+ *
+ * @param {string} eventName
+ * @param {*} data
+ */
+ emit (eventName, data) {
+ let stream = this.stream;
+
+ try {
+ stream.emit(eventName, data);
+ }
+ catch (err) {
+ if (eventName === 'error') {
+ // Don't recursively emit "error" events.
+ // If the first one fails, then just throw
+ throw err;
+ }
+ else {
+ stream.emit('error', err);
+ }
+ }
+ }
+}
+
+module.exports = DirectoryReader;
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/index.js b/node_modules/@mrmlnc/readdir-enhanced/lib/index.js
new file mode 100644
index 0000000..f77d2c6
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/index.js
@@ -0,0 +1,85 @@
+'use strict';
+
+const readdirSync = require('./sync');
+const readdirAsync = require('./async');
+const readdirStream = require('./stream');
+
+module.exports = exports = readdirAsyncPath;
+exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath;
+exports.readdirAsyncStat = exports.async.stat = readdirAsyncStat;
+exports.readdirStream = exports.stream = readdirStreamPath;
+exports.readdirStreamStat = exports.stream.stat = readdirStreamStat;
+exports.readdirSync = exports.sync = readdirSyncPath;
+exports.readdirSyncStat = exports.sync.stat = readdirSyncStat;
+
+/**
+ * Synchronous readdir that returns an array of string paths.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @returns {string[]}
+ */
+function readdirSyncPath (dir, options) {
+ return readdirSync(dir, options, {});
+}
+
+/**
+ * Synchronous readdir that returns results as an array of {@link fs.Stats} objects
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @returns {fs.Stats[]}
+ */
+function readdirSyncStat (dir, options) {
+ return readdirSync(dir, options, { stats: true });
+}
+
+/**
+ * Aynchronous readdir (accepts an error-first callback or returns a {@link Promise}).
+ * Results are an array of path strings.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @param {function} [callback]
+ * @returns {Promise}
+ */
+function readdirAsyncPath (dir, options, callback) {
+ return readdirAsync(dir, options, callback, {});
+}
+
+/**
+ * Aynchronous readdir (accepts an error-first callback or returns a {@link Promise}).
+ * Results are an array of {@link fs.Stats} objects.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @param {function} [callback]
+ * @returns {Promise}
+ */
+function readdirAsyncStat (dir, options, callback) {
+ return readdirAsync(dir, options, callback, { stats: true });
+}
+
+/**
+ * Aynchronous readdir that returns a {@link stream.Readable} (which is also an {@link EventEmitter}).
+ * All stream data events ("data", "file", "directory", "symlink") are passed a path string.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @returns {stream.Readable}
+ */
+function readdirStreamPath (dir, options) {
+ return readdirStream(dir, options, {});
+}
+
+/**
+ * Aynchronous readdir that returns a {@link stream.Readable} (which is also an {@link EventEmitter})
+ * All stream data events ("data", "file", "directory", "symlink") are passed an {@link fs.Stats} object.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @returns {stream.Readable}
+ */
+function readdirStreamStat (dir, options) {
+ return readdirStream(dir, options, { stats: true });
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/normalize-options.js b/node_modules/@mrmlnc/readdir-enhanced/lib/normalize-options.js
new file mode 100644
index 0000000..66f1158
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/normalize-options.js
@@ -0,0 +1,177 @@
+'use strict';
+
+const path = require('path');
+const globToRegExp = require('glob-to-regexp');
+
+module.exports = normalizeOptions;
+
+let isWindows = /^win/.test(process.platform);
+
+/**
+ * @typedef {Object} FSFacade
+ * @property {fs.readdir} readdir
+ * @property {fs.stat} stat
+ * @property {fs.lstat} lstat
+ */
+
+/**
+ * Validates and normalizes the options argument
+ *
+ * @param {object} [options] - User-specified options, if any
+ * @param {object} internalOptions - Internal options that aren't part of the public API
+ *
+ * @param {number|boolean|function} [options.deep]
+ * The number of directories to recursively traverse. Any falsy value or negative number will
+ * default to zero, so only the top-level contents will be returned. Set to `true` or `Infinity`
+ * to traverse all subdirectories. Or provide a function that accepts a {@link fs.Stats} object
+ * and returns a truthy value if the directory's contents should be crawled.
+ *
+ * @param {function|string|RegExp} [options.filter]
+ * A function that accepts a {@link fs.Stats} object and returns a truthy value if the data should
+ * be returned. Or a RegExp or glob string pattern, to filter by file name.
+ *
+ * @param {string} [options.sep]
+ * The path separator to use. By default, the OS-specific separator will be used, but this can be
+ * set to a specific value to ensure consistency across platforms.
+ *
+ * @param {string} [options.basePath]
+ * The base path to prepend to each result. If empty, then all results will be relative to `dir`.
+ *
+ * @param {FSFacade} [options.fs]
+ * Synchronous or asynchronous facades for Node.js File System module
+ *
+ * @param {object} [internalOptions.facade]
+ * Synchronous or asynchronous facades for various methods, including for the Node.js File System module
+ *
+ * @param {boolean} [internalOptions.emit]
+ * Indicates whether the reader should emit "file", "directory", and "symlink" events
+ *
+ * @param {boolean} [internalOptions.stats]
+ * Indicates whether the reader should emit {@link fs.Stats} objects instead of path strings
+ *
+ * @returns {object}
+ */
+function normalizeOptions (options, internalOptions) {
+ if (options === null || options === undefined) {
+ options = {};
+ }
+ else if (typeof options !== 'object') {
+ throw new TypeError('options must be an object');
+ }
+
+ let recurseDepth, recurseFn, recurseRegExp, recurseGlob, deep = options.deep;
+ if (deep === null || deep === undefined) {
+ recurseDepth = 0;
+ }
+ else if (typeof deep === 'boolean') {
+ recurseDepth = deep ? Infinity : 0;
+ }
+ else if (typeof deep === 'number') {
+ if (deep < 0 || isNaN(deep)) {
+ throw new Error('options.deep must be a positive number');
+ }
+ else if (Math.floor(deep) !== deep) {
+ throw new Error('options.deep must be an integer');
+ }
+ else {
+ recurseDepth = deep;
+ }
+ }
+ else if (typeof deep === 'function') {
+ recurseDepth = Infinity;
+ recurseFn = deep;
+ }
+ else if (deep instanceof RegExp) {
+ recurseDepth = Infinity;
+ recurseRegExp = deep;
+ }
+ else if (typeof deep === 'string' && deep.length > 0) {
+ recurseDepth = Infinity;
+ recurseGlob = globToRegExp(deep, { extended: true, globstar: true });
+ }
+ else {
+ throw new TypeError('options.deep must be a boolean, number, function, regular expression, or glob pattern');
+ }
+
+ let filterFn, filterRegExp, filterGlob, filter = options.filter;
+ if (filter !== null && filter !== undefined) {
+ if (typeof filter === 'function') {
+ filterFn = filter;
+ }
+ else if (filter instanceof RegExp) {
+ filterRegExp = filter;
+ }
+ else if (typeof filter === 'string' && filter.length > 0) {
+ filterGlob = globToRegExp(filter, { extended: true, globstar: true });
+ }
+ else {
+ throw new TypeError('options.filter must be a function, regular expression, or glob pattern');
+ }
+ }
+
+ let sep = options.sep;
+ if (sep === null || sep === undefined) {
+ sep = path.sep;
+ }
+ else if (typeof sep !== 'string') {
+ throw new TypeError('options.sep must be a string');
+ }
+
+ let basePath = options.basePath;
+ if (basePath === null || basePath === undefined) {
+ basePath = '';
+ }
+ else if (typeof basePath === 'string') {
+ // Append a path separator to the basePath, if necessary
+ if (basePath && basePath.substr(-1) !== sep) {
+ basePath += sep;
+ }
+ }
+ else {
+ throw new TypeError('options.basePath must be a string');
+ }
+
+ // Convert the basePath to POSIX (forward slashes)
+ // so that glob pattern matching works consistently, even on Windows
+ let posixBasePath = basePath;
+ if (posixBasePath && sep !== '/') {
+ posixBasePath = posixBasePath.replace(new RegExp('\\' + sep, 'g'), '/');
+
+ /* istanbul ignore if */
+ if (isWindows) {
+ // Convert Windows root paths (C:\) and UNCs (\\) to POSIX root paths
+ posixBasePath = posixBasePath.replace(/^([a-zA-Z]\:\/|\/\/)/, '/');
+ }
+ }
+
+ // Determine which facade methods to use
+ let facade;
+ if (options.fs === null || options.fs === undefined) {
+ // The user didn't provide their own facades, so use our internal ones
+ facade = internalOptions.facade;
+ }
+ else if (typeof options.fs === 'object') {
+ // Merge the internal facade methods with the user-provided `fs` facades
+ facade = Object.assign({}, internalOptions.facade);
+ facade.fs = Object.assign({}, internalOptions.facade.fs, options.fs);
+ }
+ else {
+ throw new TypeError('options.fs must be an object');
+ }
+
+ return {
+ recurseDepth,
+ recurseFn,
+ recurseRegExp,
+ recurseGlob,
+ filterFn,
+ filterRegExp,
+ filterGlob,
+ sep,
+ basePath,
+ posixBasePath,
+ facade,
+ emit: !!internalOptions.emit,
+ stats: !!internalOptions.stats,
+ };
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/stat.js b/node_modules/@mrmlnc/readdir-enhanced/lib/stat.js
new file mode 100644
index 0000000..e338693
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/stat.js
@@ -0,0 +1,74 @@
+'use strict';
+
+const call = require('./call');
+
+module.exports = stat;
+
+/**
+ * Retrieves the {@link fs.Stats} for the given path. If the path is a symbolic link,
+ * then the Stats of the symlink's target are returned instead. If the symlink is broken,
+ * then the Stats of the symlink itself are returned.
+ *
+ * @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module
+ * @param {string} path - The path to return stats for
+ * @param {function} callback
+ */
+function stat (fs, path, callback) {
+ let isSymLink = false;
+
+ call.safe(fs.lstat, path, (err, lstats) => {
+ if (err) {
+ // fs.lstat threw an eror
+ return callback(err);
+ }
+
+ try {
+ isSymLink = lstats.isSymbolicLink();
+ }
+ catch (err2) {
+ // lstats.isSymbolicLink() threw an error
+ // (probably because fs.lstat returned an invalid result)
+ return callback(err2);
+ }
+
+ if (isSymLink) {
+ // Try to resolve the symlink
+ symlinkStat(fs, path, lstats, callback);
+ }
+ else {
+ // It's not a symlink, so return the stats as-is
+ callback(null, lstats);
+ }
+ });
+}
+
+/**
+ * Retrieves the {@link fs.Stats} for the target of the given symlink.
+ * If the symlink is broken, then the Stats of the symlink itself are returned.
+ *
+ * @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module
+ * @param {string} path - The path of the symlink to return stats for
+ * @param {object} lstats - The stats of the symlink
+ * @param {function} callback
+ */
+function symlinkStat (fs, path, lstats, callback) {
+ call.safe(fs.stat, path, (err, stats) => {
+ if (err) {
+ // The symlink is broken, so return the stats for the link itself
+ return callback(null, lstats);
+ }
+
+ try {
+ // Return the stats for the resolved symlink target,
+ // and override the `isSymbolicLink` method to indicate that it's a symlink
+ stats.isSymbolicLink = () => true;
+ }
+ catch (err2) {
+ // Setting stats.isSymbolicLink threw an error
+ // (probably because fs.stat returned an invalid result)
+ return callback(err2);
+ }
+
+ callback(null, stats);
+ });
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/stream/index.js b/node_modules/@mrmlnc/readdir-enhanced/lib/stream/index.js
new file mode 100644
index 0000000..22a9609
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/stream/index.js
@@ -0,0 +1,25 @@
+'use strict';
+
+module.exports = readdirStream;
+
+const DirectoryReader = require('../directory-reader');
+
+let streamFacade = {
+ fs: require('fs'),
+ forEach: require('../async/for-each'),
+ async: true
+};
+
+/**
+ * Returns the {@link stream.Readable} of an asynchronous {@link DirectoryReader}.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @param {object} internalOptions
+ */
+function readdirStream (dir, options, internalOptions) {
+ internalOptions.facade = streamFacade;
+
+ let reader = new DirectoryReader(dir, options, internalOptions);
+ return reader.stream;
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/sync/for-each.js b/node_modules/@mrmlnc/readdir-enhanced/lib/sync/for-each.js
new file mode 100644
index 0000000..c5ec088
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/sync/for-each.js
@@ -0,0 +1,22 @@
+'use strict';
+
+module.exports = syncForEach;
+
+/**
+ * A facade that allows {@link Array.forEach} to be called as though it were asynchronous.
+ *
+ * @param {array} array - The array to iterate over
+ * @param {function} iterator - The function to call for each item in the array
+ * @param {function} done - The function to call when all iterators have completed
+ */
+function syncForEach (array, iterator, done) {
+ array.forEach(item => {
+ iterator(item, () => {
+ // Note: No error-handling here because this is currently only ever called
+ // by DirectoryReader, which never passes an `error` parameter to the callback.
+ // Instead, DirectoryReader emits an "error" event if an error occurs.
+ });
+ });
+
+ done();
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/sync/fs.js b/node_modules/@mrmlnc/readdir-enhanced/lib/sync/fs.js
new file mode 100644
index 0000000..3aada77
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/sync/fs.js
@@ -0,0 +1,64 @@
+'use strict';
+
+const fs = require('fs');
+const call = require('../call');
+
+/**
+ * A facade around {@link fs.readdirSync} that allows it to be called
+ * the same way as {@link fs.readdir}.
+ *
+ * @param {string} dir
+ * @param {function} callback
+ */
+exports.readdir = function (dir, callback) {
+ // Make sure the callback is only called once
+ callback = call.once(callback);
+
+ try {
+ let items = fs.readdirSync(dir);
+ callback(null, items);
+ }
+ catch (err) {
+ callback(err);
+ }
+};
+
+/**
+ * A facade around {@link fs.statSync} that allows it to be called
+ * the same way as {@link fs.stat}.
+ *
+ * @param {string} path
+ * @param {function} callback
+ */
+exports.stat = function (path, callback) {
+ // Make sure the callback is only called once
+ callback = call.once(callback);
+
+ try {
+ let stats = fs.statSync(path);
+ callback(null, stats);
+ }
+ catch (err) {
+ callback(err);
+ }
+};
+
+/**
+ * A facade around {@link fs.lstatSync} that allows it to be called
+ * the same way as {@link fs.lstat}.
+ *
+ * @param {string} path
+ * @param {function} callback
+ */
+exports.lstat = function (path, callback) {
+ // Make sure the callback is only called once
+ callback = call.once(callback);
+
+ try {
+ let stats = fs.lstatSync(path);
+ callback(null, stats);
+ }
+ catch (err) {
+ callback(err);
+ }
+};
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/sync/index.js b/node_modules/@mrmlnc/readdir-enhanced/lib/sync/index.js
new file mode 100644
index 0000000..60243a1
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/sync/index.js
@@ -0,0 +1,34 @@
+'use strict';
+
+module.exports = readdirSync;
+
+const DirectoryReader = require('../directory-reader');
+
+let syncFacade = {
+ fs: require('./fs'),
+ forEach: require('./for-each'),
+ sync: true
+};
+
+/**
+ * Returns the buffered output from a synchronous {@link DirectoryReader}.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @param {object} internalOptions
+ */
+function readdirSync (dir, options, internalOptions) {
+ internalOptions.facade = syncFacade;
+
+ let reader = new DirectoryReader(dir, options, internalOptions);
+ let stream = reader.stream;
+
+ let results = [];
+ let data = stream.read();
+ while (data !== null) {
+ results.push(data);
+ data = stream.read();
+ }
+
+ return results;
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/package.json b/node_modules/@mrmlnc/readdir-enhanced/package.json
new file mode 100644
index 0000000..e49caa7
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/package.json
@@ -0,0 +1,93 @@
+{
+ "_args": [
+ [
+ "@mrmlnc/readdir-enhanced@2.2.1",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "@mrmlnc/readdir-enhanced@2.2.1",
+ "_id": "@mrmlnc/readdir-enhanced@2.2.1",
+ "_inBundle": false,
+ "_integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "_location": "/@mrmlnc/readdir-enhanced",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "@mrmlnc/readdir-enhanced@2.2.1",
+ "name": "@mrmlnc/readdir-enhanced",
+ "escapedName": "@mrmlnc%2freaddir-enhanced",
+ "scope": "@mrmlnc",
+ "rawSpec": "2.2.1",
+ "saveSpec": null,
+ "fetchSpec": "2.2.1"
+ },
+ "_requiredBy": [
+ "/fast-glob"
+ ],
+ "_resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "_spec": "2.2.1",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "James Messinger",
+ "url": "http://bigstickcarpet.com"
+ },
+ "bugs": {
+ "url": "https://github.com/bigstickcarpet/readdir-enhanced/issues"
+ },
+ "dependencies": {
+ "call-me-maybe": "^1.0.1",
+ "glob-to-regexp": "^0.3.0"
+ },
+ "description": "fs.readdir with sync, async, and streaming APIs + filtering, recursion, absolute paths, etc.",
+ "devDependencies": {
+ "chai": "^4.1.2",
+ "codacy-coverage": "^2.0.3",
+ "coveralls": "^3.0.0",
+ "del": "^3.0.0",
+ "eslint": "^4.15.0",
+ "eslint-config-modular": "^4.1.1",
+ "istanbul": "^0.4.5",
+ "mkdirp": "^0.5.1",
+ "mocha": "^4.1.0",
+ "npm-check": "^5.5.2",
+ "through2": "^2.0.3",
+ "version-bump-prompt": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "files": [
+ "lib",
+ "types.d.ts"
+ ],
+ "homepage": "https://github.com/bigstickcarpet/readdir-enhanced",
+ "keywords": [
+ "fs",
+ "readdir",
+ "stream",
+ "event",
+ "recursive",
+ "deep",
+ "filter",
+ "absolute"
+ ],
+ "license": "MIT",
+ "main": "lib/index.js",
+ "name": "@mrmlnc/readdir-enhanced",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/bigstickcarpet/readdir-enhanced.git"
+ },
+ "scripts": {
+ "bump": "bump --prompt --tag --push --all",
+ "cover": "istanbul cover _mocha",
+ "lint": "eslint lib test --fix",
+ "release": "npm run upgrade && npm test && npm run bump && npm publish",
+ "test": "mocha && npm run lint",
+ "upgrade": "npm-check -u"
+ },
+ "typings": "types.d.ts",
+ "version": "2.2.1"
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/types.d.ts b/node_modules/@mrmlnc/readdir-enhanced/types.d.ts
new file mode 100644
index 0000000..2f4e622
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/types.d.ts
@@ -0,0 +1,67 @@
+///
+
+import fs = require('fs');
+
+declare namespace re {
+ interface Entry extends fs.Stats {
+ path: string;
+ depth: number;
+ }
+
+ type FilterFunction = (stat: Entry) => boolean;
+ type Callback = (err: NodeJS.ErrnoException, result: T) => void;
+ type CallbackString = Callback;
+ type CallbackEntry = Callback;
+
+ interface FileSystem {
+ readdir?: (path: string, callback: Callback) => void;
+ lstat?: (path: string, callback: Callback) => void;
+ stat?: (path: string, callback: Callback) => void;
+ }
+
+ interface Options {
+ filter?: string | RegExp | FilterFunction;
+ deep?: boolean | number | RegExp | FilterFunction;
+ sep?: string;
+ basePath?: string;
+ fs?: FileSystem;
+ }
+
+ function stat(root: string, options?: Options): Promise;
+ function stat(root: string, callback: CallbackEntry): void;
+ function stat(root: string, options: Options, callback: CallbackEntry): void;
+
+ function async(root: string, options?: Options): Promise;
+ function async(root: string, callback: CallbackString): void;
+ function async(root: string, options: Options, callback: CallbackString): void;
+
+ function readdirAsyncStat(root: string, options?: Options): Promise;
+ function readdirAsyncStat(root: string, callback: CallbackEntry): void;
+ function readdirAsyncStat(root: string, options: Options, callback: CallbackEntry): void;
+
+ namespace async {
+ function stat(root: string, options?: Options): Promise;
+ function stat(root: string, callback: CallbackEntry): void;
+ function stat(root: string, options: Options, callback: CallbackEntry): void;
+ }
+
+ function stream(root: string, options?: Options): NodeJS.ReadableStream;
+ function readdirStreamStat(root: string, options?: Options): NodeJS.ReadableStream;
+
+ namespace stream {
+ function stat(root: string, options?: Options): NodeJS.ReadableStream;
+ }
+
+ function sync(root: string, options?: Options): string[];
+ function readdirSyncStat(root: string, options?: Options): Entry[];
+
+ namespace sync {
+ function stat(root: string, options?: Options): Entry[];
+ }
+}
+
+declare function re(root: string, options?: re.Options): Promise;
+declare function re(root: string, callback: re.CallbackString): void;
+declare function re(root: string, options: re.Options, callback: re.CallbackString): void;
+
+export = re;
diff --git a/node_modules/@nodelib/fs.stat/README.md b/node_modules/@nodelib/fs.stat/README.md
new file mode 100644
index 0000000..3f7b835
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/README.md
@@ -0,0 +1,92 @@
+# @nodelib/fs.stat
+
+> Get the status of a file with some features.
+
+## :bulb: Highlights
+
+Wrapper over standard methods ([`fs.lstat`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_fs_lstat_path_callback), [`fs.stat`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_fs_stat_path_callback)) with some features.
+
+ * :beginner: Normally follows symlinks.
+ * :gear: Can safely work with broken symlinks (returns information about symlink instead of generating an error).
+
+## Install
+
+```
+$ npm install @nodelib/fs.stat
+```
+
+## Usage
+
+```js
+const fsStat = require('@nodelib/fs.stat');
+
+fsStat.stat('path').then((stat) => {
+ console.log(stat); // => fs.Stats
+});
+```
+
+## API
+
+### fsStat.stat(path, [options])
+
+Returns a [`Promise`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_class_fs_stats) for provided path.
+
+### fsStat.statSync(path, [options])
+
+Returns a [`fs.Stats`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_class_fs_stats) for provided path.
+
+### fsStat.statCallback(path, [options], callback)
+
+Returns a [`fs.Stats`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_class_fs_stats) for provided path with standard callback-style.
+
+#### path
+
+ * Type: `string | Buffer | URL`
+
+The `path` argument for [`fs.lstat`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_fs_lstat_path_callback) or [`fs.stat`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_fs_stat_path_callback) method.
+
+#### options
+
+ * Type: `Object`
+
+See [options](#options-1) section for more detailed information.
+
+## Options
+
+### throwErrorOnBrokenSymlinks
+
+ * Type: `boolean`
+ * Default: `true`
+
+Throw an error or return information about symlink, when symlink is broken. When `false`, methods will be return lstat call for broken symlinks.
+
+### followSymlinks
+
+ * Type: `boolean`
+ * Default: `true`
+
+By default, the methods of this package follows symlinks. If you do not want it, set this option to `false` or use the standard method [`fs.lstat`](https://nodejs.org/dist/latest/docs/api/fs.html#fs_fs_lstat_path_callback).
+
+### fs
+
+ * Type: `FileSystemAdapter`
+ * Default: `built-in FS methods`
+
+By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace each method with your own.
+
+```ts
+interface FileSystemAdapter {
+ lstat?: typeof fs.lstat;
+ stat?: typeof fs.stat;
+ lstatSync?: typeof fs.lstatSync;
+ statSync?: typeof fs.statSync;
+}
+```
+
+## Changelog
+
+See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelogs for each release version.
+
+## License
+
+This software is released under the terms of the MIT license.
diff --git a/node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts b/node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts
new file mode 100644
index 0000000..ead9b50
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts
@@ -0,0 +1,10 @@
+///
+import * as fs from 'fs';
+export interface FileSystemAdapter {
+ lstat: typeof fs.lstat;
+ stat: typeof fs.stat;
+ lstatSync: typeof fs.lstatSync;
+ statSync: typeof fs.statSync;
+}
+export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter;
+export declare function getFileSystemAdapter(fsMethods?: Partial): FileSystemAdapter;
diff --git a/node_modules/@nodelib/fs.stat/out/adapters/fs.js b/node_modules/@nodelib/fs.stat/out/adapters/fs.js
new file mode 100644
index 0000000..30319b6
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/adapters/fs.js
@@ -0,0 +1,16 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const fs = require("fs");
+exports.FILE_SYSTEM_ADAPTER = {
+ lstat: fs.lstat,
+ stat: fs.stat,
+ lstatSync: fs.lstatSync,
+ statSync: fs.statSync
+};
+function getFileSystemAdapter(fsMethods) {
+ if (!fsMethods) {
+ return exports.FILE_SYSTEM_ADAPTER;
+ }
+ return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods);
+}
+exports.getFileSystemAdapter = getFileSystemAdapter;
diff --git a/node_modules/@nodelib/fs.stat/out/index.d.ts b/node_modules/@nodelib/fs.stat/out/index.d.ts
new file mode 100644
index 0000000..4960107
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/index.d.ts
@@ -0,0 +1,21 @@
+///
+import * as fs from 'fs';
+import { FileSystemAdapter } from './adapters/fs';
+import { Options } from './managers/options';
+import { AsyncCallback } from './providers/stat';
+/**
+ * Asynchronous API.
+ */
+export declare function stat(path: fs.PathLike, opts?: Options): Promise;
+/**
+ * Callback API.
+ */
+export declare function statCallback(path: fs.PathLike, callback: AsyncCallback): void;
+export declare function statCallback(path: fs.PathLike, opts: Options, callback: AsyncCallback): void;
+/**
+ * Synchronous API.
+ */
+export declare function statSync(path: fs.PathLike, opts?: Options): fs.Stats;
+export declare type Options = Options;
+export declare type StatAsyncCallback = AsyncCallback;
+export declare type FileSystemAdapter = FileSystemAdapter;
diff --git a/node_modules/@nodelib/fs.stat/out/index.js b/node_modules/@nodelib/fs.stat/out/index.js
new file mode 100644
index 0000000..26c5ba8
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/index.js
@@ -0,0 +1,31 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const optionsManager = require("./managers/options");
+const statProvider = require("./providers/stat");
+/**
+ * Asynchronous API.
+ */
+function stat(path, opts) {
+ return new Promise((resolve, reject) => {
+ statProvider.async(path, optionsManager.prepare(opts), (err, stats) => err ? reject(err) : resolve(stats));
+ });
+}
+exports.stat = stat;
+function statCallback(path, optsOrCallback, callback) {
+ if (typeof optsOrCallback === 'function') {
+ callback = optsOrCallback; /* tslint:disable-line: no-parameter-reassignment */
+ optsOrCallback = undefined; /* tslint:disable-line: no-parameter-reassignment */
+ }
+ if (typeof callback === 'undefined') {
+ throw new TypeError('The "callback" argument must be of type Function.');
+ }
+ statProvider.async(path, optionsManager.prepare(optsOrCallback), callback);
+}
+exports.statCallback = statCallback;
+/**
+ * Synchronous API.
+ */
+function statSync(path, opts) {
+ return statProvider.sync(path, optionsManager.prepare(opts));
+}
+exports.statSync = statSync;
diff --git a/node_modules/@nodelib/fs.stat/out/managers/options.d.ts b/node_modules/@nodelib/fs.stat/out/managers/options.d.ts
new file mode 100644
index 0000000..6075df3
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/managers/options.d.ts
@@ -0,0 +1,10 @@
+import { FileSystemAdapter } from '../adapters/fs';
+export interface Options {
+ fs?: Partial;
+ throwErrorOnBrokenSymlinks?: boolean;
+ followSymlinks?: boolean;
+}
+export declare type StrictOptions = {
+ fs: FileSystemAdapter;
+} & Required;
+export declare function prepare(opts?: Options): StrictOptions;
diff --git a/node_modules/@nodelib/fs.stat/out/managers/options.js b/node_modules/@nodelib/fs.stat/out/managers/options.js
new file mode 100644
index 0000000..ae52922
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/managers/options.js
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const fsAdapter = require("../adapters/fs");
+function prepare(opts) {
+ const options = Object.assign({
+ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined),
+ throwErrorOnBrokenSymlinks: true,
+ followSymlinks: true
+ }, opts);
+ return options;
+}
+exports.prepare = prepare;
diff --git a/node_modules/@nodelib/fs.stat/out/providers/stat.d.ts b/node_modules/@nodelib/fs.stat/out/providers/stat.d.ts
new file mode 100644
index 0000000..ac2f638
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/providers/stat.d.ts
@@ -0,0 +1,10 @@
+///
+import * as fs from 'fs';
+import { StrictOptions } from '../managers/options';
+export declare function sync(path: fs.PathLike, options: StrictOptions): fs.Stats;
+export declare type AsyncCallback = (err: NodeJS.ErrnoException | null, stats?: fs.Stats) => void;
+export declare function async(path: fs.PathLike, options: StrictOptions, callback: AsyncCallback): void;
+/**
+ * Returns `true` for followed symlink.
+ */
+export declare function isFollowedSymlink(stat: fs.Stats, options: StrictOptions): boolean;
diff --git a/node_modules/@nodelib/fs.stat/out/providers/stat.js b/node_modules/@nodelib/fs.stat/out/providers/stat.js
new file mode 100644
index 0000000..a7bbc52
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/out/providers/stat.js
@@ -0,0 +1,45 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function sync(path, options) {
+ const lstat = options.fs.lstatSync(path);
+ if (!isFollowedSymlink(lstat, options)) {
+ return lstat;
+ }
+ try {
+ const stat = options.fs.statSync(path);
+ stat.isSymbolicLink = () => true;
+ return stat;
+ }
+ catch (err) {
+ if (!options.throwErrorOnBrokenSymlinks) {
+ return lstat;
+ }
+ throw err;
+ }
+}
+exports.sync = sync;
+function async(path, options, callback) {
+ options.fs.lstat(path, (err0, lstat) => {
+ if (err0) {
+ return callback(err0, undefined);
+ }
+ if (!isFollowedSymlink(lstat, options)) {
+ return callback(null, lstat);
+ }
+ options.fs.stat(path, (err1, stat) => {
+ if (err1) {
+ return options.throwErrorOnBrokenSymlinks ? callback(err1) : callback(null, lstat);
+ }
+ stat.isSymbolicLink = () => true;
+ callback(null, stat);
+ });
+ });
+}
+exports.async = async;
+/**
+ * Returns `true` for followed symlink.
+ */
+function isFollowedSymlink(stat, options) {
+ return stat.isSymbolicLink() && options.followSymlinks;
+}
+exports.isFollowedSymlink = isFollowedSymlink;
diff --git a/node_modules/@nodelib/fs.stat/package.json b/node_modules/@nodelib/fs.stat/package.json
new file mode 100644
index 0000000..2386df8
--- /dev/null
+++ b/node_modules/@nodelib/fs.stat/package.json
@@ -0,0 +1,61 @@
+{
+ "_args": [
+ [
+ "@nodelib/fs.stat@1.1.0",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "@nodelib/fs.stat@1.1.0",
+ "_id": "@nodelib/fs.stat@1.1.0",
+ "_inBundle": false,
+ "_integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==",
+ "_location": "/@nodelib/fs.stat",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "@nodelib/fs.stat@1.1.0",
+ "name": "@nodelib/fs.stat",
+ "escapedName": "@nodelib%2ffs.stat",
+ "scope": "@nodelib",
+ "rawSpec": "1.1.0",
+ "saveSpec": null,
+ "fetchSpec": "1.1.0"
+ },
+ "_requiredBy": [
+ "/fast-glob"
+ ],
+ "_resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz",
+ "_spec": "1.1.0",
+ "_where": "C:\\POC\\Natours",
+ "description": "Get the status of a file with some features",
+ "engines": {
+ "node": ">= 6"
+ },
+ "gitHead": "12bf340ba9630871dbe8d1df874d65b46c8d4ab7",
+ "keywords": [
+ "NodeLib",
+ "fs",
+ "FileSystem",
+ "file system",
+ "stat"
+ ],
+ "license": "MIT",
+ "main": "out/index.js",
+ "name": "@nodelib/fs.stat",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/nodelib/nodelib/tree/master/packages/fs.stat"
+ },
+ "scripts": {
+ "build": "npm run clean && npm run lint && npm run compile && npm test",
+ "clean": "rimraf out",
+ "compile": "tsc -p .",
+ "lint": "tslint \"src/**/*.ts\" -p . -t stylish",
+ "test": "mocha \"out/**/*.spec.js\" -s 0",
+ "watch": "npm run clean && npm run lint && npm run compile -- --sourceMap --watch"
+ },
+ "typings": "out/index.d.ts",
+ "version": "1.1.0"
+}
diff --git a/node_modules/accepts/HISTORY.md b/node_modules/accepts/HISTORY.md
new file mode 100644
index 0000000..f16c17a
--- /dev/null
+++ b/node_modules/accepts/HISTORY.md
@@ -0,0 +1,224 @@
+1.3.5 / 2018-02-28
+==================
+
+ * deps: mime-types@~2.1.18
+ - deps: mime-db@~1.33.0
+
+1.3.4 / 2017-08-22
+==================
+
+ * deps: mime-types@~2.1.16
+ - deps: mime-db@~1.29.0
+
+1.3.3 / 2016-05-02
+==================
+
+ * deps: mime-types@~2.1.11
+ - deps: mime-db@~1.23.0
+ * deps: negotiator@0.6.1
+ - perf: improve `Accept` parsing speed
+ - perf: improve `Accept-Charset` parsing speed
+ - perf: improve `Accept-Encoding` parsing speed
+ - perf: improve `Accept-Language` parsing speed
+
+1.3.2 / 2016-03-08
+==================
+
+ * deps: mime-types@~2.1.10
+ - Fix extension of `application/dash+xml`
+ - Update primary extension for `audio/mp4`
+ - deps: mime-db@~1.22.0
+
+1.3.1 / 2016-01-19
+==================
+
+ * deps: mime-types@~2.1.9
+ - deps: mime-db@~1.21.0
+
+1.3.0 / 2015-09-29
+==================
+
+ * deps: mime-types@~2.1.7
+ - deps: mime-db@~1.19.0
+ * deps: negotiator@0.6.0
+ - Fix including type extensions in parameters in `Accept` parsing
+ - Fix parsing `Accept` parameters with quoted equals
+ - Fix parsing `Accept` parameters with quoted semicolons
+ - Lazy-load modules from main entry point
+ - perf: delay type concatenation until needed
+ - perf: enable strict mode
+ - perf: hoist regular expressions
+ - perf: remove closures getting spec properties
+ - perf: remove a closure from media type parsing
+ - perf: remove property delete from media type parsing
+
+1.2.13 / 2015-09-06
+===================
+
+ * deps: mime-types@~2.1.6
+ - deps: mime-db@~1.18.0
+
+1.2.12 / 2015-07-30
+===================
+
+ * deps: mime-types@~2.1.4
+ - deps: mime-db@~1.16.0
+
+1.2.11 / 2015-07-16
+===================
+
+ * deps: mime-types@~2.1.3
+ - deps: mime-db@~1.15.0
+
+1.2.10 / 2015-07-01
+===================
+
+ * deps: mime-types@~2.1.2
+ - deps: mime-db@~1.14.0
+
+1.2.9 / 2015-06-08
+==================
+
+ * deps: mime-types@~2.1.1
+ - perf: fix deopt during mapping
+
+1.2.8 / 2015-06-07
+==================
+
+ * deps: mime-types@~2.1.0
+ - deps: mime-db@~1.13.0
+ * perf: avoid argument reassignment & argument slice
+ * perf: avoid negotiator recursive construction
+ * perf: enable strict mode
+ * perf: remove unnecessary bitwise operator
+
+1.2.7 / 2015-05-10
+==================
+
+ * deps: negotiator@0.5.3
+ - Fix media type parameter matching to be case-insensitive
+
+1.2.6 / 2015-05-07
+==================
+
+ * deps: mime-types@~2.0.11
+ - deps: mime-db@~1.9.1
+ * deps: negotiator@0.5.2
+ - Fix comparing media types with quoted values
+ - Fix splitting media types with quoted commas
+
+1.2.5 / 2015-03-13
+==================
+
+ * deps: mime-types@~2.0.10
+ - deps: mime-db@~1.8.0
+
+1.2.4 / 2015-02-14
+==================
+
+ * Support Node.js 0.6
+ * deps: mime-types@~2.0.9
+ - deps: mime-db@~1.7.0
+ * deps: negotiator@0.5.1
+ - Fix preference sorting to be stable for long acceptable lists
+
+1.2.3 / 2015-01-31
+==================
+
+ * deps: mime-types@~2.0.8
+ - deps: mime-db@~1.6.0
+
+1.2.2 / 2014-12-30
+==================
+
+ * deps: mime-types@~2.0.7
+ - deps: mime-db@~1.5.0
+
+1.2.1 / 2014-12-30
+==================
+
+ * deps: mime-types@~2.0.5
+ - deps: mime-db@~1.3.1
+
+1.2.0 / 2014-12-19
+==================
+
+ * deps: negotiator@0.5.0
+ - Fix list return order when large accepted list
+ - Fix missing identity encoding when q=0 exists
+ - Remove dynamic building of Negotiator class
+
+1.1.4 / 2014-12-10
+==================
+
+ * deps: mime-types@~2.0.4
+ - deps: mime-db@~1.3.0
+
+1.1.3 / 2014-11-09
+==================
+
+ * deps: mime-types@~2.0.3
+ - deps: mime-db@~1.2.0
+
+1.1.2 / 2014-10-14
+==================
+
+ * deps: negotiator@0.4.9
+ - Fix error when media type has invalid parameter
+
+1.1.1 / 2014-09-28
+==================
+
+ * deps: mime-types@~2.0.2
+ - deps: mime-db@~1.1.0
+ * deps: negotiator@0.4.8
+ - Fix all negotiations to be case-insensitive
+ - Stable sort preferences of same quality according to client order
+
+1.1.0 / 2014-09-02
+==================
+
+ * update `mime-types`
+
+1.0.7 / 2014-07-04
+==================
+
+ * Fix wrong type returned from `type` when match after unknown extension
+
+1.0.6 / 2014-06-24
+==================
+
+ * deps: negotiator@0.4.7
+
+1.0.5 / 2014-06-20
+==================
+
+ * fix crash when unknown extension given
+
+1.0.4 / 2014-06-19
+==================
+
+ * use `mime-types`
+
+1.0.3 / 2014-06-11
+==================
+
+ * deps: negotiator@0.4.6
+ - Order by specificity when quality is the same
+
+1.0.2 / 2014-05-29
+==================
+
+ * Fix interpretation when header not in request
+ * deps: pin negotiator@0.4.5
+
+1.0.1 / 2014-01-18
+==================
+
+ * Identity encoding isn't always acceptable
+ * deps: negotiator@~0.4.0
+
+1.0.0 / 2013-12-27
+==================
+
+ * Genesis
diff --git a/node_modules/accepts/LICENSE b/node_modules/accepts/LICENSE
new file mode 100644
index 0000000..0616607
--- /dev/null
+++ b/node_modules/accepts/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2014 Jonathan Ong
+Copyright (c) 2015 Douglas Christopher Wilson
+
+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.
diff --git a/node_modules/accepts/README.md b/node_modules/accepts/README.md
new file mode 100644
index 0000000..6a2749a
--- /dev/null
+++ b/node_modules/accepts/README.md
@@ -0,0 +1,143 @@
+# accepts
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator).
+Extracted from [koa](https://www.npmjs.com/package/koa) for general use.
+
+In addition to negotiator, it allows:
+
+- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])`
+ as well as `('text/html', 'application/json')`.
+- Allows type shorthands such as `json`.
+- Returns `false` when no types match
+- Treats non-existent headers as `*`
+
+## Installation
+
+This is a [Node.js](https://nodejs.org/en/) module available through the
+[npm registry](https://www.npmjs.com/). Installation is done using the
+[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
+
+```sh
+$ npm install accepts
+```
+
+## API
+
+
+
+```js
+var accepts = require('accepts')
+```
+
+### accepts(req)
+
+Create a new `Accepts` object for the given `req`.
+
+#### .charset(charsets)
+
+Return the first accepted charset. If nothing in `charsets` is accepted,
+then `false` is returned.
+
+#### .charsets()
+
+Return the charsets that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### .encoding(encodings)
+
+Return the first accepted encoding. If nothing in `encodings` is accepted,
+then `false` is returned.
+
+#### .encodings()
+
+Return the encodings that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### .language(languages)
+
+Return the first accepted language. If nothing in `languages` is accepted,
+then `false` is returned.
+
+#### .languages()
+
+Return the languages that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### .type(types)
+
+Return the first accepted type (and it is returned as the same text as what
+appears in the `types` array). If nothing in `types` is accepted, then `false`
+is returned.
+
+The `types` array can contain full MIME types or file extensions. Any value
+that is not a full MIME types is passed to `require('mime-types').lookup`.
+
+#### .types()
+
+Return the types that the request accepts, in the order of the client's
+preference (most preferred first).
+
+## Examples
+
+### Simple type negotiation
+
+This simple example shows how to use `accepts` to return a different typed
+respond body based on what the client wants to accept. The server lists it's
+preferences in order and will get back the best match between the client and
+server.
+
+```js
+var accepts = require('accepts')
+var http = require('http')
+
+function app (req, res) {
+ var accept = accepts(req)
+
+ // the order of this list is significant; should be server preferred order
+ switch (accept.type(['json', 'html'])) {
+ case 'json':
+ res.setHeader('Content-Type', 'application/json')
+ res.write('{"hello":"world!"}')
+ break
+ case 'html':
+ res.setHeader('Content-Type', 'text/html')
+ res.write('hello, world! ')
+ break
+ default:
+ // the fallback is text/plain, so no need to specify it above
+ res.setHeader('Content-Type', 'text/plain')
+ res.write('hello, world!')
+ break
+ }
+
+ res.end()
+}
+
+http.createServer(app).listen(3000)
+```
+
+You can test this out with the cURL program:
+```sh
+curl -I -H'Accept: text/html' http://localhost:3000/
+```
+
+## License
+
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/accepts.svg
+[npm-url]: https://npmjs.org/package/accepts
+[node-version-image]: https://img.shields.io/node/v/accepts.svg
+[node-version-url]: https://nodejs.org/en/download/
+[travis-image]: https://img.shields.io/travis/jshttp/accepts/master.svg
+[travis-url]: https://travis-ci.org/jshttp/accepts
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/accepts/master.svg
+[coveralls-url]: https://coveralls.io/r/jshttp/accepts
+[downloads-image]: https://img.shields.io/npm/dm/accepts.svg
+[downloads-url]: https://npmjs.org/package/accepts
diff --git a/node_modules/accepts/index.js b/node_modules/accepts/index.js
new file mode 100644
index 0000000..e9b2f63
--- /dev/null
+++ b/node_modules/accepts/index.js
@@ -0,0 +1,238 @@
+/*!
+ * accepts
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var Negotiator = require('negotiator')
+var mime = require('mime-types')
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = Accepts
+
+/**
+ * Create a new Accepts object for the given req.
+ *
+ * @param {object} req
+ * @public
+ */
+
+function Accepts (req) {
+ if (!(this instanceof Accepts)) {
+ return new Accepts(req)
+ }
+
+ this.headers = req.headers
+ this.negotiator = new Negotiator(req)
+}
+
+/**
+ * Check if the given `type(s)` is acceptable, returning
+ * the best match when true, otherwise `undefined`, in which
+ * case you should respond with 406 "Not Acceptable".
+ *
+ * The `type` value may be a single mime type string
+ * such as "application/json", the extension name
+ * such as "json" or an array `["json", "html", "text/plain"]`. When a list
+ * or array is given the _best_ match, if any is returned.
+ *
+ * Examples:
+ *
+ * // Accept: text/html
+ * this.types('html');
+ * // => "html"
+ *
+ * // Accept: text/*, application/json
+ * this.types('html');
+ * // => "html"
+ * this.types('text/html');
+ * // => "text/html"
+ * this.types('json', 'text');
+ * // => "json"
+ * this.types('application/json');
+ * // => "application/json"
+ *
+ * // Accept: text/*, application/json
+ * this.types('image/png');
+ * this.types('png');
+ * // => undefined
+ *
+ * // Accept: text/*;q=.5, application/json
+ * this.types(['html', 'json']);
+ * this.types('html', 'json');
+ * // => "json"
+ *
+ * @param {String|Array} types...
+ * @return {String|Array|Boolean}
+ * @public
+ */
+
+Accepts.prototype.type =
+Accepts.prototype.types = function (types_) {
+ var types = types_
+
+ // support flattened arguments
+ if (types && !Array.isArray(types)) {
+ types = new Array(arguments.length)
+ for (var i = 0; i < types.length; i++) {
+ types[i] = arguments[i]
+ }
+ }
+
+ // no types, return all requested types
+ if (!types || types.length === 0) {
+ return this.negotiator.mediaTypes()
+ }
+
+ // no accept header, return first given type
+ if (!this.headers.accept) {
+ return types[0]
+ }
+
+ var mimes = types.map(extToMime)
+ var accepts = this.negotiator.mediaTypes(mimes.filter(validMime))
+ var first = accepts[0]
+
+ return first
+ ? types[mimes.indexOf(first)]
+ : false
+}
+
+/**
+ * Return accepted encodings or best fit based on `encodings`.
+ *
+ * Given `Accept-Encoding: gzip, deflate`
+ * an array sorted by quality is returned:
+ *
+ * ['gzip', 'deflate']
+ *
+ * @param {String|Array} encodings...
+ * @return {String|Array}
+ * @public
+ */
+
+Accepts.prototype.encoding =
+Accepts.prototype.encodings = function (encodings_) {
+ var encodings = encodings_
+
+ // support flattened arguments
+ if (encodings && !Array.isArray(encodings)) {
+ encodings = new Array(arguments.length)
+ for (var i = 0; i < encodings.length; i++) {
+ encodings[i] = arguments[i]
+ }
+ }
+
+ // no encodings, return all requested encodings
+ if (!encodings || encodings.length === 0) {
+ return this.negotiator.encodings()
+ }
+
+ return this.negotiator.encodings(encodings)[0] || false
+}
+
+/**
+ * Return accepted charsets or best fit based on `charsets`.
+ *
+ * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
+ * an array sorted by quality is returned:
+ *
+ * ['utf-8', 'utf-7', 'iso-8859-1']
+ *
+ * @param {String|Array} charsets...
+ * @return {String|Array}
+ * @public
+ */
+
+Accepts.prototype.charset =
+Accepts.prototype.charsets = function (charsets_) {
+ var charsets = charsets_
+
+ // support flattened arguments
+ if (charsets && !Array.isArray(charsets)) {
+ charsets = new Array(arguments.length)
+ for (var i = 0; i < charsets.length; i++) {
+ charsets[i] = arguments[i]
+ }
+ }
+
+ // no charsets, return all requested charsets
+ if (!charsets || charsets.length === 0) {
+ return this.negotiator.charsets()
+ }
+
+ return this.negotiator.charsets(charsets)[0] || false
+}
+
+/**
+ * Return accepted languages or best fit based on `langs`.
+ *
+ * Given `Accept-Language: en;q=0.8, es, pt`
+ * an array sorted by quality is returned:
+ *
+ * ['es', 'pt', 'en']
+ *
+ * @param {String|Array} langs...
+ * @return {Array|String}
+ * @public
+ */
+
+Accepts.prototype.lang =
+Accepts.prototype.langs =
+Accepts.prototype.language =
+Accepts.prototype.languages = function (languages_) {
+ var languages = languages_
+
+ // support flattened arguments
+ if (languages && !Array.isArray(languages)) {
+ languages = new Array(arguments.length)
+ for (var i = 0; i < languages.length; i++) {
+ languages[i] = arguments[i]
+ }
+ }
+
+ // no languages, return all requested languages
+ if (!languages || languages.length === 0) {
+ return this.negotiator.languages()
+ }
+
+ return this.negotiator.languages(languages)[0] || false
+}
+
+/**
+ * Convert extnames to mime.
+ *
+ * @param {String} type
+ * @return {String}
+ * @private
+ */
+
+function extToMime (type) {
+ return type.indexOf('/') === -1
+ ? mime.lookup(type)
+ : type
+}
+
+/**
+ * Check if mime is valid.
+ *
+ * @param {String} type
+ * @return {String}
+ * @private
+ */
+
+function validMime (type) {
+ return typeof type === 'string'
+}
diff --git a/node_modules/accepts/package.json b/node_modules/accepts/package.json
new file mode 100644
index 0000000..104e7c4
--- /dev/null
+++ b/node_modules/accepts/package.json
@@ -0,0 +1,89 @@
+{
+ "_args": [
+ [
+ "accepts@1.3.5",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "accepts@1.3.5",
+ "_id": "accepts@1.3.5",
+ "_inBundle": false,
+ "_integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "_location": "/accepts",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "accepts@1.3.5",
+ "name": "accepts",
+ "escapedName": "accepts",
+ "rawSpec": "1.3.5",
+ "saveSpec": null,
+ "fetchSpec": "1.3.5"
+ },
+ "_requiredBy": [
+ "/serve-index"
+ ],
+ "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+ "_spec": "1.3.5",
+ "_where": "C:\\POC\\Natours",
+ "bugs": {
+ "url": "https://github.com/jshttp/accepts/issues"
+ },
+ "contributors": [
+ {
+ "name": "Douglas Christopher Wilson",
+ "email": "doug@somethingdoug.com"
+ },
+ {
+ "name": "Jonathan Ong",
+ "email": "me@jongleberry.com",
+ "url": "http://jongleberry.com"
+ }
+ ],
+ "dependencies": {
+ "mime-types": "~2.1.18",
+ "negotiator": "0.6.1"
+ },
+ "description": "Higher-level content negotiation",
+ "devDependencies": {
+ "eslint": "4.18.1",
+ "eslint-config-standard": "11.0.0",
+ "eslint-plugin-import": "2.9.0",
+ "eslint-plugin-markdown": "1.0.0-beta.6",
+ "eslint-plugin-node": "6.0.1",
+ "eslint-plugin-promise": "3.6.0",
+ "eslint-plugin-standard": "3.0.1",
+ "istanbul": "0.4.5",
+ "mocha": "~1.21.5"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "files": [
+ "LICENSE",
+ "HISTORY.md",
+ "index.js"
+ ],
+ "homepage": "https://github.com/jshttp/accepts#readme",
+ "keywords": [
+ "content",
+ "negotiation",
+ "accept",
+ "accepts"
+ ],
+ "license": "MIT",
+ "name": "accepts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jshttp/accepts.git"
+ },
+ "scripts": {
+ "lint": "eslint --plugin markdown --ext js,md .",
+ "test": "mocha --reporter spec --check-leaks --bail test/",
+ "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+ "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
+ },
+ "version": "1.3.5"
+}
diff --git a/node_modules/ansi-regex/index.js b/node_modules/ansi-regex/index.js
new file mode 100644
index 0000000..b9574ed
--- /dev/null
+++ b/node_modules/ansi-regex/index.js
@@ -0,0 +1,4 @@
+'use strict';
+module.exports = function () {
+ return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;
+};
diff --git a/node_modules/ansi-regex/license b/node_modules/ansi-regex/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/ansi-regex/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+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.
diff --git a/node_modules/ansi-regex/package.json b/node_modules/ansi-regex/package.json
new file mode 100644
index 0000000..655a611
--- /dev/null
+++ b/node_modules/ansi-regex/package.json
@@ -0,0 +1,113 @@
+{
+ "_args": [
+ [
+ "ansi-regex@2.1.1",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "ansi-regex@2.1.1",
+ "_id": "ansi-regex@2.1.1",
+ "_inBundle": false,
+ "_integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "_location": "/ansi-regex",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "ansi-regex@2.1.1",
+ "name": "ansi-regex",
+ "escapedName": "ansi-regex",
+ "rawSpec": "2.1.1",
+ "saveSpec": null,
+ "fetchSpec": "2.1.1"
+ },
+ "_requiredBy": [
+ "/has-ansi",
+ "/strip-ansi"
+ ],
+ "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "_spec": "2.1.1",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-regex/issues"
+ },
+ "description": "Regular expression for matching ANSI escape codes",
+ "devDependencies": {
+ "ava": "0.17.0",
+ "xo": "0.16.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/chalk/ansi-regex#readme",
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "command-line",
+ "text",
+ "regex",
+ "regexp",
+ "re",
+ "match",
+ "test",
+ "find",
+ "pattern"
+ ],
+ "license": "MIT",
+ "maintainers": [
+ {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ {
+ "name": "Joshua Appelman",
+ "email": "jappelman@xebia.com",
+ "url": "jbnicolai.com"
+ },
+ {
+ "name": "JD Ballard",
+ "email": "i.am.qix@gmail.com",
+ "url": "github.com/qix-"
+ }
+ ],
+ "name": "ansi-regex",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/ansi-regex.git"
+ },
+ "scripts": {
+ "test": "xo && ava --verbose",
+ "view-supported": "node fixtures/view-codes.js"
+ },
+ "version": "2.1.1",
+ "xo": {
+ "rules": {
+ "guard-for-in": 0,
+ "no-loop-func": 0
+ }
+ }
+}
diff --git a/node_modules/ansi-regex/readme.md b/node_modules/ansi-regex/readme.md
new file mode 100644
index 0000000..6a928ed
--- /dev/null
+++ b/node_modules/ansi-regex/readme.md
@@ -0,0 +1,39 @@
+# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex)
+
+> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install --save ansi-regex
+```
+
+
+## Usage
+
+```js
+const ansiRegex = require('ansi-regex');
+
+ansiRegex().test('\u001b[4mcake\u001b[0m');
+//=> true
+
+ansiRegex().test('cake');
+//=> false
+
+'\u001b[4mcake\u001b[0m'.match(ansiRegex());
+//=> ['\u001b[4m', '\u001b[0m']
+```
+
+## FAQ
+
+### Why do you test for codes not in the ECMA 48 standard?
+
+Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. If I recall correctly, we test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.
+
+On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out.
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/anymatch/LICENSE b/node_modules/anymatch/LICENSE
new file mode 100644
index 0000000..bc42470
--- /dev/null
+++ b/node_modules/anymatch/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2014 Elan Shanker
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/anymatch/README.md b/node_modules/anymatch/README.md
new file mode 100644
index 0000000..62f65da
--- /dev/null
+++ b/node_modules/anymatch/README.md
@@ -0,0 +1,98 @@
+anymatch [![Build Status](https://travis-ci.org/es128/anymatch.svg?branch=master)](https://travis-ci.org/es128/anymatch) [![Coverage Status](https://img.shields.io/coveralls/es128/anymatch.svg?branch=master)](https://coveralls.io/r/es128/anymatch?branch=master)
+======
+Javascript module to match a string against a regular expression, glob, string,
+or function that takes the string as an argument and returns a truthy or falsy
+value. The matcher can also be an array of any or all of these. Useful for
+allowing a very flexible user-defined config to define things like file paths.
+
+[![NPM](https://nodei.co/npm/anymatch.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/anymatch/)
+[![NPM](https://nodei.co/npm-dl/anymatch.png?height=3&months=9)](https://nodei.co/npm-dl/anymatch/)
+
+Usage
+-----
+```sh
+npm install anymatch --save
+```
+
+#### anymatch (matchers, testString, [returnIndex], [startIndex], [endIndex])
+* __matchers__: (_Array|String|RegExp|Function_)
+String to be directly matched, string with glob patterns, regular expression
+test, function that takes the testString as an argument and returns a truthy
+value if it should be matched, or an array of any number and mix of these types.
+* __testString__: (_String|Array_) The string to test against the matchers. If
+passed as an array, the first element of the array will be used as the
+`testString` for non-function matchers, while the entire array will be applied
+as the arguments for function matchers.
+* __returnIndex__: (_Boolean [optional]_) If true, return the array index of
+the first matcher that that testString matched, or -1 if no match, instead of a
+boolean result.
+* __startIndex, endIndex__: (_Integer [optional]_) Can be used to define a
+subset out of the array of provided matchers to test against. Can be useful
+with bound matcher functions (see below). When used with `returnIndex = true`
+preserves original indexing. Behaves the same as `Array.prototype.slice` (i.e.
+includes array members up to, but not including endIndex).
+
+```js
+var anymatch = require('anymatch');
+
+var matchers = [
+ 'path/to/file.js',
+ 'path/anyjs/**/*.js',
+ /foo\.js$/,
+ function (string) {
+ return string.indexOf('bar') !== -1 && string.length > 10
+ }
+];
+
+anymatch(matchers, 'path/to/file.js'); // true
+anymatch(matchers, 'path/anyjs/baz.js'); // true
+anymatch(matchers, 'path/to/foo.js'); // true
+anymatch(matchers, 'path/to/bar.js'); // true
+anymatch(matchers, 'bar.js'); // false
+
+// returnIndex = true
+anymatch(matchers, 'foo.js', true); // 2
+anymatch(matchers, 'path/anyjs/foo.js', true); // 1
+
+// skip matchers
+anymatch(matchers, 'path/to/file.js', false, 1); // false
+anymatch(matchers, 'path/anyjs/foo.js', true, 2, 3); // 2
+anymatch(matchers, 'path/to/bar.js', true, 0, 3); // -1
+
+// using globs to match directories and their children
+anymatch('node_modules', 'node_modules'); // true
+anymatch('node_modules', 'node_modules/somelib/index.js'); // false
+anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true
+anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false
+anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true
+```
+
+#### anymatch (matchers)
+You can also pass in only your matcher(s) to get a curried function that has
+already been bound to the provided matching criteria. This can be used as an
+`Array.prototype.filter` callback.
+
+```js
+var matcher = anymatch(matchers);
+
+matcher('path/to/file.js'); // true
+matcher('path/anyjs/baz.js', true); // 1
+matcher('path/anyjs/baz.js', true, 2); // -1
+
+['foo.js', 'bar.js'].filter(matcher); // ['foo.js']
+```
+
+Change Log
+----------
+[See release notes page on GitHub](https://github.com/es128/anymatch/releases)
+
+NOTE: As of v1.2.0, anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch)
+for glob pattern matching. The glob matching behavior should be functionally
+equivalent to the commonly used [minimatch](https://github.com/isaacs/minimatch)
+library (aside from some fixed bugs and greater performance), so a major
+version bump wasn't merited. Issues with glob pattern matching should be
+reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues).
+
+License
+-------
+[ISC](https://raw.github.com/es128/anymatch/master/LICENSE)
diff --git a/node_modules/anymatch/index.js b/node_modules/anymatch/index.js
new file mode 100644
index 0000000..e411618
--- /dev/null
+++ b/node_modules/anymatch/index.js
@@ -0,0 +1,67 @@
+'use strict';
+
+var micromatch = require('micromatch');
+var normalize = require('normalize-path');
+var path = require('path'); // required for tests.
+var arrify = function(a) { return a == null ? [] : (Array.isArray(a) ? a : [a]); };
+
+var anymatch = function(criteria, value, returnIndex, startIndex, endIndex) {
+ criteria = arrify(criteria);
+ value = arrify(value);
+ if (arguments.length === 1) {
+ return anymatch.bind(null, criteria.map(function(criterion) {
+ return typeof criterion === 'string' && criterion[0] !== '!' ?
+ micromatch.matcher(criterion) : criterion;
+ }));
+ }
+ startIndex = startIndex || 0;
+ var string = value[0];
+ var altString, altValue;
+ var matched = false;
+ var matchIndex = -1;
+ function testCriteria(criterion, index) {
+ var result;
+ switch (Object.prototype.toString.call(criterion)) {
+ case '[object String]':
+ result = string === criterion || altString && altString === criterion;
+ result = result || micromatch.isMatch(string, criterion);
+ break;
+ case '[object RegExp]':
+ result = criterion.test(string) || altString && criterion.test(altString);
+ break;
+ case '[object Function]':
+ result = criterion.apply(null, value);
+ result = result || altValue && criterion.apply(null, altValue);
+ break;
+ default:
+ result = false;
+ }
+ if (result) {
+ matchIndex = index + startIndex;
+ }
+ return result;
+ }
+ var crit = criteria;
+ var negGlobs = crit.reduce(function(arr, criterion, index) {
+ if (typeof criterion === 'string' && criterion[0] === '!') {
+ if (crit === criteria) {
+ // make a copy before modifying
+ crit = crit.slice();
+ }
+ crit[index] = null;
+ arr.push(criterion.substr(1));
+ }
+ return arr;
+ }, []);
+ if (!negGlobs.length || !micromatch.any(string, negGlobs)) {
+ if (path.sep === '\\' && typeof string === 'string') {
+ altString = normalize(string);
+ altString = altString === string ? null : altString;
+ if (altString) altValue = [altString].concat(value.slice(1));
+ }
+ matched = crit.slice(startIndex, endIndex).some(testCriteria);
+ }
+ return returnIndex === true ? matchIndex : matched;
+};
+
+module.exports = anymatch;
diff --git a/node_modules/anymatch/package.json b/node_modules/anymatch/package.json
new file mode 100644
index 0000000..d905834
--- /dev/null
+++ b/node_modules/anymatch/package.json
@@ -0,0 +1,76 @@
+{
+ "_args": [
+ [
+ "anymatch@1.3.2",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "anymatch@1.3.2",
+ "_id": "anymatch@1.3.2",
+ "_inBundle": false,
+ "_integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "_location": "/anymatch",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "anymatch@1.3.2",
+ "name": "anymatch",
+ "escapedName": "anymatch",
+ "rawSpec": "1.3.2",
+ "saveSpec": null,
+ "fetchSpec": "1.3.2"
+ },
+ "_requiredBy": [
+ "/chokidar"
+ ],
+ "_resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "_spec": "1.3.2",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Elan Shanker",
+ "url": "http://github.com/es128"
+ },
+ "bugs": {
+ "url": "https://github.com/es128/anymatch/issues"
+ },
+ "dependencies": {
+ "micromatch": "^2.1.5",
+ "normalize-path": "^2.0.0"
+ },
+ "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions",
+ "devDependencies": {
+ "coveralls": "^2.11.2",
+ "istanbul": "^0.3.13",
+ "mocha": "^2.2.4"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/es128/anymatch",
+ "keywords": [
+ "match",
+ "any",
+ "string",
+ "file",
+ "fs",
+ "list",
+ "glob",
+ "regex",
+ "regexp",
+ "regular",
+ "expression",
+ "function"
+ ],
+ "license": "ISC",
+ "name": "anymatch",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/es128/anymatch.git"
+ },
+ "scripts": {
+ "test": "istanbul cover _mocha && cat ./coverage/lcov.info | coveralls"
+ },
+ "version": "1.3.2"
+}
diff --git a/node_modules/apache-crypt/.npmignore b/node_modules/apache-crypt/.npmignore
new file mode 100644
index 0000000..a702fa3
--- /dev/null
+++ b/node_modules/apache-crypt/.npmignore
@@ -0,0 +1,8 @@
+.gitignore
+node_modules
+.project
+apache-crypt.iml
+.idea
+.settings
+test
+.travis.yml
\ No newline at end of file
diff --git a/node_modules/apache-crypt/LICENSE b/node_modules/apache-crypt/LICENSE
new file mode 100644
index 0000000..671bad6
--- /dev/null
+++ b/node_modules/apache-crypt/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Gevorg Harutyunyan
+
+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.
diff --git a/node_modules/apache-crypt/README.md b/node_modules/apache-crypt/README.md
new file mode 100644
index 0000000..475fe01
--- /dev/null
+++ b/node_modules/apache-crypt/README.md
@@ -0,0 +1,80 @@
+# apache-crypt
+[Node.js](http://nodejs.org/) package for Apache style password encryption using crypt(3).
+
+[![Build Status](https://api.travis-ci.org/http-auth/apache-crypt.png)](https://travis-ci.org/http-auth/apache-crypt)
+
+## Installation
+
+Via git (or downloaded tarball):
+
+```bash
+$ git clone git://github.com/http-auth/apache-crypt.git
+```
+Via [npm](http://npmjs.org/):
+
+```bash
+$ npm install apache-crypt
+```
+
+## Usage
+
+```javascript
+var crypt = require("apache-crypt");
+
+// Encrypting password using auto-generated 2 char salt.
+var encryptedPassword = crypt("mypass");
+
+// Should print true.
+console.log(crypt("mypass", encryptedPassword) == encryptedPassword);
+// Should print false.
+console.log(crypt("notmypass", encryptedPassword) == encryptedPassword);
+```
+
+## Running tests
+
+It uses [mocha](https://mochajs.org/), so just run following command in package directory:
+
+```bash
+$ npm test
+```
+
+## Issues
+
+You can find list of issues using **[this link](http://github.com/http-auth/apache-crypt/issues)**.
+
+## Requirements
+
+ - **[Node.js](http://nodejs.org)** - Event-driven I/O server-side JavaScript environment based on V8.
+ - **[npm](http://npmjs.org)** - Package manager. Installs, publishes and manages node programs.
+
+## Dependencies
+
+ - **[unix-crypt-td-js](https://github.com/TimDumol/unix-crypt-td-js/)** - Javascript implementation of the Unix crypt(3) DES-based hash.
+
+## Development dependencies
+
+ - **[mocha](https://mochajs.org/)** - simple, flexible, fun javascript test framework for node.js & the browser.
+ - **[chai](http://chaijs.com/)** - BDD / TDD assertion framework for node.js and the browser that can be paired with any testing framework.
+
+## License
+
+The MIT License (MIT)
+
+Copyright (c) 2016 Gevorg Harutyunyan
+
+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.
diff --git a/node_modules/apache-crypt/package.json b/node_modules/apache-crypt/package.json
new file mode 100644
index 0000000..7917181
--- /dev/null
+++ b/node_modules/apache-crypt/package.json
@@ -0,0 +1,79 @@
+{
+ "_args": [
+ [
+ "apache-crypt@1.2.1",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "apache-crypt@1.2.1",
+ "_id": "apache-crypt@1.2.1",
+ "_inBundle": false,
+ "_integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=",
+ "_location": "/apache-crypt",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "apache-crypt@1.2.1",
+ "name": "apache-crypt",
+ "escapedName": "apache-crypt",
+ "rawSpec": "1.2.1",
+ "saveSpec": null,
+ "fetchSpec": "1.2.1"
+ },
+ "_requiredBy": [
+ "/http-auth"
+ ],
+ "_resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz",
+ "_spec": "1.2.1",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Gevorg Harutyunyan",
+ "url": "http://github.com/gevorg"
+ },
+ "bugs": {
+ "url": "http://github.com/http-auth/apache-crypt/issues"
+ },
+ "dependencies": {
+ "unix-crypt-td-js": "^1.0.0"
+ },
+ "description": "Node.js module for Apache style password encryption using crypt(3).",
+ "devDependencies": {
+ "chai": "^3.5.0",
+ "mocha": "^2.5.3"
+ },
+ "engines": {
+ "node": ">=4.6.1"
+ },
+ "homepage": "http://github.com/http-auth/apache-crypt",
+ "keywords": [
+ "apache",
+ "crypt",
+ "password",
+ "htpasswd"
+ ],
+ "license": "MIT",
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://github.com/http-auth/apache-crypt/blob/master/LICENSE"
+ }
+ ],
+ "main": "./src/index.js",
+ "maintainers": [
+ {
+ "name": "gevorg",
+ "email": "gevorg.ha@gmail.com"
+ }
+ ],
+ "name": "apache-crypt",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/http-auth/apache-crypt.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "version": "1.2.1"
+}
diff --git a/node_modules/apache-crypt/src/index.js b/node_modules/apache-crypt/src/index.js
new file mode 100644
index 0000000..a925633
--- /dev/null
+++ b/node_modules/apache-crypt/src/index.js
@@ -0,0 +1,18 @@
+"use strict";
+
+// Des module.
+const des = require('unix-crypt-td-js');
+
+// Hash generation string.
+const itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+// Salt generation method.
+function getSalt() {
+ return itoa64[ parseInt(Math.random() * 64) ] +
+ itoa64[ parseInt(Math.random() * 64) ];
+}
+
+// Exporting old style.
+module.exports = (password, salt) => {
+ return salt ? des(password, salt) : des(password, getSalt());
+};
\ No newline at end of file
diff --git a/node_modules/apache-md5/.npmignore b/node_modules/apache-md5/.npmignore
new file mode 100644
index 0000000..28ed784
--- /dev/null
+++ b/node_modules/apache-md5/.npmignore
@@ -0,0 +1,8 @@
+.gitignore
+node_modules
+.project
+apache-md5.iml
+.idea
+.settings
+test
+.travis.yml
\ No newline at end of file
diff --git a/node_modules/apache-md5/LICENSE b/node_modules/apache-md5/LICENSE
new file mode 100644
index 0000000..671bad6
--- /dev/null
+++ b/node_modules/apache-md5/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Gevorg Harutyunyan
+
+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.
diff --git a/node_modules/apache-md5/README.md b/node_modules/apache-md5/README.md
new file mode 100644
index 0000000..dcfa7e6
--- /dev/null
+++ b/node_modules/apache-md5/README.md
@@ -0,0 +1,76 @@
+# apache-md5
+[Node.js](http://nodejs.org/) package for Apache style password encryption using md5..
+
+[![Build Status](https://api.travis-ci.org/http-auth/apache-md5.png)](https://travis-ci.org/http-auth/apache-md5)
+
+## Installation
+
+Via git (or downloaded tarball):
+
+```bash
+$ git clone git://github.com/http-auth/apache-md5.git
+```
+Via [npm](http://npmjs.org/):
+
+```bash
+$ npm install apache-md5
+```
+
+## Usage
+
+```javascript
+var md5 = require("apache-md5");
+
+// Encrypting password using apache's md5 algorithm.
+var encryptedPassword = md5("mypass");
+
+// Should print true.
+console.log(md5("mypass", encryptedPassword) == encryptedPassword);
+// Should print false.
+console.log(md5("notmypass", encryptedPassword) == encryptedPassword);
+```
+
+## Running tests
+
+It uses [mocha](https://mochajs.org/), so just run following command in package directory:
+
+```bash
+$ npm test
+```
+
+## Issues
+
+You can find list of issues using **[this link](http://github.com/http-auth/apache-md5/issues)**.
+
+## Requirements
+
+ - **[Node.js](http://nodejs.org)** - Event-driven I/O server-side JavaScript environment based on V8.
+ - **[npm](http://npmjs.org)** - Package manager. Installs, publishes and manages node programs.
+
+## Development dependencies
+
+ - **[mocha](https://mochajs.org/)** - simple, flexible, fun javascript test framework for node.js & the browser.
+ - **[chai](http://chaijs.com/)** - BDD / TDD assertion framework for node.js and the browser that can be paired with any testing framework.
+
+## License
+
+The MIT License (MIT)
+
+Copyright (c) 2016 Gevorg Harutyunyan
+
+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.
diff --git a/node_modules/apache-md5/package.json b/node_modules/apache-md5/package.json
new file mode 100644
index 0000000..2016a5c
--- /dev/null
+++ b/node_modules/apache-md5/package.json
@@ -0,0 +1,76 @@
+{
+ "_args": [
+ [
+ "apache-md5@1.1.2",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "apache-md5@1.1.2",
+ "_id": "apache-md5@1.1.2",
+ "_inBundle": false,
+ "_integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI=",
+ "_location": "/apache-md5",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "apache-md5@1.1.2",
+ "name": "apache-md5",
+ "escapedName": "apache-md5",
+ "rawSpec": "1.1.2",
+ "saveSpec": null,
+ "fetchSpec": "1.1.2"
+ },
+ "_requiredBy": [
+ "/http-auth"
+ ],
+ "_resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.2.tgz",
+ "_spec": "1.1.2",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Gevorg Harutyunyan",
+ "url": "http://github.com/gevorg"
+ },
+ "bugs": {
+ "url": "http://github.com/http-auth/apache-md5/issues"
+ },
+ "description": "Node.js module for Apache style password encryption using md5.",
+ "devDependencies": {
+ "chai": "^3.5.0",
+ "mocha": "^2.5.3"
+ },
+ "engines": {
+ "node": ">=4.6.1"
+ },
+ "homepage": "http://github.com/http-auth/apache-md5",
+ "keywords": [
+ "apache",
+ "md5",
+ "password",
+ "htpasswd"
+ ],
+ "license": "MIT",
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://github.com/http-auth/apache-md5/blob/master/LICENSE"
+ }
+ ],
+ "main": "./src/index.js",
+ "maintainers": [
+ {
+ "name": "gevorg",
+ "email": "gevorg.ha@gmail.com"
+ }
+ ],
+ "name": "apache-md5",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/http-auth/apache-md5.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "version": "1.1.2"
+}
diff --git a/node_modules/apache-md5/src/index.js b/node_modules/apache-md5/src/index.js
new file mode 100644
index 0000000..f939dda
--- /dev/null
+++ b/node_modules/apache-md5/src/index.js
@@ -0,0 +1,111 @@
+"use strict";
+
+// Crypto module import.
+const crypto = require('crypto');
+
+// Hash generation string.
+const itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+
+// To 64 bit version.
+function to64(index, count) {
+ let result = '';
+
+ while (--count >= 0) { // Result char count.
+ result += itoa64[index & 63]; // Get corresponding char.
+ index = index >> 6; // Move to next one.
+ }
+
+ return result;
+}
+
+// Returns salt.
+function getSalt(inputSalt) {
+ let salt = '';
+
+ if (inputSalt) {
+ // Remove $apr1$ token and extract salt.
+ salt = inputSalt.split('$')[2];
+ } else {
+ while(salt.length < 8) { // Random 8 chars.
+ let rchIndex = Math.floor((Math.random() * 64));
+ salt += itoa64[rchIndex];
+ }
+ }
+
+ return salt;
+}
+
+// Returns password.
+function getPassword(final) {
+ // Encrypted pass.
+ let epass = '';
+
+ epass += to64((final.charCodeAt(0) << 16) | (final.charCodeAt(6) << 8) | final.charCodeAt(12), 4);
+ epass += to64((final.charCodeAt(1) << 16) | (final.charCodeAt(7) << 8) | final.charCodeAt(13), 4);
+ epass += to64((final.charCodeAt(2) << 16) | (final.charCodeAt(8) << 8) | final.charCodeAt(14), 4);
+ epass += to64((final.charCodeAt(3) << 16) | (final.charCodeAt(9) << 8) | final.charCodeAt(15), 4);
+ epass += to64((final.charCodeAt(4) << 16) | (final.charCodeAt(10) << 8) | final.charCodeAt(5), 4);
+ epass += to64(final.charCodeAt(11), 2);
+
+ return epass;
+}
+
+// Exporting old style.
+module.exports = (password, salt) => {
+ let magic = '';
+ if (salt && salt.split('$')[1] === '1') {
+ magic = '$1$';
+ } else {
+ magic = '$apr1$';
+ }
+
+ salt = getSalt(salt);
+
+ let ctx = password + magic + salt;
+ let final = crypto.createHash('md5').update(password + salt + password, 'ascii').digest('binary');
+
+ for (let pl = password.length; pl > 0; pl -= 16) {
+ ctx += final.substr(0, (pl > 16) ? 16 : pl);
+ }
+
+ for (let i = password.length; i; i >>= 1) {
+ if (i % 2) {
+ ctx += String.fromCharCode(0);
+ } else {
+ ctx += password.charAt(0);
+ }
+ }
+
+ final = crypto.createHash('md5').update(ctx, 'ascii').digest('binary');
+
+ // 1000 loop.
+ for (let i = 0; i < 1000; ++i) {
+ // Weird stuff.
+ let ctxl = '';
+
+ if (i % 2) {
+ ctxl += password;
+ } else {
+ ctxl += final.substr(0, 16);
+ }
+
+ if (i % 3) {
+ ctxl += salt;
+ }
+
+ if (i % 7) {
+ ctxl += password;
+ }
+
+ if (i % 2) {
+ ctxl += final.substr(0, 16);
+ } else {
+ ctxl += password;
+ }
+
+ // Final assignment after each loop.
+ final = crypto.createHash('md5').update(ctxl, 'ascii').digest('binary');
+ }
+
+ return magic + salt + '$' + getPassword(final);
+};
diff --git a/node_modules/argparse/CHANGELOG.md b/node_modules/argparse/CHANGELOG.md
new file mode 100644
index 0000000..a43c628
--- /dev/null
+++ b/node_modules/argparse/CHANGELOG.md
@@ -0,0 +1,185 @@
+1.0.10 / 2018-02-15
+------------------
+
+- Use .concat instead of + for arrays, #122.
+
+
+1.0.9 / 2016-09-29
+------------------
+
+- Rerelease after 1.0.8 - deps cleanup.
+
+
+1.0.8 / 2016-09-29
+------------------
+
+- Maintenance (deps bump, fix node 6.5+ tests, coverage report).
+
+
+1.0.7 / 2016-03-17
+------------------
+
+- Teach `addArgument` to accept string arg names. #97, @tomxtobin.
+
+
+1.0.6 / 2016-02-06
+------------------
+
+- Maintenance: moved to eslint & updated CS.
+
+
+1.0.5 / 2016-02-05
+------------------
+
+- Removed lodash dependency to significantly reduce install size.
+ Thanks to @mourner.
+
+
+1.0.4 / 2016-01-17
+------------------
+
+- Maintenance: lodash update to 4.0.0.
+
+
+1.0.3 / 2015-10-27
+------------------
+
+- Fix parse `=` in args: `--examplepath="C:\myfolder\env=x64"`. #84, @CatWithApple.
+
+
+1.0.2 / 2015-03-22
+------------------
+
+- Relaxed lodash version dependency.
+
+
+1.0.1 / 2015-02-20
+------------------
+
+- Changed dependencies to be compatible with ancient nodejs.
+
+
+1.0.0 / 2015-02-19
+------------------
+
+- Maintenance release.
+- Replaced `underscore` with `lodash`.
+- Bumped version to 1.0.0 to better reflect semver meaning.
+- HISTORY.md -> CHANGELOG.md
+
+
+0.1.16 / 2013-12-01
+-------------------
+
+- Maintenance release. Updated dependencies and docs.
+
+
+0.1.15 / 2013-05-13
+-------------------
+
+- Fixed #55, @trebor89
+
+
+0.1.14 / 2013-05-12
+-------------------
+
+- Fixed #62, @maxtaco
+
+
+0.1.13 / 2013-04-08
+-------------------
+
+- Added `.npmignore` to reduce package size
+
+
+0.1.12 / 2013-02-10
+-------------------
+
+- Fixed conflictHandler (#46), @hpaulj
+
+
+0.1.11 / 2013-02-07
+-------------------
+
+- Multiple bugfixes, @hpaulj
+- Added 70+ tests (ported from python), @hpaulj
+- Added conflictHandler, @applepicke
+- Added fromfilePrefixChar, @hpaulj
+
+
+0.1.10 / 2012-12-30
+-------------------
+
+- Added [mutual exclusion](http://docs.python.org/dev/library/argparse.html#mutual-exclusion)
+ support, thanks to @hpaulj
+- Fixed options check for `storeConst` & `appendConst` actions, thanks to @hpaulj
+
+
+0.1.9 / 2012-12-27
+------------------
+
+- Fixed option dest interferens with other options (issue #23), thanks to @hpaulj
+- Fixed default value behavior with `*` positionals, thanks to @hpaulj
+- Improve `getDefault()` behavior, thanks to @hpaulj
+- Imrove negative argument parsing, thanks to @hpaulj
+
+
+0.1.8 / 2012-12-01
+------------------
+
+- Fixed parser parents (issue #19), thanks to @hpaulj
+- Fixed negative argument parse (issue #20), thanks to @hpaulj
+
+
+0.1.7 / 2012-10-14
+------------------
+
+- Fixed 'choices' argument parse (issue #16)
+- Fixed stderr output (issue #15)
+
+
+0.1.6 / 2012-09-09
+------------------
+
+- Fixed check for conflict of options (thanks to @tomxtobin)
+
+
+0.1.5 / 2012-09-03
+------------------
+
+- Fix parser #setDefaults method (thanks to @tomxtobin)
+
+
+0.1.4 / 2012-07-30
+------------------
+
+- Fixed pseudo-argument support (thanks to @CGamesPlay)
+- Fixed addHelp default (should be true), if not set (thanks to @benblank)
+
+
+0.1.3 / 2012-06-27
+------------------
+
+- Fixed formatter api name: Formatter -> HelpFormatter
+
+
+0.1.2 / 2012-05-29
+------------------
+
+- Added basic tests
+- Removed excess whitespace in help
+- Fixed error reporting, when parcer with subcommands
+ called with empty arguments
+
+
+0.1.1 / 2012-05-23
+------------------
+
+- Fixed line wrapping in help formatter
+- Added better error reporting on invalid arguments
+
+
+0.1.0 / 2012-05-16
+------------------
+
+- First release.
diff --git a/node_modules/argparse/LICENSE b/node_modules/argparse/LICENSE
new file mode 100644
index 0000000..1afdae5
--- /dev/null
+++ b/node_modules/argparse/LICENSE
@@ -0,0 +1,21 @@
+(The MIT License)
+
+Copyright (C) 2012 by Vitaly Puzrin
+
+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.
diff --git a/node_modules/argparse/README.md b/node_modules/argparse/README.md
new file mode 100644
index 0000000..7fa6c40
--- /dev/null
+++ b/node_modules/argparse/README.md
@@ -0,0 +1,257 @@
+argparse
+========
+
+[![Build Status](https://secure.travis-ci.org/nodeca/argparse.svg?branch=master)](http://travis-ci.org/nodeca/argparse)
+[![NPM version](https://img.shields.io/npm/v/argparse.svg)](https://www.npmjs.org/package/argparse)
+
+CLI arguments parser for node.js. Javascript port of python's
+[argparse](http://docs.python.org/dev/library/argparse.html) module
+(original version 3.2). That's a full port, except some very rare options,
+recorded in issue tracker.
+
+**NB. Difference with original.**
+
+- Method names changed to camelCase. See [generated docs](http://nodeca.github.com/argparse/).
+- Use `defaultValue` instead of `default`.
+- Use `argparse.Const.REMAINDER` instead of `argparse.REMAINDER`, and
+ similarly for constant values `OPTIONAL`, `ZERO_OR_MORE`, and `ONE_OR_MORE`
+ (aliases for `nargs` values `'?'`, `'*'`, `'+'`, respectively), and
+ `SUPPRESS`.
+
+
+Example
+=======
+
+test.js file:
+
+```javascript
+#!/usr/bin/env node
+'use strict';
+
+var ArgumentParser = require('../lib/argparse').ArgumentParser;
+var parser = new ArgumentParser({
+ version: '0.0.1',
+ addHelp:true,
+ description: 'Argparse example'
+});
+parser.addArgument(
+ [ '-f', '--foo' ],
+ {
+ help: 'foo bar'
+ }
+);
+parser.addArgument(
+ [ '-b', '--bar' ],
+ {
+ help: 'bar foo'
+ }
+);
+parser.addArgument(
+ '--baz',
+ {
+ help: 'baz bar'
+ }
+);
+var args = parser.parseArgs();
+console.dir(args);
+```
+
+Display help:
+
+```
+$ ./test.js -h
+usage: example.js [-h] [-v] [-f FOO] [-b BAR] [--baz BAZ]
+
+Argparse example
+
+Optional arguments:
+ -h, --help Show this help message and exit.
+ -v, --version Show program's version number and exit.
+ -f FOO, --foo FOO foo bar
+ -b BAR, --bar BAR bar foo
+ --baz BAZ baz bar
+```
+
+Parse arguments:
+
+```
+$ ./test.js -f=3 --bar=4 --baz 5
+{ foo: '3', bar: '4', baz: '5' }
+```
+
+More [examples](https://github.com/nodeca/argparse/tree/master/examples).
+
+
+ArgumentParser objects
+======================
+
+```
+new ArgumentParser({parameters hash});
+```
+
+Creates a new ArgumentParser object.
+
+**Supported params:**
+
+- ```description``` - Text to display before the argument help.
+- ```epilog``` - Text to display after the argument help.
+- ```addHelp``` - Add a -h/–help option to the parser. (default: true)
+- ```argumentDefault``` - Set the global default value for arguments. (default: null)
+- ```parents``` - A list of ArgumentParser objects whose arguments should also be included.
+- ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘)
+- ```formatterClass``` - A class for customizing the help output.
+- ```prog``` - The name of the program (default: `path.basename(process.argv[1])`)
+- ```usage``` - The string describing the program usage (default: generated)
+- ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals.
+
+**Not supported yet**
+
+- ```fromfilePrefixChars``` - The set of characters that prefix files from which additional arguments should be read.
+
+
+Details in [original ArgumentParser guide](http://docs.python.org/dev/library/argparse.html#argumentparser-objects)
+
+
+addArgument() method
+====================
+
+```
+ArgumentParser.addArgument(name or flag or [name] or [flags...], {options})
+```
+
+Defines how a single command-line argument should be parsed.
+
+- ```name or flag or [name] or [flags...]``` - Either a positional name
+ (e.g., `'foo'`), a single option (e.g., `'-f'` or `'--foo'`), an array
+ of a single positional name (e.g., `['foo']`), or an array of options
+ (e.g., `['-f', '--foo']`).
+
+Options:
+
+- ```action``` - The basic type of action to be taken when this argument is encountered at the command line.
+- ```nargs```- The number of command-line arguments that should be consumed.
+- ```constant``` - A constant value required by some action and nargs selections.
+- ```defaultValue``` - The value produced if the argument is absent from the command line.
+- ```type``` - The type to which the command-line argument should be converted.
+- ```choices``` - A container of the allowable values for the argument.
+- ```required``` - Whether or not the command-line option may be omitted (optionals only).
+- ```help``` - A brief description of what the argument does.
+- ```metavar``` - A name for the argument in usage messages.
+- ```dest``` - The name of the attribute to be added to the object returned by parseArgs().
+
+Details in [original add_argument guide](http://docs.python.org/dev/library/argparse.html#the-add-argument-method)
+
+
+Action (some details)
+================
+
+ArgumentParser objects associate command-line arguments with actions.
+These actions can do just about anything with the command-line arguments associated
+with them, though most actions simply add an attribute to the object returned by
+parseArgs(). The action keyword argument specifies how the command-line arguments
+should be handled. The supported actions are:
+
+- ```store``` - Just stores the argument’s value. This is the default action.
+- ```storeConst``` - Stores value, specified by the const keyword argument.
+ (Note that the const keyword argument defaults to the rather unhelpful None.)
+ The 'storeConst' action is most commonly used with optional arguments, that
+ specify some sort of flag.
+- ```storeTrue``` and ```storeFalse``` - Stores values True and False
+ respectively. These are special cases of 'storeConst'.
+- ```append``` - Stores a list, and appends each argument value to the list.
+ This is useful to allow an option to be specified multiple times.
+- ```appendConst``` - Stores a list, and appends value, specified by the
+ const keyword argument to the list. (Note, that the const keyword argument defaults
+ is None.) The 'appendConst' action is typically used when multiple arguments need
+ to store constants to the same list.
+- ```count``` - Counts the number of times a keyword argument occurs. For example,
+ used for increasing verbosity levels.
+- ```help``` - Prints a complete help message for all the options in the current
+ parser and then exits. By default a help action is automatically added to the parser.
+ See ArgumentParser for details of how the output is created.
+- ```version``` - Prints version information and exit. Expects a `version=`
+ keyword argument in the addArgument() call.
+
+Details in [original action guide](http://docs.python.org/dev/library/argparse.html#action)
+
+
+Sub-commands
+============
+
+ArgumentParser.addSubparsers()
+
+Many programs split their functionality into a number of sub-commands, for
+example, the svn program can invoke sub-commands like `svn checkout`, `svn update`,
+and `svn commit`. Splitting up functionality this way can be a particularly good
+idea when a program performs several different functions which require different
+kinds of command-line arguments. `ArgumentParser` supports creation of such
+sub-commands with `addSubparsers()` method. The `addSubparsers()` method is
+normally called with no arguments and returns an special action object.
+This object has a single method `addParser()`, which takes a command name and
+any `ArgumentParser` constructor arguments, and returns an `ArgumentParser` object
+that can be modified as usual.
+
+Example:
+
+sub_commands.js
+```javascript
+#!/usr/bin/env node
+'use strict';
+
+var ArgumentParser = require('../lib/argparse').ArgumentParser;
+var parser = new ArgumentParser({
+ version: '0.0.1',
+ addHelp:true,
+ description: 'Argparse examples: sub-commands',
+});
+
+var subparsers = parser.addSubparsers({
+ title:'subcommands',
+ dest:"subcommand_name"
+});
+
+var bar = subparsers.addParser('c1', {addHelp:true});
+bar.addArgument(
+ [ '-f', '--foo' ],
+ {
+ action: 'store',
+ help: 'foo3 bar3'
+ }
+);
+var bar = subparsers.addParser(
+ 'c2',
+ {aliases:['co'], addHelp:true}
+);
+bar.addArgument(
+ [ '-b', '--bar' ],
+ {
+ action: 'store',
+ type: 'int',
+ help: 'foo3 bar3'
+ }
+);
+
+var args = parser.parseArgs();
+console.dir(args);
+
+```
+
+Details in [original sub-commands guide](http://docs.python.org/dev/library/argparse.html#sub-commands)
+
+
+Contributors
+============
+
+- [Eugene Shkuropat](https://github.com/shkuropat)
+- [Paul Jacobson](https://github.com/hpaulj)
+
+[others](https://github.com/nodeca/argparse/graphs/contributors)
+
+License
+=======
+
+Copyright (c) 2012 [Vitaly Puzrin](https://github.com/puzrin).
+Released under the MIT license. See
+[LICENSE](https://github.com/nodeca/argparse/blob/master/LICENSE) for details.
+
+
diff --git a/node_modules/argparse/index.js b/node_modules/argparse/index.js
new file mode 100644
index 0000000..3bbc143
--- /dev/null
+++ b/node_modules/argparse/index.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./lib/argparse');
diff --git a/node_modules/argparse/lib/action.js b/node_modules/argparse/lib/action.js
new file mode 100644
index 0000000..1483c79
--- /dev/null
+++ b/node_modules/argparse/lib/action.js
@@ -0,0 +1,146 @@
+/**
+ * class Action
+ *
+ * Base class for all actions
+ * Do not call in your code, use this class only for inherits your own action
+ *
+ * Information about how to convert command line strings to Javascript objects.
+ * Action objects are used by an ArgumentParser to represent the information
+ * needed to parse a single argument from one or more strings from the command
+ * line. The keyword arguments to the Action constructor are also all attributes
+ * of Action instances.
+ *
+ * ##### Allowed keywords:
+ *
+ * - `store`
+ * - `storeConstant`
+ * - `storeTrue`
+ * - `storeFalse`
+ * - `append`
+ * - `appendConstant`
+ * - `count`
+ * - `help`
+ * - `version`
+ *
+ * Information about action options see [[Action.new]]
+ *
+ * See also [original guide](http://docs.python.org/dev/library/argparse.html#action)
+ *
+ **/
+
+'use strict';
+
+
+// Constants
+var c = require('./const');
+
+
+/**
+ * new Action(options)
+ *
+ * Base class for all actions. Used only for inherits
+ *
+ *
+ * ##### Options:
+ *
+ * - `optionStrings` A list of command-line option strings for the action.
+ * - `dest` Attribute to hold the created object(s)
+ * - `nargs` The number of command-line arguments that should be consumed.
+ * By default, one argument will be consumed and a single value will be
+ * produced.
+ * - `constant` Default value for an action with no value.
+ * - `defaultValue` The value to be produced if the option is not specified.
+ * - `type` Cast to 'string'|'int'|'float'|'complex'|function (string). If
+ * None, 'string'.
+ * - `choices` The choices available.
+ * - `required` True if the action must always be specified at the command
+ * line.
+ * - `help` The help describing the argument.
+ * - `metavar` The name to be used for the option's argument with the help
+ * string. If None, the 'dest' value will be used as the name.
+ *
+ * ##### nargs supported values:
+ *
+ * - `N` (an integer) consumes N arguments (and produces a list)
+ * - `?` consumes zero or one arguments
+ * - `*` consumes zero or more arguments (and produces a list)
+ * - `+` consumes one or more arguments (and produces a list)
+ *
+ * Note: that the difference between the default and nargs=1 is that with the
+ * default, a single value will be produced, while with nargs=1, a list
+ * containing a single value will be produced.
+ **/
+var Action = module.exports = function Action(options) {
+ options = options || {};
+ this.optionStrings = options.optionStrings || [];
+ this.dest = options.dest;
+ this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null;
+ this.constant = typeof options.constant !== 'undefined' ? options.constant : null;
+ this.defaultValue = options.defaultValue;
+ this.type = typeof options.type !== 'undefined' ? options.type : null;
+ this.choices = typeof options.choices !== 'undefined' ? options.choices : null;
+ this.required = typeof options.required !== 'undefined' ? options.required : false;
+ this.help = typeof options.help !== 'undefined' ? options.help : null;
+ this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null;
+
+ if (!(this.optionStrings instanceof Array)) {
+ throw new Error('optionStrings should be an array');
+ }
+ if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') {
+ throw new Error('required should be a boolean');
+ }
+};
+
+/**
+ * Action#getName -> String
+ *
+ * Tells action name
+ **/
+Action.prototype.getName = function () {
+ if (this.optionStrings.length > 0) {
+ return this.optionStrings.join('/');
+ } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) {
+ return this.metavar;
+ } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) {
+ return this.dest;
+ }
+ return null;
+};
+
+/**
+ * Action#isOptional -> Boolean
+ *
+ * Return true if optional
+ **/
+Action.prototype.isOptional = function () {
+ return !this.isPositional();
+};
+
+/**
+ * Action#isPositional -> Boolean
+ *
+ * Return true if positional
+ **/
+Action.prototype.isPositional = function () {
+ return (this.optionStrings.length === 0);
+};
+
+/**
+ * Action#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Call the action. Should be implemented in inherited classes
+ *
+ * ##### Example
+ *
+ * ActionCount.prototype.call = function (parser, namespace, values, optionString) {
+ * namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
+ * };
+ *
+ **/
+Action.prototype.call = function () {
+ throw new Error('.call() not defined');// Not Implemented error
+};
diff --git a/node_modules/argparse/lib/action/append.js b/node_modules/argparse/lib/action/append.js
new file mode 100644
index 0000000..b5da0de
--- /dev/null
+++ b/node_modules/argparse/lib/action/append.js
@@ -0,0 +1,53 @@
+/*:nodoc:*
+ * class ActionAppend
+ *
+ * This action stores a list, and appends each argument value to the list.
+ * This is useful to allow an option to be specified multiple times.
+ * This class inherided from [[Action]]
+ *
+ **/
+
+'use strict';
+
+var util = require('util');
+
+var Action = require('../action');
+
+// Constants
+var c = require('../const');
+
+/*:nodoc:*
+ * new ActionAppend(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ * Note: options.nargs should be optional for constants
+ * and more then zero for other
+ **/
+var ActionAppend = module.exports = function ActionAppend(options) {
+ options = options || {};
+ if (this.nargs <= 0) {
+ throw new Error('nargs for append actions must be > 0; if arg ' +
+ 'strings are not supplying the value to append, ' +
+ 'the append const action may be more appropriate');
+ }
+ if (!!this.constant && this.nargs !== c.OPTIONAL) {
+ throw new Error('nargs must be OPTIONAL to supply const');
+ }
+ Action.call(this, options);
+};
+util.inherits(ActionAppend, Action);
+
+/*:nodoc:*
+ * ActionAppend#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Call the action. Save result in namespace object
+ **/
+ActionAppend.prototype.call = function (parser, namespace, values) {
+ var items = (namespace[this.dest] || []).slice();
+ items.push(values);
+ namespace.set(this.dest, items);
+};
diff --git a/node_modules/argparse/lib/action/append/constant.js b/node_modules/argparse/lib/action/append/constant.js
new file mode 100644
index 0000000..313f5d2
--- /dev/null
+++ b/node_modules/argparse/lib/action/append/constant.js
@@ -0,0 +1,47 @@
+/*:nodoc:*
+ * class ActionAppendConstant
+ *
+ * This stores a list, and appends the value specified by
+ * the const keyword argument to the list.
+ * (Note that the const keyword argument defaults to null.)
+ * The 'appendConst' action is typically useful when multiple
+ * arguments need to store constants to the same list.
+ *
+ * This class inherited from [[Action]]
+ **/
+
+'use strict';
+
+var util = require('util');
+
+var Action = require('../../action');
+
+/*:nodoc:*
+ * new ActionAppendConstant(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+var ActionAppendConstant = module.exports = function ActionAppendConstant(options) {
+ options = options || {};
+ options.nargs = 0;
+ if (typeof options.constant === 'undefined') {
+ throw new Error('constant option is required for appendAction');
+ }
+ Action.call(this, options);
+};
+util.inherits(ActionAppendConstant, Action);
+
+/*:nodoc:*
+ * ActionAppendConstant#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Call the action. Save result in namespace object
+ **/
+ActionAppendConstant.prototype.call = function (parser, namespace) {
+ var items = [].concat(namespace[this.dest] || []);
+ items.push(this.constant);
+ namespace.set(this.dest, items);
+};
diff --git a/node_modules/argparse/lib/action/count.js b/node_modules/argparse/lib/action/count.js
new file mode 100644
index 0000000..d6a5899
--- /dev/null
+++ b/node_modules/argparse/lib/action/count.js
@@ -0,0 +1,40 @@
+/*:nodoc:*
+ * class ActionCount
+ *
+ * This counts the number of times a keyword argument occurs.
+ * For example, this is useful for increasing verbosity levels
+ *
+ * This class inherided from [[Action]]
+ *
+ **/
+'use strict';
+
+var util = require('util');
+
+var Action = require('../action');
+
+/*:nodoc:*
+ * new ActionCount(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+var ActionCount = module.exports = function ActionCount(options) {
+ options = options || {};
+ options.nargs = 0;
+
+ Action.call(this, options);
+};
+util.inherits(ActionCount, Action);
+
+/*:nodoc:*
+ * ActionCount#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Call the action. Save result in namespace object
+ **/
+ActionCount.prototype.call = function (parser, namespace) {
+ namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
+};
diff --git a/node_modules/argparse/lib/action/help.js b/node_modules/argparse/lib/action/help.js
new file mode 100644
index 0000000..b40e05a
--- /dev/null
+++ b/node_modules/argparse/lib/action/help.js
@@ -0,0 +1,47 @@
+/*:nodoc:*
+ * class ActionHelp
+ *
+ * Support action for printing help
+ * This class inherided from [[Action]]
+ **/
+'use strict';
+
+var util = require('util');
+
+var Action = require('../action');
+
+// Constants
+var c = require('../const');
+
+/*:nodoc:*
+ * new ActionHelp(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+var ActionHelp = module.exports = function ActionHelp(options) {
+ options = options || {};
+ if (options.defaultValue !== null) {
+ options.defaultValue = options.defaultValue;
+ } else {
+ options.defaultValue = c.SUPPRESS;
+ }
+ options.dest = (options.dest !== null ? options.dest : c.SUPPRESS);
+ options.nargs = 0;
+ Action.call(this, options);
+
+};
+util.inherits(ActionHelp, Action);
+
+/*:nodoc:*
+ * ActionHelp#call(parser, namespace, values, optionString)
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Print help and exit
+ **/
+ActionHelp.prototype.call = function (parser) {
+ parser.printHelp();
+ parser.exit();
+};
diff --git a/node_modules/argparse/lib/action/store.js b/node_modules/argparse/lib/action/store.js
new file mode 100644
index 0000000..283b860
--- /dev/null
+++ b/node_modules/argparse/lib/action/store.js
@@ -0,0 +1,50 @@
+/*:nodoc:*
+ * class ActionStore
+ *
+ * This action just stores the argument’s value. This is the default action.
+ *
+ * This class inherited from [[Action]]
+ *
+ **/
+'use strict';
+
+var util = require('util');
+
+var Action = require('../action');
+
+// Constants
+var c = require('../const');
+
+
+/*:nodoc:*
+ * new ActionStore(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+var ActionStore = module.exports = function ActionStore(options) {
+ options = options || {};
+ if (this.nargs <= 0) {
+ throw new Error('nargs for store actions must be > 0; if you ' +
+ 'have nothing to store, actions such as store ' +
+ 'true or store const may be more appropriate');
+
+ }
+ if (typeof this.constant !== 'undefined' && this.nargs !== c.OPTIONAL) {
+ throw new Error('nargs must be OPTIONAL to supply const');
+ }
+ Action.call(this, options);
+};
+util.inherits(ActionStore, Action);
+
+/*:nodoc:*
+ * ActionStore#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Call the action. Save result in namespace object
+ **/
+ActionStore.prototype.call = function (parser, namespace, values) {
+ namespace.set(this.dest, values);
+};
diff --git a/node_modules/argparse/lib/action/store/constant.js b/node_modules/argparse/lib/action/store/constant.js
new file mode 100644
index 0000000..23caa89
--- /dev/null
+++ b/node_modules/argparse/lib/action/store/constant.js
@@ -0,0 +1,43 @@
+/*:nodoc:*
+ * class ActionStoreConstant
+ *
+ * This action stores the value specified by the const keyword argument.
+ * (Note that the const keyword argument defaults to the rather unhelpful null.)
+ * The 'store_const' action is most commonly used with optional
+ * arguments that specify some sort of flag.
+ *
+ * This class inherited from [[Action]]
+ **/
+'use strict';
+
+var util = require('util');
+
+var Action = require('../../action');
+
+/*:nodoc:*
+ * new ActionStoreConstant(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+var ActionStoreConstant = module.exports = function ActionStoreConstant(options) {
+ options = options || {};
+ options.nargs = 0;
+ if (typeof options.constant === 'undefined') {
+ throw new Error('constant option is required for storeAction');
+ }
+ Action.call(this, options);
+};
+util.inherits(ActionStoreConstant, Action);
+
+/*:nodoc:*
+ * ActionStoreConstant#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Call the action. Save result in namespace object
+ **/
+ActionStoreConstant.prototype.call = function (parser, namespace) {
+ namespace.set(this.dest, this.constant);
+};
diff --git a/node_modules/argparse/lib/action/store/false.js b/node_modules/argparse/lib/action/store/false.js
new file mode 100644
index 0000000..9924f46
--- /dev/null
+++ b/node_modules/argparse/lib/action/store/false.js
@@ -0,0 +1,27 @@
+/*:nodoc:*
+ * class ActionStoreFalse
+ *
+ * This action store the values False respectively.
+ * This is special cases of 'storeConst'
+ *
+ * This class inherited from [[Action]]
+ **/
+
+'use strict';
+
+var util = require('util');
+
+var ActionStoreConstant = require('./constant');
+
+/*:nodoc:*
+ * new ActionStoreFalse(options)
+ * - options (object): hash of options see [[Action.new]]
+ *
+ **/
+var ActionStoreFalse = module.exports = function ActionStoreFalse(options) {
+ options = options || {};
+ options.constant = false;
+ options.defaultValue = options.defaultValue !== null ? options.defaultValue : true;
+ ActionStoreConstant.call(this, options);
+};
+util.inherits(ActionStoreFalse, ActionStoreConstant);
diff --git a/node_modules/argparse/lib/action/store/true.js b/node_modules/argparse/lib/action/store/true.js
new file mode 100644
index 0000000..9e22f7d
--- /dev/null
+++ b/node_modules/argparse/lib/action/store/true.js
@@ -0,0 +1,26 @@
+/*:nodoc:*
+ * class ActionStoreTrue
+ *
+ * This action store the values True respectively.
+ * This isspecial cases of 'storeConst'
+ *
+ * This class inherited from [[Action]]
+ **/
+'use strict';
+
+var util = require('util');
+
+var ActionStoreConstant = require('./constant');
+
+/*:nodoc:*
+ * new ActionStoreTrue(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+var ActionStoreTrue = module.exports = function ActionStoreTrue(options) {
+ options = options || {};
+ options.constant = true;
+ options.defaultValue = options.defaultValue !== null ? options.defaultValue : false;
+ ActionStoreConstant.call(this, options);
+};
+util.inherits(ActionStoreTrue, ActionStoreConstant);
diff --git a/node_modules/argparse/lib/action/subparsers.js b/node_modules/argparse/lib/action/subparsers.js
new file mode 100644
index 0000000..99dfedd
--- /dev/null
+++ b/node_modules/argparse/lib/action/subparsers.js
@@ -0,0 +1,149 @@
+/** internal
+ * class ActionSubparsers
+ *
+ * Support the creation of such sub-commands with the addSubparsers()
+ *
+ * This class inherited from [[Action]]
+ **/
+'use strict';
+
+var util = require('util');
+var format = require('util').format;
+
+
+var Action = require('../action');
+
+// Constants
+var c = require('../const');
+
+// Errors
+var argumentErrorHelper = require('../argument/error');
+
+
+/*:nodoc:*
+ * new ChoicesPseudoAction(name, help)
+ *
+ * Create pseudo action for correct help text
+ *
+ **/
+function ChoicesPseudoAction(name, help) {
+ var options = {
+ optionStrings: [],
+ dest: name,
+ help: help
+ };
+
+ Action.call(this, options);
+}
+
+util.inherits(ChoicesPseudoAction, Action);
+
+/**
+ * new ActionSubparsers(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+function ActionSubparsers(options) {
+ options = options || {};
+ options.dest = options.dest || c.SUPPRESS;
+ options.nargs = c.PARSER;
+
+ this.debug = (options.debug === true);
+
+ this._progPrefix = options.prog;
+ this._parserClass = options.parserClass;
+ this._nameParserMap = {};
+ this._choicesActions = [];
+
+ options.choices = this._nameParserMap;
+ Action.call(this, options);
+}
+
+util.inherits(ActionSubparsers, Action);
+
+/*:nodoc:*
+ * ActionSubparsers#addParser(name, options) -> ArgumentParser
+ * - name (string): sub-command name
+ * - options (object): see [[ArgumentParser.new]]
+ *
+ * Note:
+ * addParser supports an additional aliases option,
+ * which allows multiple strings to refer to the same subparser.
+ * This example, like svn, aliases co as a shorthand for checkout
+ *
+ **/
+ActionSubparsers.prototype.addParser = function (name, options) {
+ var parser;
+
+ var self = this;
+
+ options = options || {};
+
+ options.debug = (this.debug === true);
+
+ // set program from the existing prefix
+ if (!options.prog) {
+ options.prog = this._progPrefix + ' ' + name;
+ }
+
+ var aliases = options.aliases || [];
+
+ // create a pseudo-action to hold the choice help
+ if (!!options.help || typeof options.help === 'string') {
+ var help = options.help;
+ delete options.help;
+
+ var choiceAction = new ChoicesPseudoAction(name, help);
+ this._choicesActions.push(choiceAction);
+ }
+
+ // create the parser and add it to the map
+ parser = new this._parserClass(options);
+ this._nameParserMap[name] = parser;
+
+ // make parser available under aliases also
+ aliases.forEach(function (alias) {
+ self._nameParserMap[alias] = parser;
+ });
+
+ return parser;
+};
+
+ActionSubparsers.prototype._getSubactions = function () {
+ return this._choicesActions;
+};
+
+/*:nodoc:*
+ * ActionSubparsers#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Call the action. Parse input aguments
+ **/
+ActionSubparsers.prototype.call = function (parser, namespace, values) {
+ var parserName = values[0];
+ var argStrings = values.slice(1);
+
+ // set the parser name if requested
+ if (this.dest !== c.SUPPRESS) {
+ namespace[this.dest] = parserName;
+ }
+
+ // select the parser
+ if (this._nameParserMap[parserName]) {
+ parser = this._nameParserMap[parserName];
+ } else {
+ throw argumentErrorHelper(format(
+ 'Unknown parser "%s" (choices: [%s]).',
+ parserName,
+ Object.keys(this._nameParserMap).join(', ')
+ ));
+ }
+
+ // parse all the remaining options into the namespace
+ parser.parseArgs(argStrings, namespace);
+};
+
+module.exports = ActionSubparsers;
diff --git a/node_modules/argparse/lib/action/version.js b/node_modules/argparse/lib/action/version.js
new file mode 100644
index 0000000..8053328
--- /dev/null
+++ b/node_modules/argparse/lib/action/version.js
@@ -0,0 +1,47 @@
+/*:nodoc:*
+ * class ActionVersion
+ *
+ * Support action for printing program version
+ * This class inherited from [[Action]]
+ **/
+'use strict';
+
+var util = require('util');
+
+var Action = require('../action');
+
+//
+// Constants
+//
+var c = require('../const');
+
+/*:nodoc:*
+ * new ActionVersion(options)
+ * - options (object): options hash see [[Action.new]]
+ *
+ **/
+var ActionVersion = module.exports = function ActionVersion(options) {
+ options = options || {};
+ options.defaultValue = (options.defaultValue ? options.defaultValue : c.SUPPRESS);
+ options.dest = (options.dest || c.SUPPRESS);
+ options.nargs = 0;
+ this.version = options.version;
+ Action.call(this, options);
+};
+util.inherits(ActionVersion, Action);
+
+/*:nodoc:*
+ * ActionVersion#call(parser, namespace, values, optionString) -> Void
+ * - parser (ArgumentParser): current parser
+ * - namespace (Namespace): namespace for output data
+ * - values (Array): parsed values
+ * - optionString (Array): input option string(not parsed)
+ *
+ * Print version and exit
+ **/
+ActionVersion.prototype.call = function (parser) {
+ var version = this.version || parser.version;
+ var formatter = parser._getFormatter();
+ formatter.addText(version);
+ parser.exit(0, formatter.formatHelp());
+};
diff --git a/node_modules/argparse/lib/action_container.js b/node_modules/argparse/lib/action_container.js
new file mode 100644
index 0000000..6f1237b
--- /dev/null
+++ b/node_modules/argparse/lib/action_container.js
@@ -0,0 +1,482 @@
+/** internal
+ * class ActionContainer
+ *
+ * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
+ **/
+
+'use strict';
+
+var format = require('util').format;
+
+// Constants
+var c = require('./const');
+
+var $$ = require('./utils');
+
+//Actions
+var ActionHelp = require('./action/help');
+var ActionAppend = require('./action/append');
+var ActionAppendConstant = require('./action/append/constant');
+var ActionCount = require('./action/count');
+var ActionStore = require('./action/store');
+var ActionStoreConstant = require('./action/store/constant');
+var ActionStoreTrue = require('./action/store/true');
+var ActionStoreFalse = require('./action/store/false');
+var ActionVersion = require('./action/version');
+var ActionSubparsers = require('./action/subparsers');
+
+// Errors
+var argumentErrorHelper = require('./argument/error');
+
+/**
+ * new ActionContainer(options)
+ *
+ * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
+ *
+ * ##### Options:
+ *
+ * - `description` -- A description of what the program does
+ * - `prefixChars` -- Characters that prefix optional arguments
+ * - `argumentDefault` -- The default value for all arguments
+ * - `conflictHandler` -- The conflict handler to use for duplicate arguments
+ **/
+var ActionContainer = module.exports = function ActionContainer(options) {
+ options = options || {};
+
+ this.description = options.description;
+ this.argumentDefault = options.argumentDefault;
+ this.prefixChars = options.prefixChars || '';
+ this.conflictHandler = options.conflictHandler;
+
+ // set up registries
+ this._registries = {};
+
+ // register actions
+ this.register('action', null, ActionStore);
+ this.register('action', 'store', ActionStore);
+ this.register('action', 'storeConst', ActionStoreConstant);
+ this.register('action', 'storeTrue', ActionStoreTrue);
+ this.register('action', 'storeFalse', ActionStoreFalse);
+ this.register('action', 'append', ActionAppend);
+ this.register('action', 'appendConst', ActionAppendConstant);
+ this.register('action', 'count', ActionCount);
+ this.register('action', 'help', ActionHelp);
+ this.register('action', 'version', ActionVersion);
+ this.register('action', 'parsers', ActionSubparsers);
+
+ // raise an exception if the conflict handler is invalid
+ this._getHandler();
+
+ // action storage
+ this._actions = [];
+ this._optionStringActions = {};
+
+ // groups
+ this._actionGroups = [];
+ this._mutuallyExclusiveGroups = [];
+
+ // defaults storage
+ this._defaults = {};
+
+ // determines whether an "option" looks like a negative number
+ // -1, -1.5 -5e+4
+ this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$');
+
+ // whether or not there are any optionals that look like negative
+ // numbers -- uses a list so it can be shared and edited
+ this._hasNegativeNumberOptionals = [];
+};
+
+// Groups must be required, then ActionContainer already defined
+var ArgumentGroup = require('./argument/group');
+var MutuallyExclusiveGroup = require('./argument/exclusive');
+
+//
+// Registration methods
+//
+
+/**
+ * ActionContainer#register(registryName, value, object) -> Void
+ * - registryName (String) : object type action|type
+ * - value (string) : keyword
+ * - object (Object|Function) : handler
+ *
+ * Register handlers
+ **/
+ActionContainer.prototype.register = function (registryName, value, object) {
+ this._registries[registryName] = this._registries[registryName] || {};
+ this._registries[registryName][value] = object;
+};
+
+ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) {
+ if (arguments.length < 3) {
+ defaultValue = null;
+ }
+ return this._registries[registryName][value] || defaultValue;
+};
+
+//
+// Namespace default accessor methods
+//
+
+/**
+ * ActionContainer#setDefaults(options) -> Void
+ * - options (object):hash of options see [[Action.new]]
+ *
+ * Set defaults
+ **/
+ActionContainer.prototype.setDefaults = function (options) {
+ options = options || {};
+ for (var property in options) {
+ if ($$.has(options, property)) {
+ this._defaults[property] = options[property];
+ }
+ }
+
+ // if these defaults match any existing arguments, replace the previous
+ // default on the object with the new one
+ this._actions.forEach(function (action) {
+ if ($$.has(options, action.dest)) {
+ action.defaultValue = options[action.dest];
+ }
+ });
+};
+
+/**
+ * ActionContainer#getDefault(dest) -> Mixed
+ * - dest (string): action destination
+ *
+ * Return action default value
+ **/
+ActionContainer.prototype.getDefault = function (dest) {
+ var result = $$.has(this._defaults, dest) ? this._defaults[dest] : null;
+
+ this._actions.forEach(function (action) {
+ if (action.dest === dest && $$.has(action, 'defaultValue')) {
+ result = action.defaultValue;
+ }
+ });
+
+ return result;
+};
+//
+// Adding argument actions
+//
+
+/**
+ * ActionContainer#addArgument(args, options) -> Object
+ * - args (String|Array): argument key, or array of argument keys
+ * - options (Object): action objects see [[Action.new]]
+ *
+ * #### Examples
+ * - addArgument([ '-f', '--foo' ], { action: 'store', defaultValue: 1, ... })
+ * - addArgument([ 'bar' ], { action: 'store', nargs: 1, ... })
+ * - addArgument('--baz', { action: 'store', nargs: 1, ... })
+ **/
+ActionContainer.prototype.addArgument = function (args, options) {
+ args = args;
+ options = options || {};
+
+ if (typeof args === 'string') {
+ args = [ args ];
+ }
+ if (!Array.isArray(args)) {
+ throw new TypeError('addArgument first argument should be a string or an array');
+ }
+ if (typeof options !== 'object' || Array.isArray(options)) {
+ throw new TypeError('addArgument second argument should be a hash');
+ }
+
+ // if no positional args are supplied or only one is supplied and
+ // it doesn't look like an option string, parse a positional argument
+ if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) {
+ if (args && !!options.dest) {
+ throw new Error('dest supplied twice for positional argument');
+ }
+ options = this._getPositional(args, options);
+
+ // otherwise, we're adding an optional argument
+ } else {
+ options = this._getOptional(args, options);
+ }
+
+ // if no default was supplied, use the parser-level default
+ if (typeof options.defaultValue === 'undefined') {
+ var dest = options.dest;
+ if ($$.has(this._defaults, dest)) {
+ options.defaultValue = this._defaults[dest];
+ } else if (typeof this.argumentDefault !== 'undefined') {
+ options.defaultValue = this.argumentDefault;
+ }
+ }
+
+ // create the action object, and add it to the parser
+ var ActionClass = this._popActionClass(options);
+ if (typeof ActionClass !== 'function') {
+ throw new Error(format('Unknown action "%s".', ActionClass));
+ }
+ var action = new ActionClass(options);
+
+ // throw an error if the action type is not callable
+ var typeFunction = this._registryGet('type', action.type, action.type);
+ if (typeof typeFunction !== 'function') {
+ throw new Error(format('"%s" is not callable', typeFunction));
+ }
+
+ return this._addAction(action);
+};
+
+/**
+ * ActionContainer#addArgumentGroup(options) -> ArgumentGroup
+ * - options (Object): hash of options see [[ArgumentGroup.new]]
+ *
+ * Create new arguments groups
+ **/
+ActionContainer.prototype.addArgumentGroup = function (options) {
+ var group = new ArgumentGroup(this, options);
+ this._actionGroups.push(group);
+ return group;
+};
+
+/**
+ * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup
+ * - options (Object): {required: false}
+ *
+ * Create new mutual exclusive groups
+ **/
+ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) {
+ var group = new MutuallyExclusiveGroup(this, options);
+ this._mutuallyExclusiveGroups.push(group);
+ return group;
+};
+
+ActionContainer.prototype._addAction = function (action) {
+ var self = this;
+
+ // resolve any conflicts
+ this._checkConflict(action);
+
+ // add to actions list
+ this._actions.push(action);
+ action.container = this;
+
+ // index the action by any option strings it has
+ action.optionStrings.forEach(function (optionString) {
+ self._optionStringActions[optionString] = action;
+ });
+
+ // set the flag if any option strings look like negative numbers
+ action.optionStrings.forEach(function (optionString) {
+ if (optionString.match(self._regexpNegativeNumber)) {
+ if (!self._hasNegativeNumberOptionals.some(Boolean)) {
+ self._hasNegativeNumberOptionals.push(true);
+ }
+ }
+ });
+
+ // return the created action
+ return action;
+};
+
+ActionContainer.prototype._removeAction = function (action) {
+ var actionIndex = this._actions.indexOf(action);
+ if (actionIndex >= 0) {
+ this._actions.splice(actionIndex, 1);
+ }
+};
+
+ActionContainer.prototype._addContainerActions = function (container) {
+ // collect groups by titles
+ var titleGroupMap = {};
+ this._actionGroups.forEach(function (group) {
+ if (titleGroupMap[group.title]) {
+ throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title));
+ }
+ titleGroupMap[group.title] = group;
+ });
+
+ // map each action to its group
+ var groupMap = {};
+ function actionHash(action) {
+ // unique (hopefully?) string suitable as dictionary key
+ return action.getName();
+ }
+ container._actionGroups.forEach(function (group) {
+ // if a group with the title exists, use that, otherwise
+ // create a new group matching the container's group
+ if (!titleGroupMap[group.title]) {
+ titleGroupMap[group.title] = this.addArgumentGroup({
+ title: group.title,
+ description: group.description
+ });
+ }
+
+ // map the actions to their new group
+ group._groupActions.forEach(function (action) {
+ groupMap[actionHash(action)] = titleGroupMap[group.title];
+ });
+ }, this);
+
+ // add container's mutually exclusive groups
+ // NOTE: if add_mutually_exclusive_group ever gains title= and
+ // description= then this code will need to be expanded as above
+ var mutexGroup;
+ container._mutuallyExclusiveGroups.forEach(function (group) {
+ mutexGroup = this.addMutuallyExclusiveGroup({
+ required: group.required
+ });
+ // map the actions to their new mutex group
+ group._groupActions.forEach(function (action) {
+ groupMap[actionHash(action)] = mutexGroup;
+ });
+ }, this); // forEach takes a 'this' argument
+
+ // add all actions to this container or their group
+ container._actions.forEach(function (action) {
+ var key = actionHash(action);
+ if (groupMap[key]) {
+ groupMap[key]._addAction(action);
+ } else {
+ this._addAction(action);
+ }
+ });
+};
+
+ActionContainer.prototype._getPositional = function (dest, options) {
+ if (Array.isArray(dest)) {
+ dest = dest[0];
+ }
+ // make sure required is not specified
+ if (options.required) {
+ throw new Error('"required" is an invalid argument for positionals.');
+ }
+
+ // mark positional arguments as required if at least one is
+ // always required
+ if (options.nargs !== c.OPTIONAL && options.nargs !== c.ZERO_OR_MORE) {
+ options.required = true;
+ }
+ if (options.nargs === c.ZERO_OR_MORE && typeof options.defaultValue === 'undefined') {
+ options.required = true;
+ }
+
+ // return the keyword arguments with no option strings
+ options.dest = dest;
+ options.optionStrings = [];
+ return options;
+};
+
+ActionContainer.prototype._getOptional = function (args, options) {
+ var prefixChars = this.prefixChars;
+ var optionStrings = [];
+ var optionStringsLong = [];
+
+ // determine short and long option strings
+ args.forEach(function (optionString) {
+ // error on strings that don't start with an appropriate prefix
+ if (prefixChars.indexOf(optionString[0]) < 0) {
+ throw new Error(format('Invalid option string "%s": must start with a "%s".',
+ optionString,
+ prefixChars
+ ));
+ }
+
+ // strings starting with two prefix characters are long options
+ optionStrings.push(optionString);
+ if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) {
+ optionStringsLong.push(optionString);
+ }
+ });
+
+ // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
+ var dest = options.dest || null;
+ delete options.dest;
+
+ if (!dest) {
+ var optionStringDest = optionStringsLong.length ? optionStringsLong[0] : optionStrings[0];
+ dest = $$.trimChars(optionStringDest, this.prefixChars);
+
+ if (dest.length === 0) {
+ throw new Error(
+ format('dest= is required for options like "%s"', optionStrings.join(', '))
+ );
+ }
+ dest = dest.replace(/-/g, '_');
+ }
+
+ // return the updated keyword arguments
+ options.dest = dest;
+ options.optionStrings = optionStrings;
+
+ return options;
+};
+
+ActionContainer.prototype._popActionClass = function (options, defaultValue) {
+ defaultValue = defaultValue || null;
+
+ var action = (options.action || defaultValue);
+ delete options.action;
+
+ var actionClass = this._registryGet('action', action, action);
+ return actionClass;
+};
+
+ActionContainer.prototype._getHandler = function () {
+ var handlerString = this.conflictHandler;
+ var handlerFuncName = '_handleConflict' + $$.capitalize(handlerString);
+ var func = this[handlerFuncName];
+ if (typeof func === 'undefined') {
+ var msg = 'invalid conflict resolution value: ' + handlerString;
+ throw new Error(msg);
+ } else {
+ return func;
+ }
+};
+
+ActionContainer.prototype._checkConflict = function (action) {
+ var optionStringActions = this._optionStringActions;
+ var conflictOptionals = [];
+
+ // find all options that conflict with this option
+ // collect pairs, the string, and an existing action that it conflicts with
+ action.optionStrings.forEach(function (optionString) {
+ var conflOptional = optionStringActions[optionString];
+ if (typeof conflOptional !== 'undefined') {
+ conflictOptionals.push([ optionString, conflOptional ]);
+ }
+ });
+
+ if (conflictOptionals.length > 0) {
+ var conflictHandler = this._getHandler();
+ conflictHandler.call(this, action, conflictOptionals);
+ }
+};
+
+ActionContainer.prototype._handleConflictError = function (action, conflOptionals) {
+ var conflicts = conflOptionals.map(function (pair) { return pair[0]; });
+ conflicts = conflicts.join(', ');
+ throw argumentErrorHelper(
+ action,
+ format('Conflicting option string(s): %s', conflicts)
+ );
+};
+
+ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) {
+ // remove all conflicting options
+ var self = this;
+ conflOptionals.forEach(function (pair) {
+ var optionString = pair[0];
+ var conflictingAction = pair[1];
+ // remove the conflicting option string
+ var i = conflictingAction.optionStrings.indexOf(optionString);
+ if (i >= 0) {
+ conflictingAction.optionStrings.splice(i, 1);
+ }
+ delete self._optionStringActions[optionString];
+ // if the option now has no option string, remove it from the
+ // container holding it
+ if (conflictingAction.optionStrings.length === 0) {
+ conflictingAction.container._removeAction(conflictingAction);
+ }
+ });
+};
diff --git a/node_modules/argparse/lib/argparse.js b/node_modules/argparse/lib/argparse.js
new file mode 100644
index 0000000..f2a2c51
--- /dev/null
+++ b/node_modules/argparse/lib/argparse.js
@@ -0,0 +1,14 @@
+'use strict';
+
+module.exports.ArgumentParser = require('./argument_parser.js');
+module.exports.Namespace = require('./namespace');
+module.exports.Action = require('./action');
+module.exports.HelpFormatter = require('./help/formatter.js');
+module.exports.Const = require('./const.js');
+
+module.exports.ArgumentDefaultsHelpFormatter =
+ require('./help/added_formatters.js').ArgumentDefaultsHelpFormatter;
+module.exports.RawDescriptionHelpFormatter =
+ require('./help/added_formatters.js').RawDescriptionHelpFormatter;
+module.exports.RawTextHelpFormatter =
+ require('./help/added_formatters.js').RawTextHelpFormatter;
diff --git a/node_modules/argparse/lib/argument/error.js b/node_modules/argparse/lib/argument/error.js
new file mode 100644
index 0000000..c8a02a0
--- /dev/null
+++ b/node_modules/argparse/lib/argument/error.js
@@ -0,0 +1,50 @@
+'use strict';
+
+
+var format = require('util').format;
+
+
+var ERR_CODE = 'ARGError';
+
+/*:nodoc:*
+ * argumentError(argument, message) -> TypeError
+ * - argument (Object): action with broken argument
+ * - message (String): error message
+ *
+ * Error format helper. An error from creating or using an argument
+ * (optional or positional). The string value of this exception
+ * is the message, augmented with information
+ * about the argument that caused it.
+ *
+ * #####Example
+ *
+ * var argumentErrorHelper = require('./argument/error');
+ * if (conflictOptionals.length > 0) {
+ * throw argumentErrorHelper(
+ * action,
+ * format('Conflicting option string(s): %s', conflictOptionals.join(', '))
+ * );
+ * }
+ *
+ **/
+module.exports = function (argument, message) {
+ var argumentName = null;
+ var errMessage;
+ var err;
+
+ if (argument.getName) {
+ argumentName = argument.getName();
+ } else {
+ argumentName = '' + argument;
+ }
+
+ if (!argumentName) {
+ errMessage = message;
+ } else {
+ errMessage = format('argument "%s": %s', argumentName, message);
+ }
+
+ err = new TypeError(errMessage);
+ err.code = ERR_CODE;
+ return err;
+};
diff --git a/node_modules/argparse/lib/argument/exclusive.js b/node_modules/argparse/lib/argument/exclusive.js
new file mode 100644
index 0000000..8287e00
--- /dev/null
+++ b/node_modules/argparse/lib/argument/exclusive.js
@@ -0,0 +1,54 @@
+/** internal
+ * class MutuallyExclusiveGroup
+ *
+ * Group arguments.
+ * By default, ArgumentParser groups command-line arguments
+ * into “positional arguments” and “optional arguments”
+ * when displaying help messages. When there is a better
+ * conceptual grouping of arguments than this default one,
+ * appropriate groups can be created using the addArgumentGroup() method
+ *
+ * This class inherited from [[ArgumentContainer]]
+ **/
+'use strict';
+
+var util = require('util');
+
+var ArgumentGroup = require('./group');
+
+/**
+ * new MutuallyExclusiveGroup(container, options)
+ * - container (object): main container
+ * - options (object): options.required -> true/false
+ *
+ * `required` could be an argument itself, but making it a property of
+ * the options argument is more consistent with the JS adaptation of the Python)
+ **/
+var MutuallyExclusiveGroup = module.exports = function MutuallyExclusiveGroup(container, options) {
+ var required;
+ options = options || {};
+ required = options.required || false;
+ ArgumentGroup.call(this, container);
+ this.required = required;
+
+};
+util.inherits(MutuallyExclusiveGroup, ArgumentGroup);
+
+
+MutuallyExclusiveGroup.prototype._addAction = function (action) {
+ var msg;
+ if (action.required) {
+ msg = 'mutually exclusive arguments must be optional';
+ throw new Error(msg);
+ }
+ action = this._container._addAction(action);
+ this._groupActions.push(action);
+ return action;
+};
+
+
+MutuallyExclusiveGroup.prototype._removeAction = function (action) {
+ this._container._removeAction(action);
+ this._groupActions.remove(action);
+};
+
diff --git a/node_modules/argparse/lib/argument/group.js b/node_modules/argparse/lib/argument/group.js
new file mode 100644
index 0000000..58b271f
--- /dev/null
+++ b/node_modules/argparse/lib/argument/group.js
@@ -0,0 +1,75 @@
+/** internal
+ * class ArgumentGroup
+ *
+ * Group arguments.
+ * By default, ArgumentParser groups command-line arguments
+ * into “positional arguments” and “optional arguments”
+ * when displaying help messages. When there is a better
+ * conceptual grouping of arguments than this default one,
+ * appropriate groups can be created using the addArgumentGroup() method
+ *
+ * This class inherited from [[ArgumentContainer]]
+ **/
+'use strict';
+
+var util = require('util');
+
+var ActionContainer = require('../action_container');
+
+
+/**
+ * new ArgumentGroup(container, options)
+ * - container (object): main container
+ * - options (object): hash of group options
+ *
+ * #### options
+ * - **prefixChars** group name prefix
+ * - **argumentDefault** default argument value
+ * - **title** group title
+ * - **description** group description
+ *
+ **/
+var ArgumentGroup = module.exports = function ArgumentGroup(container, options) {
+
+ options = options || {};
+
+ // add any missing keyword arguments by checking the container
+ options.conflictHandler = (options.conflictHandler || container.conflictHandler);
+ options.prefixChars = (options.prefixChars || container.prefixChars);
+ options.argumentDefault = (options.argumentDefault || container.argumentDefault);
+
+ ActionContainer.call(this, options);
+
+ // group attributes
+ this.title = options.title;
+ this._groupActions = [];
+
+ // share most attributes with the container
+ this._container = container;
+ this._registries = container._registries;
+ this._actions = container._actions;
+ this._optionStringActions = container._optionStringActions;
+ this._defaults = container._defaults;
+ this._hasNegativeNumberOptionals = container._hasNegativeNumberOptionals;
+ this._mutuallyExclusiveGroups = container._mutuallyExclusiveGroups;
+};
+util.inherits(ArgumentGroup, ActionContainer);
+
+
+ArgumentGroup.prototype._addAction = function (action) {
+ // Parent add action
+ action = ActionContainer.prototype._addAction.call(this, action);
+ this._groupActions.push(action);
+ return action;
+};
+
+
+ArgumentGroup.prototype._removeAction = function (action) {
+ // Parent remove action
+ ActionContainer.prototype._removeAction.call(this, action);
+ var actionIndex = this._groupActions.indexOf(action);
+ if (actionIndex >= 0) {
+ this._groupActions.splice(actionIndex, 1);
+ }
+};
+
diff --git a/node_modules/argparse/lib/argument_parser.js b/node_modules/argparse/lib/argument_parser.js
new file mode 100644
index 0000000..bd9a59a
--- /dev/null
+++ b/node_modules/argparse/lib/argument_parser.js
@@ -0,0 +1,1161 @@
+/**
+ * class ArgumentParser
+ *
+ * Object for parsing command line strings into js objects.
+ *
+ * Inherited from [[ActionContainer]]
+ **/
+'use strict';
+
+var util = require('util');
+var format = require('util').format;
+var Path = require('path');
+var sprintf = require('sprintf-js').sprintf;
+
+// Constants
+var c = require('./const');
+
+var $$ = require('./utils');
+
+var ActionContainer = require('./action_container');
+
+// Errors
+var argumentErrorHelper = require('./argument/error');
+
+var HelpFormatter = require('./help/formatter');
+
+var Namespace = require('./namespace');
+
+
+/**
+ * new ArgumentParser(options)
+ *
+ * Create a new ArgumentParser object.
+ *
+ * ##### Options:
+ * - `prog` The name of the program (default: Path.basename(process.argv[1]))
+ * - `usage` A usage message (default: auto-generated from arguments)
+ * - `description` A description of what the program does
+ * - `epilog` Text following the argument descriptions
+ * - `parents` Parsers whose arguments should be copied into this one
+ * - `formatterClass` HelpFormatter class for printing help messages
+ * - `prefixChars` Characters that prefix optional arguments
+ * - `fromfilePrefixChars` Characters that prefix files containing additional arguments
+ * - `argumentDefault` The default value for all arguments
+ * - `addHelp` Add a -h/-help option
+ * - `conflictHandler` Specifies how to handle conflicting argument names
+ * - `debug` Enable debug mode. Argument errors throw exception in
+ * debug mode and process.exit in normal. Used for development and
+ * testing (default: false)
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#argumentparser-objects
+ **/
+function ArgumentParser(options) {
+ if (!(this instanceof ArgumentParser)) {
+ return new ArgumentParser(options);
+ }
+ var self = this;
+ options = options || {};
+
+ options.description = (options.description || null);
+ options.argumentDefault = (options.argumentDefault || null);
+ options.prefixChars = (options.prefixChars || '-');
+ options.conflictHandler = (options.conflictHandler || 'error');
+ ActionContainer.call(this, options);
+
+ options.addHelp = typeof options.addHelp === 'undefined' || !!options.addHelp;
+ options.parents = options.parents || [];
+ // default program name
+ options.prog = (options.prog || Path.basename(process.argv[1]));
+ this.prog = options.prog;
+ this.usage = options.usage;
+ this.epilog = options.epilog;
+ this.version = options.version;
+
+ this.debug = (options.debug === true);
+
+ this.formatterClass = (options.formatterClass || HelpFormatter);
+ this.fromfilePrefixChars = options.fromfilePrefixChars || null;
+ this._positionals = this.addArgumentGroup({ title: 'Positional arguments' });
+ this._optionals = this.addArgumentGroup({ title: 'Optional arguments' });
+ this._subparsers = null;
+
+ // register types
+ function FUNCTION_IDENTITY(o) {
+ return o;
+ }
+ this.register('type', 'auto', FUNCTION_IDENTITY);
+ this.register('type', null, FUNCTION_IDENTITY);
+ this.register('type', 'int', function (x) {
+ var result = parseInt(x, 10);
+ if (isNaN(result)) {
+ throw new Error(x + ' is not a valid integer.');
+ }
+ return result;
+ });
+ this.register('type', 'float', function (x) {
+ var result = parseFloat(x);
+ if (isNaN(result)) {
+ throw new Error(x + ' is not a valid float.');
+ }
+ return result;
+ });
+ this.register('type', 'string', function (x) {
+ return '' + x;
+ });
+
+ // add help and version arguments if necessary
+ var defaultPrefix = (this.prefixChars.indexOf('-') > -1) ? '-' : this.prefixChars[0];
+ if (options.addHelp) {
+ this.addArgument(
+ [ defaultPrefix + 'h', defaultPrefix + defaultPrefix + 'help' ],
+ {
+ action: 'help',
+ defaultValue: c.SUPPRESS,
+ help: 'Show this help message and exit.'
+ }
+ );
+ }
+ if (typeof this.version !== 'undefined') {
+ this.addArgument(
+ [ defaultPrefix + 'v', defaultPrefix + defaultPrefix + 'version' ],
+ {
+ action: 'version',
+ version: this.version,
+ defaultValue: c.SUPPRESS,
+ help: "Show program's version number and exit."
+ }
+ );
+ }
+
+ // add parent arguments and defaults
+ options.parents.forEach(function (parent) {
+ self._addContainerActions(parent);
+ if (typeof parent._defaults !== 'undefined') {
+ for (var defaultKey in parent._defaults) {
+ if (parent._defaults.hasOwnProperty(defaultKey)) {
+ self._defaults[defaultKey] = parent._defaults[defaultKey];
+ }
+ }
+ }
+ });
+}
+
+util.inherits(ArgumentParser, ActionContainer);
+
+/**
+ * ArgumentParser#addSubparsers(options) -> [[ActionSubparsers]]
+ * - options (object): hash of options see [[ActionSubparsers.new]]
+ *
+ * See also [subcommands][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#sub-commands
+ **/
+ArgumentParser.prototype.addSubparsers = function (options) {
+ if (this._subparsers) {
+ this.error('Cannot have multiple subparser arguments.');
+ }
+
+ options = options || {};
+ options.debug = (this.debug === true);
+ options.optionStrings = [];
+ options.parserClass = (options.parserClass || ArgumentParser);
+
+
+ if (!!options.title || !!options.description) {
+
+ this._subparsers = this.addArgumentGroup({
+ title: (options.title || 'subcommands'),
+ description: options.description
+ });
+ delete options.title;
+ delete options.description;
+
+ } else {
+ this._subparsers = this._positionals;
+ }
+
+ // prog defaults to the usage message of this parser, skipping
+ // optional arguments and with no "usage:" prefix
+ if (!options.prog) {
+ var formatter = this._getFormatter();
+ var positionals = this._getPositionalActions();
+ var groups = this._mutuallyExclusiveGroups;
+ formatter.addUsage(this.usage, positionals, groups, '');
+ options.prog = formatter.formatHelp().trim();
+ }
+
+ // create the parsers action and add it to the positionals list
+ var ParsersClass = this._popActionClass(options, 'parsers');
+ var action = new ParsersClass(options);
+ this._subparsers._addAction(action);
+
+ // return the created parsers action
+ return action;
+};
+
+ArgumentParser.prototype._addAction = function (action) {
+ if (action.isOptional()) {
+ this._optionals._addAction(action);
+ } else {
+ this._positionals._addAction(action);
+ }
+ return action;
+};
+
+ArgumentParser.prototype._getOptionalActions = function () {
+ return this._actions.filter(function (action) {
+ return action.isOptional();
+ });
+};
+
+ArgumentParser.prototype._getPositionalActions = function () {
+ return this._actions.filter(function (action) {
+ return action.isPositional();
+ });
+};
+
+
+/**
+ * ArgumentParser#parseArgs(args, namespace) -> Namespace|Object
+ * - args (array): input elements
+ * - namespace (Namespace|Object): result object
+ *
+ * Parsed args and throws error if some arguments are not recognized
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#the-parse-args-method
+ **/
+ArgumentParser.prototype.parseArgs = function (args, namespace) {
+ var argv;
+ var result = this.parseKnownArgs(args, namespace);
+
+ args = result[0];
+ argv = result[1];
+ if (argv && argv.length > 0) {
+ this.error(
+ format('Unrecognized arguments: %s.', argv.join(' '))
+ );
+ }
+ return args;
+};
+
+/**
+ * ArgumentParser#parseKnownArgs(args, namespace) -> array
+ * - args (array): input options
+ * - namespace (Namespace|Object): result object
+ *
+ * Parse known arguments and return tuple of result object
+ * and unknown args
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#partial-parsing
+ **/
+ArgumentParser.prototype.parseKnownArgs = function (args, namespace) {
+ var self = this;
+
+ // args default to the system args
+ args = args || process.argv.slice(2);
+
+ // default Namespace built from parser defaults
+ namespace = namespace || new Namespace();
+
+ self._actions.forEach(function (action) {
+ if (action.dest !== c.SUPPRESS) {
+ if (!$$.has(namespace, action.dest)) {
+ if (action.defaultValue !== c.SUPPRESS) {
+ var defaultValue = action.defaultValue;
+ if (typeof action.defaultValue === 'string') {
+ defaultValue = self._getValue(action, defaultValue);
+ }
+ namespace[action.dest] = defaultValue;
+ }
+ }
+ }
+ });
+
+ Object.keys(self._defaults).forEach(function (dest) {
+ namespace[dest] = self._defaults[dest];
+ });
+
+ // parse the arguments and exit if there are any errors
+ try {
+ var res = this._parseKnownArgs(args, namespace);
+
+ namespace = res[0];
+ args = res[1];
+ if ($$.has(namespace, c._UNRECOGNIZED_ARGS_ATTR)) {
+ args = $$.arrayUnion(args, namespace[c._UNRECOGNIZED_ARGS_ATTR]);
+ delete namespace[c._UNRECOGNIZED_ARGS_ATTR];
+ }
+ return [ namespace, args ];
+ } catch (e) {
+ this.error(e);
+ }
+};
+
+ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) {
+ var self = this;
+
+ var extras = [];
+
+ // replace arg strings that are file references
+ if (this.fromfilePrefixChars !== null) {
+ argStrings = this._readArgsFromFiles(argStrings);
+ }
+ // map all mutually exclusive arguments to the other arguments
+ // they can't occur with
+ // Python has 'conflicts = action_conflicts.setdefault(mutex_action, [])'
+ // though I can't conceive of a way in which an action could be a member
+ // of two different mutually exclusive groups.
+
+ function actionHash(action) {
+ // some sort of hashable key for this action
+ // action itself cannot be a key in actionConflicts
+ // I think getName() (join of optionStrings) is unique enough
+ return action.getName();
+ }
+
+ var conflicts, key;
+ var actionConflicts = {};
+
+ this._mutuallyExclusiveGroups.forEach(function (mutexGroup) {
+ mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) {
+ key = actionHash(mutexAction);
+ if (!$$.has(actionConflicts, key)) {
+ actionConflicts[key] = [];
+ }
+ conflicts = actionConflicts[key];
+ conflicts.push.apply(conflicts, groupActions.slice(0, i));
+ conflicts.push.apply(conflicts, groupActions.slice(i + 1));
+ });
+ });
+
+ // find all option indices, and determine the arg_string_pattern
+ // which has an 'O' if there is an option at an index,
+ // an 'A' if there is an argument, or a '-' if there is a '--'
+ var optionStringIndices = {};
+
+ var argStringPatternParts = [];
+
+ argStrings.forEach(function (argString, argStringIndex) {
+ if (argString === '--') {
+ argStringPatternParts.push('-');
+ while (argStringIndex < argStrings.length) {
+ argStringPatternParts.push('A');
+ argStringIndex++;
+ }
+ } else {
+ // otherwise, add the arg to the arg strings
+ // and note the index if it was an option
+ var pattern;
+ var optionTuple = self._parseOptional(argString);
+ if (!optionTuple) {
+ pattern = 'A';
+ } else {
+ optionStringIndices[argStringIndex] = optionTuple;
+ pattern = 'O';
+ }
+ argStringPatternParts.push(pattern);
+ }
+ });
+ var argStringsPattern = argStringPatternParts.join('');
+
+ var seenActions = [];
+ var seenNonDefaultActions = [];
+
+
+ function takeAction(action, argumentStrings, optionString) {
+ seenActions.push(action);
+ var argumentValues = self._getValues(action, argumentStrings);
+
+ // error if this argument is not allowed with other previously
+ // seen arguments, assuming that actions that use the default
+ // value don't really count as "present"
+ if (argumentValues !== action.defaultValue) {
+ seenNonDefaultActions.push(action);
+ if (actionConflicts[actionHash(action)]) {
+ actionConflicts[actionHash(action)].forEach(function (actionConflict) {
+ if (seenNonDefaultActions.indexOf(actionConflict) >= 0) {
+ throw argumentErrorHelper(
+ action,
+ format('Not allowed with argument "%s".', actionConflict.getName())
+ );
+ }
+ });
+ }
+ }
+
+ if (argumentValues !== c.SUPPRESS) {
+ action.call(self, namespace, argumentValues, optionString);
+ }
+ }
+
+ function consumeOptional(startIndex) {
+ // get the optional identified at this index
+ var optionTuple = optionStringIndices[startIndex];
+ var action = optionTuple[0];
+ var optionString = optionTuple[1];
+ var explicitArg = optionTuple[2];
+
+ // identify additional optionals in the same arg string
+ // (e.g. -xyz is the same as -x -y -z if no args are required)
+ var actionTuples = [];
+
+ var args, argCount, start, stop;
+
+ for (;;) {
+ if (!action) {
+ extras.push(argStrings[startIndex]);
+ return startIndex + 1;
+ }
+ if (explicitArg) {
+ argCount = self._matchArgument(action, 'A');
+
+ // if the action is a single-dash option and takes no
+ // arguments, try to parse more single-dash options out
+ // of the tail of the option string
+ var chars = self.prefixChars;
+ if (argCount === 0 && chars.indexOf(optionString[1]) < 0) {
+ actionTuples.push([ action, [], optionString ]);
+ optionString = optionString[0] + explicitArg[0];
+ var newExplicitArg = explicitArg.slice(1) || null;
+ var optionalsMap = self._optionStringActions;
+
+ if (Object.keys(optionalsMap).indexOf(optionString) >= 0) {
+ action = optionalsMap[optionString];
+ explicitArg = newExplicitArg;
+ } else {
+ throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
+ }
+ } else if (argCount === 1) {
+ // if the action expect exactly one argument, we've
+ // successfully matched the option; exit the loop
+ stop = startIndex + 1;
+ args = [ explicitArg ];
+ actionTuples.push([ action, args, optionString ]);
+ break;
+ } else {
+ // error if a double-dash option did not use the
+ // explicit argument
+ throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
+ }
+ } else {
+ // if there is no explicit argument, try to match the
+ // optional's string arguments with the following strings
+ // if successful, exit the loop
+
+ start = startIndex + 1;
+ var selectedPatterns = argStringsPattern.substr(start);
+
+ argCount = self._matchArgument(action, selectedPatterns);
+ stop = start + argCount;
+
+
+ args = argStrings.slice(start, stop);
+
+ actionTuples.push([ action, args, optionString ]);
+ break;
+ }
+
+ }
+
+ // add the Optional to the list and return the index at which
+ // the Optional's string args stopped
+ if (actionTuples.length < 1) {
+ throw new Error('length should be > 0');
+ }
+ for (var i = 0; i < actionTuples.length; i++) {
+ takeAction.apply(self, actionTuples[i]);
+ }
+ return stop;
+ }
+
+ // the list of Positionals left to be parsed; this is modified
+ // by consume_positionals()
+ var positionals = self._getPositionalActions();
+
+ function consumePositionals(startIndex) {
+ // match as many Positionals as possible
+ var selectedPattern = argStringsPattern.substr(startIndex);
+ var argCounts = self._matchArgumentsPartial(positionals, selectedPattern);
+
+ // slice off the appropriate arg strings for each Positional
+ // and add the Positional and its args to the list
+ for (var i = 0; i < positionals.length; i++) {
+ var action = positionals[i];
+ var argCount = argCounts[i];
+ if (typeof argCount === 'undefined') {
+ continue;
+ }
+ var args = argStrings.slice(startIndex, startIndex + argCount);
+
+ startIndex += argCount;
+ takeAction(action, args);
+ }
+
+ // slice off the Positionals that we just parsed and return the
+ // index at which the Positionals' string args stopped
+ positionals = positionals.slice(argCounts.length);
+ return startIndex;
+ }
+
+ // consume Positionals and Optionals alternately, until we have
+ // passed the last option string
+ var startIndex = 0;
+ var position;
+
+ var maxOptionStringIndex = -1;
+
+ Object.keys(optionStringIndices).forEach(function (position) {
+ maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10));
+ });
+
+ var positionalsEndIndex, nextOptionStringIndex;
+
+ while (startIndex <= maxOptionStringIndex) {
+ // consume any Positionals preceding the next option
+ nextOptionStringIndex = null;
+ for (position in optionStringIndices) {
+ if (!optionStringIndices.hasOwnProperty(position)) { continue; }
+
+ position = parseInt(position, 10);
+ if (position >= startIndex) {
+ if (nextOptionStringIndex !== null) {
+ nextOptionStringIndex = Math.min(nextOptionStringIndex, position);
+ } else {
+ nextOptionStringIndex = position;
+ }
+ }
+ }
+
+ if (startIndex !== nextOptionStringIndex) {
+ positionalsEndIndex = consumePositionals(startIndex);
+ // only try to parse the next optional if we didn't consume
+ // the option string during the positionals parsing
+ if (positionalsEndIndex > startIndex) {
+ startIndex = positionalsEndIndex;
+ continue;
+ } else {
+ startIndex = positionalsEndIndex;
+ }
+ }
+
+ // if we consumed all the positionals we could and we're not
+ // at the index of an option string, there were extra arguments
+ if (!optionStringIndices[startIndex]) {
+ var strings = argStrings.slice(startIndex, nextOptionStringIndex);
+ extras = extras.concat(strings);
+ startIndex = nextOptionStringIndex;
+ }
+ // consume the next optional and any arguments for it
+ startIndex = consumeOptional(startIndex);
+ }
+
+ // consume any positionals following the last Optional
+ var stopIndex = consumePositionals(startIndex);
+
+ // if we didn't consume all the argument strings, there were extras
+ extras = extras.concat(argStrings.slice(stopIndex));
+
+ // if we didn't use all the Positional objects, there were too few
+ // arg strings supplied.
+ if (positionals.length > 0) {
+ self.error('too few arguments');
+ }
+
+ // make sure all required actions were present
+ self._actions.forEach(function (action) {
+ if (action.required) {
+ if (seenActions.indexOf(action) < 0) {
+ self.error(format('Argument "%s" is required', action.getName()));
+ }
+ }
+ });
+
+ // make sure all required groups have one option present
+ var actionUsed = false;
+ self._mutuallyExclusiveGroups.forEach(function (group) {
+ if (group.required) {
+ actionUsed = group._groupActions.some(function (action) {
+ return seenNonDefaultActions.indexOf(action) !== -1;
+ });
+
+ // if no actions were used, report the error
+ if (!actionUsed) {
+ var names = [];
+ group._groupActions.forEach(function (action) {
+ if (action.help !== c.SUPPRESS) {
+ names.push(action.getName());
+ }
+ });
+ names = names.join(' ');
+ var msg = 'one of the arguments ' + names + ' is required';
+ self.error(msg);
+ }
+ }
+ });
+
+ // return the updated namespace and the extra arguments
+ return [ namespace, extras ];
+};
+
+ArgumentParser.prototype._readArgsFromFiles = function (argStrings) {
+ // expand arguments referencing files
+ var self = this;
+ var fs = require('fs');
+ var newArgStrings = [];
+ argStrings.forEach(function (argString) {
+ if (self.fromfilePrefixChars.indexOf(argString[0]) < 0) {
+ // for regular arguments, just add them back into the list
+ newArgStrings.push(argString);
+ } else {
+ // replace arguments referencing files with the file content
+ try {
+ var argstrs = [];
+ var filename = argString.slice(1);
+ var content = fs.readFileSync(filename, 'utf8');
+ content = content.trim().split('\n');
+ content.forEach(function (argLine) {
+ self.convertArgLineToArgs(argLine).forEach(function (arg) {
+ argstrs.push(arg);
+ });
+ argstrs = self._readArgsFromFiles(argstrs);
+ });
+ newArgStrings.push.apply(newArgStrings, argstrs);
+ } catch (error) {
+ return self.error(error.message);
+ }
+ }
+ });
+ return newArgStrings;
+};
+
+ArgumentParser.prototype.convertArgLineToArgs = function (argLine) {
+ return [ argLine ];
+};
+
+ArgumentParser.prototype._matchArgument = function (action, regexpArgStrings) {
+
+ // match the pattern for this action to the arg strings
+ var regexpNargs = new RegExp('^' + this._getNargsPattern(action));
+ var matches = regexpArgStrings.match(regexpNargs);
+ var message;
+
+ // throw an exception if we weren't able to find a match
+ if (!matches) {
+ switch (action.nargs) {
+ /*eslint-disable no-undefined*/
+ case undefined:
+ case null:
+ message = 'Expected one argument.';
+ break;
+ case c.OPTIONAL:
+ message = 'Expected at most one argument.';
+ break;
+ case c.ONE_OR_MORE:
+ message = 'Expected at least one argument.';
+ break;
+ default:
+ message = 'Expected %s argument(s)';
+ }
+
+ throw argumentErrorHelper(
+ action,
+ format(message, action.nargs)
+ );
+ }
+ // return the number of arguments matched
+ return matches[1].length;
+};
+
+ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgStrings) {
+ // progressively shorten the actions list by slicing off the
+ // final actions until we find a match
+ var self = this;
+ var result = [];
+ var actionSlice, pattern, matches;
+ var i, j;
+
+ function getLength(string) {
+ return string.length;
+ }
+
+ for (i = actions.length; i > 0; i--) {
+ pattern = '';
+ actionSlice = actions.slice(0, i);
+ for (j = 0; j < actionSlice.length; j++) {
+ pattern += self._getNargsPattern(actionSlice[j]);
+ }
+
+ pattern = new RegExp('^' + pattern);
+ matches = regexpArgStrings.match(pattern);
+
+ if (matches && matches.length > 0) {
+ // need only groups
+ matches = matches.splice(1);
+ result = result.concat(matches.map(getLength));
+ break;
+ }
+ }
+
+ // return the list of arg string counts
+ return result;
+};
+
+ArgumentParser.prototype._parseOptional = function (argString) {
+ var action, optionString, argExplicit, optionTuples;
+
+ // if it's an empty string, it was meant to be a positional
+ if (!argString) {
+ return null;
+ }
+
+ // if it doesn't start with a prefix, it was meant to be positional
+ if (this.prefixChars.indexOf(argString[0]) < 0) {
+ return null;
+ }
+
+ // if the option string is present in the parser, return the action
+ if (this._optionStringActions[argString]) {
+ return [ this._optionStringActions[argString], argString, null ];
+ }
+
+ // if it's just a single character, it was meant to be positional
+ if (argString.length === 1) {
+ return null;
+ }
+
+ // if the option string before the "=" is present, return the action
+ if (argString.indexOf('=') >= 0) {
+ optionString = argString.split('=', 1)[0];
+ argExplicit = argString.slice(optionString.length + 1);
+
+ if (this._optionStringActions[optionString]) {
+ action = this._optionStringActions[optionString];
+ return [ action, optionString, argExplicit ];
+ }
+ }
+
+ // search through all possible prefixes of the option string
+ // and all actions in the parser for possible interpretations
+ optionTuples = this._getOptionTuples(argString);
+
+ // if multiple actions match, the option string was ambiguous
+ if (optionTuples.length > 1) {
+ var optionStrings = optionTuples.map(function (optionTuple) {
+ return optionTuple[1];
+ });
+ this.error(format(
+ 'Ambiguous option: "%s" could match %s.',
+ argString, optionStrings.join(', ')
+ ));
+ // if exactly one action matched, this segmentation is good,
+ // so return the parsed action
+ } else if (optionTuples.length === 1) {
+ return optionTuples[0];
+ }
+
+ // if it was not found as an option, but it looks like a negative
+ // number, it was meant to be positional
+ // unless there are negative-number-like options
+ if (argString.match(this._regexpNegativeNumber)) {
+ if (!this._hasNegativeNumberOptionals.some(Boolean)) {
+ return null;
+ }
+ }
+ // if it contains a space, it was meant to be a positional
+ if (argString.search(' ') >= 0) {
+ return null;
+ }
+
+ // it was meant to be an optional but there is no such option
+ // in this parser (though it might be a valid option in a subparser)
+ return [ null, argString, null ];
+};
+
+ArgumentParser.prototype._getOptionTuples = function (optionString) {
+ var result = [];
+ var chars = this.prefixChars;
+ var optionPrefix;
+ var argExplicit;
+ var action;
+ var actionOptionString;
+
+ // option strings starting with two prefix characters are only split at
+ // the '='
+ if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) >= 0) {
+ if (optionString.indexOf('=') >= 0) {
+ var optionStringSplit = optionString.split('=', 1);
+
+ optionPrefix = optionStringSplit[0];
+ argExplicit = optionStringSplit[1];
+ } else {
+ optionPrefix = optionString;
+ argExplicit = null;
+ }
+
+ for (actionOptionString in this._optionStringActions) {
+ if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
+ action = this._optionStringActions[actionOptionString];
+ result.push([ action, actionOptionString, argExplicit ]);
+ }
+ }
+
+ // single character options can be concatenated with their arguments
+ // but multiple character options always have to have their argument
+ // separate
+ } else if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) < 0) {
+ optionPrefix = optionString;
+ argExplicit = null;
+ var optionPrefixShort = optionString.substr(0, 2);
+ var argExplicitShort = optionString.substr(2);
+
+ for (actionOptionString in this._optionStringActions) {
+ if (!$$.has(this._optionStringActions, actionOptionString)) continue;
+
+ action = this._optionStringActions[actionOptionString];
+ if (actionOptionString === optionPrefixShort) {
+ result.push([ action, actionOptionString, argExplicitShort ]);
+ } else if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
+ result.push([ action, actionOptionString, argExplicit ]);
+ }
+ }
+
+ // shouldn't ever get here
+ } else {
+ throw new Error(format('Unexpected option string: %s.', optionString));
+ }
+ // return the collected option tuples
+ return result;
+};
+
+ArgumentParser.prototype._getNargsPattern = function (action) {
+ // in all examples below, we have to allow for '--' args
+ // which are represented as '-' in the pattern
+ var regexpNargs;
+
+ switch (action.nargs) {
+ // the default (null) is assumed to be a single argument
+ case undefined:
+ case null:
+ regexpNargs = '(-*A-*)';
+ break;
+ // allow zero or more arguments
+ case c.OPTIONAL:
+ regexpNargs = '(-*A?-*)';
+ break;
+ // allow zero or more arguments
+ case c.ZERO_OR_MORE:
+ regexpNargs = '(-*[A-]*)';
+ break;
+ // allow one or more arguments
+ case c.ONE_OR_MORE:
+ regexpNargs = '(-*A[A-]*)';
+ break;
+ // allow any number of options or arguments
+ case c.REMAINDER:
+ regexpNargs = '([-AO]*)';
+ break;
+ // allow one argument followed by any number of options or arguments
+ case c.PARSER:
+ regexpNargs = '(-*A[-AO]*)';
+ break;
+ // all others should be integers
+ default:
+ regexpNargs = '(-*' + $$.repeat('-*A', action.nargs) + '-*)';
+ }
+
+ // if this is an optional action, -- is not allowed
+ if (action.isOptional()) {
+ regexpNargs = regexpNargs.replace(/-\*/g, '');
+ regexpNargs = regexpNargs.replace(/-/g, '');
+ }
+
+ // return the pattern
+ return regexpNargs;
+};
+
+//
+// Value conversion methods
+//
+
+ArgumentParser.prototype._getValues = function (action, argStrings) {
+ var self = this;
+
+ // for everything but PARSER args, strip out '--'
+ if (action.nargs !== c.PARSER && action.nargs !== c.REMAINDER) {
+ argStrings = argStrings.filter(function (arrayElement) {
+ return arrayElement !== '--';
+ });
+ }
+
+ var value, argString;
+
+ // optional argument produces a default when not present
+ if (argStrings.length === 0 && action.nargs === c.OPTIONAL) {
+
+ value = (action.isOptional()) ? action.constant : action.defaultValue;
+
+ if (typeof (value) === 'string') {
+ value = this._getValue(action, value);
+ this._checkValue(action, value);
+ }
+
+ // when nargs='*' on a positional, if there were no command-line
+ // args, use the default if it is anything other than None
+ } else if (argStrings.length === 0 && action.nargs === c.ZERO_OR_MORE &&
+ action.optionStrings.length === 0) {
+
+ value = (action.defaultValue || argStrings);
+ this._checkValue(action, value);
+
+ // single argument or optional argument produces a single value
+ } else if (argStrings.length === 1 &&
+ (!action.nargs || action.nargs === c.OPTIONAL)) {
+
+ argString = argStrings[0];
+ value = this._getValue(action, argString);
+ this._checkValue(action, value);
+
+ // REMAINDER arguments convert all values, checking none
+ } else if (action.nargs === c.REMAINDER) {
+ value = argStrings.map(function (v) {
+ return self._getValue(action, v);
+ });
+
+ // PARSER arguments convert all values, but check only the first
+ } else if (action.nargs === c.PARSER) {
+ value = argStrings.map(function (v) {
+ return self._getValue(action, v);
+ });
+ this._checkValue(action, value[0]);
+
+ // all other types of nargs produce a list
+ } else {
+ value = argStrings.map(function (v) {
+ return self._getValue(action, v);
+ });
+ value.forEach(function (v) {
+ self._checkValue(action, v);
+ });
+ }
+
+ // return the converted value
+ return value;
+};
+
+ArgumentParser.prototype._getValue = function (action, argString) {
+ var result;
+
+ var typeFunction = this._registryGet('type', action.type, action.type);
+ if (typeof typeFunction !== 'function') {
+ var message = format('%s is not callable', typeFunction);
+ throw argumentErrorHelper(action, message);
+ }
+
+ // convert the value to the appropriate type
+ try {
+ result = typeFunction(argString);
+
+ // ArgumentTypeErrors indicate errors
+ // If action.type is not a registered string, it is a function
+ // Try to deduce its name for inclusion in the error message
+ // Failing that, include the error message it raised.
+ } catch (e) {
+ var name = null;
+ if (typeof action.type === 'string') {
+ name = action.type;
+ } else {
+ name = action.type.name || action.type.displayName || '';
+ }
+ var msg = format('Invalid %s value: %s', name, argString);
+ if (name === '') { msg += '\n' + e.message; }
+ throw argumentErrorHelper(action, msg);
+ }
+ // return the converted value
+ return result;
+};
+
+ArgumentParser.prototype._checkValue = function (action, value) {
+ // converted value must be one of the choices (if specified)
+ var choices = action.choices;
+ if (choices) {
+ // choise for argument can by array or string
+ if ((typeof choices === 'string' || Array.isArray(choices)) &&
+ choices.indexOf(value) !== -1) {
+ return;
+ }
+ // choise for subparsers can by only hash
+ if (typeof choices === 'object' && !Array.isArray(choices) && choices[value]) {
+ return;
+ }
+
+ if (typeof choices === 'string') {
+ choices = choices.split('').join(', ');
+ } else if (Array.isArray(choices)) {
+ choices = choices.join(', ');
+ } else {
+ choices = Object.keys(choices).join(', ');
+ }
+ var message = format('Invalid choice: %s (choose from [%s])', value, choices);
+ throw argumentErrorHelper(action, message);
+ }
+};
+
+//
+// Help formatting methods
+//
+
+/**
+ * ArgumentParser#formatUsage -> string
+ *
+ * Return usage string
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
+ **/
+ArgumentParser.prototype.formatUsage = function () {
+ var formatter = this._getFormatter();
+ formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);
+ return formatter.formatHelp();
+};
+
+/**
+ * ArgumentParser#formatHelp -> string
+ *
+ * Return help
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
+ **/
+ArgumentParser.prototype.formatHelp = function () {
+ var formatter = this._getFormatter();
+
+ // usage
+ formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);
+
+ // description
+ formatter.addText(this.description);
+
+ // positionals, optionals and user-defined groups
+ this._actionGroups.forEach(function (actionGroup) {
+ formatter.startSection(actionGroup.title);
+ formatter.addText(actionGroup.description);
+ formatter.addArguments(actionGroup._groupActions);
+ formatter.endSection();
+ });
+
+ // epilog
+ formatter.addText(this.epilog);
+
+ // determine help from format above
+ return formatter.formatHelp();
+};
+
+ArgumentParser.prototype._getFormatter = function () {
+ var FormatterClass = this.formatterClass;
+ var formatter = new FormatterClass({ prog: this.prog });
+ return formatter;
+};
+
+//
+// Print functions
+//
+
+/**
+ * ArgumentParser#printUsage() -> Void
+ *
+ * Print usage
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
+ **/
+ArgumentParser.prototype.printUsage = function () {
+ this._printMessage(this.formatUsage());
+};
+
+/**
+ * ArgumentParser#printHelp() -> Void
+ *
+ * Print help
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
+ **/
+ArgumentParser.prototype.printHelp = function () {
+ this._printMessage(this.formatHelp());
+};
+
+ArgumentParser.prototype._printMessage = function (message, stream) {
+ if (!stream) {
+ stream = process.stdout;
+ }
+ if (message) {
+ stream.write('' + message);
+ }
+};
+
+//
+// Exit functions
+//
+
+/**
+ * ArgumentParser#exit(status=0, message) -> Void
+ * - status (int): exit status
+ * - message (string): message
+ *
+ * Print message in stderr/stdout and exit program
+ **/
+ArgumentParser.prototype.exit = function (status, message) {
+ if (message) {
+ if (status === 0) {
+ this._printMessage(message);
+ } else {
+ this._printMessage(message, process.stderr);
+ }
+ }
+
+ process.exit(status);
+};
+
+/**
+ * ArgumentParser#error(message) -> Void
+ * - err (Error|string): message
+ *
+ * Error method Prints a usage message incorporating the message to stderr and
+ * exits. If you override this in a subclass,
+ * it should not return -- it should
+ * either exit or throw an exception.
+ *
+ **/
+ArgumentParser.prototype.error = function (err) {
+ var message;
+ if (err instanceof Error) {
+ if (this.debug === true) {
+ throw err;
+ }
+ message = err.message;
+ } else {
+ message = err;
+ }
+ var msg = format('%s: error: %s', this.prog, message) + c.EOL;
+
+ if (this.debug === true) {
+ throw new Error(msg);
+ }
+
+ this.printUsage(process.stderr);
+
+ return this.exit(2, msg);
+};
+
+module.exports = ArgumentParser;
diff --git a/node_modules/argparse/lib/const.js b/node_modules/argparse/lib/const.js
new file mode 100644
index 0000000..b1fd4ce
--- /dev/null
+++ b/node_modules/argparse/lib/const.js
@@ -0,0 +1,21 @@
+//
+// Constants
+//
+
+'use strict';
+
+module.exports.EOL = '\n';
+
+module.exports.SUPPRESS = '==SUPPRESS==';
+
+module.exports.OPTIONAL = '?';
+
+module.exports.ZERO_OR_MORE = '*';
+
+module.exports.ONE_OR_MORE = '+';
+
+module.exports.PARSER = 'A...';
+
+module.exports.REMAINDER = '...';
+
+module.exports._UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args';
diff --git a/node_modules/argparse/lib/help/added_formatters.js b/node_modules/argparse/lib/help/added_formatters.js
new file mode 100644
index 0000000..f8e4299
--- /dev/null
+++ b/node_modules/argparse/lib/help/added_formatters.js
@@ -0,0 +1,87 @@
+'use strict';
+
+var util = require('util');
+
+// Constants
+var c = require('../const');
+
+var $$ = require('../utils');
+var HelpFormatter = require('./formatter.js');
+
+/**
+ * new RawDescriptionHelpFormatter(options)
+ * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
+ *
+ * Help message formatter which adds default values to argument help.
+ *
+ * Only the name of this class is considered a public API. All the methods
+ * provided by the class are considered an implementation detail.
+ **/
+
+function ArgumentDefaultsHelpFormatter(options) {
+ HelpFormatter.call(this, options);
+}
+
+util.inherits(ArgumentDefaultsHelpFormatter, HelpFormatter);
+
+ArgumentDefaultsHelpFormatter.prototype._getHelpString = function (action) {
+ var help = action.help;
+ if (action.help.indexOf('%(defaultValue)s') === -1) {
+ if (action.defaultValue !== c.SUPPRESS) {
+ var defaulting_nargs = [ c.OPTIONAL, c.ZERO_OR_MORE ];
+ if (action.isOptional() || (defaulting_nargs.indexOf(action.nargs) >= 0)) {
+ help += ' (default: %(defaultValue)s)';
+ }
+ }
+ }
+ return help;
+};
+
+module.exports.ArgumentDefaultsHelpFormatter = ArgumentDefaultsHelpFormatter;
+
+/**
+ * new RawDescriptionHelpFormatter(options)
+ * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
+ *
+ * Help message formatter which retains any formatting in descriptions.
+ *
+ * Only the name of this class is considered a public API. All the methods
+ * provided by the class are considered an implementation detail.
+ **/
+
+function RawDescriptionHelpFormatter(options) {
+ HelpFormatter.call(this, options);
+}
+
+util.inherits(RawDescriptionHelpFormatter, HelpFormatter);
+
+RawDescriptionHelpFormatter.prototype._fillText = function (text, width, indent) {
+ var lines = text.split('\n');
+ lines = lines.map(function (line) {
+ return $$.trimEnd(indent + line);
+ });
+ return lines.join('\n');
+};
+module.exports.RawDescriptionHelpFormatter = RawDescriptionHelpFormatter;
+
+/**
+ * new RawTextHelpFormatter(options)
+ * new ArgumentParser({formatterClass: argparse.RawTextHelpFormatter, ...})
+ *
+ * Help message formatter which retains formatting of all help text.
+ *
+ * Only the name of this class is considered a public API. All the methods
+ * provided by the class are considered an implementation detail.
+ **/
+
+function RawTextHelpFormatter(options) {
+ RawDescriptionHelpFormatter.call(this, options);
+}
+
+util.inherits(RawTextHelpFormatter, RawDescriptionHelpFormatter);
+
+RawTextHelpFormatter.prototype._splitLines = function (text) {
+ return text.split('\n');
+};
+
+module.exports.RawTextHelpFormatter = RawTextHelpFormatter;
diff --git a/node_modules/argparse/lib/help/formatter.js b/node_modules/argparse/lib/help/formatter.js
new file mode 100644
index 0000000..29036c1
--- /dev/null
+++ b/node_modules/argparse/lib/help/formatter.js
@@ -0,0 +1,795 @@
+/**
+ * class HelpFormatter
+ *
+ * Formatter for generating usage messages and argument help strings. Only the
+ * name of this class is considered a public API. All the methods provided by
+ * the class are considered an implementation detail.
+ *
+ * Do not call in your code, use this class only for inherits your own forvatter
+ *
+ * ToDo add [additonal formatters][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#formatter-class
+ **/
+'use strict';
+
+var sprintf = require('sprintf-js').sprintf;
+
+// Constants
+var c = require('../const');
+
+var $$ = require('../utils');
+
+
+/*:nodoc:* internal
+ * new Support(parent, heding)
+ * - parent (object): parent section
+ * - heading (string): header string
+ *
+ **/
+function Section(parent, heading) {
+ this._parent = parent;
+ this._heading = heading;
+ this._items = [];
+}
+
+/*:nodoc:* internal
+ * Section#addItem(callback) -> Void
+ * - callback (array): tuple with function and args
+ *
+ * Add function for single element
+ **/
+Section.prototype.addItem = function (callback) {
+ this._items.push(callback);
+};
+
+/*:nodoc:* internal
+ * Section#formatHelp(formatter) -> string
+ * - formatter (HelpFormatter): current formatter
+ *
+ * Form help section string
+ *
+ **/
+Section.prototype.formatHelp = function (formatter) {
+ var itemHelp, heading;
+
+ // format the indented section
+ if (this._parent) {
+ formatter._indent();
+ }
+
+ itemHelp = this._items.map(function (item) {
+ var obj, func, args;
+
+ obj = formatter;
+ func = item[0];
+ args = item[1];
+ return func.apply(obj, args);
+ });
+ itemHelp = formatter._joinParts(itemHelp);
+
+ if (this._parent) {
+ formatter._dedent();
+ }
+
+ // return nothing if the section was empty
+ if (!itemHelp) {
+ return '';
+ }
+
+ // add the heading if the section was non-empty
+ heading = '';
+ if (this._heading && this._heading !== c.SUPPRESS) {
+ var currentIndent = formatter.currentIndent;
+ heading = $$.repeat(' ', currentIndent) + this._heading + ':' + c.EOL;
+ }
+
+ // join the section-initialize newline, the heading and the help
+ return formatter._joinParts([ c.EOL, heading, itemHelp, c.EOL ]);
+};
+
+/**
+ * new HelpFormatter(options)
+ *
+ * #### Options:
+ * - `prog`: program name
+ * - `indentIncriment`: indent step, default value 2
+ * - `maxHelpPosition`: max help position, default value = 24
+ * - `width`: line width
+ *
+ **/
+var HelpFormatter = module.exports = function HelpFormatter(options) {
+ options = options || {};
+
+ this._prog = options.prog;
+
+ this._maxHelpPosition = options.maxHelpPosition || 24;
+ this._width = (options.width || ((process.env.COLUMNS || 80) - 2));
+
+ this._currentIndent = 0;
+ this._indentIncriment = options.indentIncriment || 2;
+ this._level = 0;
+ this._actionMaxLength = 0;
+
+ this._rootSection = new Section(null);
+ this._currentSection = this._rootSection;
+
+ this._whitespaceMatcher = new RegExp('\\s+', 'g');
+ this._longBreakMatcher = new RegExp(c.EOL + c.EOL + c.EOL + '+', 'g');
+};
+
+HelpFormatter.prototype._indent = function () {
+ this._currentIndent += this._indentIncriment;
+ this._level += 1;
+};
+
+HelpFormatter.prototype._dedent = function () {
+ this._currentIndent -= this._indentIncriment;
+ this._level -= 1;
+ if (this._currentIndent < 0) {
+ throw new Error('Indent decreased below 0.');
+ }
+};
+
+HelpFormatter.prototype._addItem = function (func, args) {
+ this._currentSection.addItem([ func, args ]);
+};
+
+//
+// Message building methods
+//
+
+/**
+ * HelpFormatter#startSection(heading) -> Void
+ * - heading (string): header string
+ *
+ * Start new help section
+ *
+ * See alse [code example][1]
+ *
+ * ##### Example
+ *
+ * formatter.startSection(actionGroup.title);
+ * formatter.addText(actionGroup.description);
+ * formatter.addArguments(actionGroup._groupActions);
+ * formatter.endSection();
+ *
+ **/
+HelpFormatter.prototype.startSection = function (heading) {
+ this._indent();
+ var section = new Section(this._currentSection, heading);
+ var func = section.formatHelp.bind(section);
+ this._addItem(func, [ this ]);
+ this._currentSection = section;
+};
+
+/**
+ * HelpFormatter#endSection -> Void
+ *
+ * End help section
+ *
+ * ##### Example
+ *
+ * formatter.startSection(actionGroup.title);
+ * formatter.addText(actionGroup.description);
+ * formatter.addArguments(actionGroup._groupActions);
+ * formatter.endSection();
+ **/
+HelpFormatter.prototype.endSection = function () {
+ this._currentSection = this._currentSection._parent;
+ this._dedent();
+};
+
+/**
+ * HelpFormatter#addText(text) -> Void
+ * - text (string): plain text
+ *
+ * Add plain text into current section
+ *
+ * ##### Example
+ *
+ * formatter.startSection(actionGroup.title);
+ * formatter.addText(actionGroup.description);
+ * formatter.addArguments(actionGroup._groupActions);
+ * formatter.endSection();
+ *
+ **/
+HelpFormatter.prototype.addText = function (text) {
+ if (text && text !== c.SUPPRESS) {
+ this._addItem(this._formatText, [ text ]);
+ }
+};
+
+/**
+ * HelpFormatter#addUsage(usage, actions, groups, prefix) -> Void
+ * - usage (string): usage text
+ * - actions (array): actions list
+ * - groups (array): groups list
+ * - prefix (string): usage prefix
+ *
+ * Add usage data into current section
+ *
+ * ##### Example
+ *
+ * formatter.addUsage(this.usage, this._actions, []);
+ * return formatter.formatHelp();
+ *
+ **/
+HelpFormatter.prototype.addUsage = function (usage, actions, groups, prefix) {
+ if (usage !== c.SUPPRESS) {
+ this._addItem(this._formatUsage, [ usage, actions, groups, prefix ]);
+ }
+};
+
+/**
+ * HelpFormatter#addArgument(action) -> Void
+ * - action (object): action
+ *
+ * Add argument into current section
+ *
+ * Single variant of [[HelpFormatter#addArguments]]
+ **/
+HelpFormatter.prototype.addArgument = function (action) {
+ if (action.help !== c.SUPPRESS) {
+ var self = this;
+
+ // find all invocations
+ var invocations = [ this._formatActionInvocation(action) ];
+ var invocationLength = invocations[0].length;
+
+ var actionLength;
+
+ if (action._getSubactions) {
+ this._indent();
+ action._getSubactions().forEach(function (subaction) {
+
+ var invocationNew = self._formatActionInvocation(subaction);
+ invocations.push(invocationNew);
+ invocationLength = Math.max(invocationLength, invocationNew.length);
+
+ });
+ this._dedent();
+ }
+
+ // update the maximum item length
+ actionLength = invocationLength + this._currentIndent;
+ this._actionMaxLength = Math.max(this._actionMaxLength, actionLength);
+
+ // add the item to the list
+ this._addItem(this._formatAction, [ action ]);
+ }
+};
+
+/**
+ * HelpFormatter#addArguments(actions) -> Void
+ * - actions (array): actions list
+ *
+ * Mass add arguments into current section
+ *
+ * ##### Example
+ *
+ * formatter.startSection(actionGroup.title);
+ * formatter.addText(actionGroup.description);
+ * formatter.addArguments(actionGroup._groupActions);
+ * formatter.endSection();
+ *
+ **/
+HelpFormatter.prototype.addArguments = function (actions) {
+ var self = this;
+ actions.forEach(function (action) {
+ self.addArgument(action);
+ });
+};
+
+//
+// Help-formatting methods
+//
+
+/**
+ * HelpFormatter#formatHelp -> string
+ *
+ * Format help
+ *
+ * ##### Example
+ *
+ * formatter.addText(this.epilog);
+ * return formatter.formatHelp();
+ *
+ **/
+HelpFormatter.prototype.formatHelp = function () {
+ var help = this._rootSection.formatHelp(this);
+ if (help) {
+ help = help.replace(this._longBreakMatcher, c.EOL + c.EOL);
+ help = $$.trimChars(help, c.EOL) + c.EOL;
+ }
+ return help;
+};
+
+HelpFormatter.prototype._joinParts = function (partStrings) {
+ return partStrings.filter(function (part) {
+ return (part && part !== c.SUPPRESS);
+ }).join('');
+};
+
+HelpFormatter.prototype._formatUsage = function (usage, actions, groups, prefix) {
+ if (!prefix && typeof prefix !== 'string') {
+ prefix = 'usage: ';
+ }
+
+ actions = actions || [];
+ groups = groups || [];
+
+
+ // if usage is specified, use that
+ if (usage) {
+ usage = sprintf(usage, { prog: this._prog });
+
+ // if no optionals or positionals are available, usage is just prog
+ } else if (!usage && actions.length === 0) {
+ usage = this._prog;
+
+ // if optionals and positionals are available, calculate usage
+ } else if (!usage) {
+ var prog = this._prog;
+ var optionals = [];
+ var positionals = [];
+ var actionUsage;
+ var textWidth;
+
+ // split optionals from positionals
+ actions.forEach(function (action) {
+ if (action.isOptional()) {
+ optionals.push(action);
+ } else {
+ positionals.push(action);
+ }
+ });
+
+ // build full usage string
+ actionUsage = this._formatActionsUsage([].concat(optionals, positionals), groups);
+ usage = [ prog, actionUsage ].join(' ');
+
+ // wrap the usage parts if it's too long
+ textWidth = this._width - this._currentIndent;
+ if ((prefix.length + usage.length) > textWidth) {
+
+ // break usage into wrappable parts
+ var regexpPart = new RegExp('\\(.*?\\)+|\\[.*?\\]+|\\S+', 'g');
+ var optionalUsage = this._formatActionsUsage(optionals, groups);
+ var positionalUsage = this._formatActionsUsage(positionals, groups);
+
+
+ var optionalParts = optionalUsage.match(regexpPart);
+ var positionalParts = positionalUsage.match(regexpPart) || [];
+
+ if (optionalParts.join(' ') !== optionalUsage) {
+ throw new Error('assert "optionalParts.join(\' \') === optionalUsage"');
+ }
+ if (positionalParts.join(' ') !== positionalUsage) {
+ throw new Error('assert "positionalParts.join(\' \') === positionalUsage"');
+ }
+
+ // helper for wrapping lines
+ /*eslint-disable func-style*/ // node 0.10 compat
+ var _getLines = function (parts, indent, prefix) {
+ var lines = [];
+ var line = [];
+
+ var lineLength = prefix ? prefix.length - 1 : indent.length - 1;
+
+ parts.forEach(function (part) {
+ if (lineLength + 1 + part.length > textWidth) {
+ lines.push(indent + line.join(' '));
+ line = [];
+ lineLength = indent.length - 1;
+ }
+ line.push(part);
+ lineLength += part.length + 1;
+ });
+
+ if (line) {
+ lines.push(indent + line.join(' '));
+ }
+ if (prefix) {
+ lines[0] = lines[0].substr(indent.length);
+ }
+ return lines;
+ };
+
+ var lines, indent, parts;
+ // if prog is short, follow it with optionals or positionals
+ if (prefix.length + prog.length <= 0.75 * textWidth) {
+ indent = $$.repeat(' ', (prefix.length + prog.length + 1));
+ if (optionalParts) {
+ lines = [].concat(
+ _getLines([ prog ].concat(optionalParts), indent, prefix),
+ _getLines(positionalParts, indent)
+ );
+ } else if (positionalParts) {
+ lines = _getLines([ prog ].concat(positionalParts), indent, prefix);
+ } else {
+ lines = [ prog ];
+ }
+
+ // if prog is long, put it on its own line
+ } else {
+ indent = $$.repeat(' ', prefix.length);
+ parts = optionalParts.concat(positionalParts);
+ lines = _getLines(parts, indent);
+ if (lines.length > 1) {
+ lines = [].concat(
+ _getLines(optionalParts, indent),
+ _getLines(positionalParts, indent)
+ );
+ }
+ lines = [ prog ].concat(lines);
+ }
+ // join lines into usage
+ usage = lines.join(c.EOL);
+ }
+ }
+
+ // prefix with 'usage:'
+ return prefix + usage + c.EOL + c.EOL;
+};
+
+HelpFormatter.prototype._formatActionsUsage = function (actions, groups) {
+ // find group indices and identify actions in groups
+ var groupActions = [];
+ var inserts = [];
+ var self = this;
+
+ groups.forEach(function (group) {
+ var end;
+ var i;
+
+ var start = actions.indexOf(group._groupActions[0]);
+ if (start >= 0) {
+ end = start + group._groupActions.length;
+
+ //if (actions.slice(start, end) === group._groupActions) {
+ if ($$.arrayEqual(actions.slice(start, end), group._groupActions)) {
+ group._groupActions.forEach(function (action) {
+ groupActions.push(action);
+ });
+
+ if (!group.required) {
+ if (inserts[start]) {
+ inserts[start] += ' [';
+ } else {
+ inserts[start] = '[';
+ }
+ inserts[end] = ']';
+ } else {
+ if (inserts[start]) {
+ inserts[start] += ' (';
+ } else {
+ inserts[start] = '(';
+ }
+ inserts[end] = ')';
+ }
+ for (i = start + 1; i < end; i += 1) {
+ inserts[i] = '|';
+ }
+ }
+ }
+ });
+
+ // collect all actions format strings
+ var parts = [];
+
+ actions.forEach(function (action, actionIndex) {
+ var part;
+ var optionString;
+ var argsDefault;
+ var argsString;
+
+ // suppressed arguments are marked with None
+ // remove | separators for suppressed arguments
+ if (action.help === c.SUPPRESS) {
+ parts.push(null);
+ if (inserts[actionIndex] === '|') {
+ inserts.splice(actionIndex, actionIndex);
+ } else if (inserts[actionIndex + 1] === '|') {
+ inserts.splice(actionIndex + 1, actionIndex + 1);
+ }
+
+ // produce all arg strings
+ } else if (!action.isOptional()) {
+ part = self._formatArgs(action, action.dest);
+
+ // if it's in a group, strip the outer []
+ if (groupActions.indexOf(action) >= 0) {
+ if (part[0] === '[' && part[part.length - 1] === ']') {
+ part = part.slice(1, -1);
+ }
+ }
+ // add the action string to the list
+ parts.push(part);
+
+ // produce the first way to invoke the option in brackets
+ } else {
+ optionString = action.optionStrings[0];
+
+ // if the Optional doesn't take a value, format is: -s or --long
+ if (action.nargs === 0) {
+ part = '' + optionString;
+
+ // if the Optional takes a value, format is: -s ARGS or --long ARGS
+ } else {
+ argsDefault = action.dest.toUpperCase();
+ argsString = self._formatArgs(action, argsDefault);
+ part = optionString + ' ' + argsString;
+ }
+ // make it look optional if it's not required or in a group
+ if (!action.required && groupActions.indexOf(action) < 0) {
+ part = '[' + part + ']';
+ }
+ // add the action string to the list
+ parts.push(part);
+ }
+ });
+
+ // insert things at the necessary indices
+ for (var i = inserts.length - 1; i >= 0; --i) {
+ if (inserts[i] !== null) {
+ parts.splice(i, 0, inserts[i]);
+ }
+ }
+
+ // join all the action items with spaces
+ var text = parts.filter(function (part) {
+ return !!part;
+ }).join(' ');
+
+ // clean up separators for mutually exclusive groups
+ text = text.replace(/([\[(]) /g, '$1'); // remove spaces
+ text = text.replace(/ ([\])])/g, '$1');
+ text = text.replace(/\[ *\]/g, ''); // remove empty groups
+ text = text.replace(/\( *\)/g, '');
+ text = text.replace(/\(([^|]*)\)/g, '$1'); // remove () from single action groups
+
+ text = text.trim();
+
+ // return the text
+ return text;
+};
+
+HelpFormatter.prototype._formatText = function (text) {
+ text = sprintf(text, { prog: this._prog });
+ var textWidth = this._width - this._currentIndent;
+ var indentIncriment = $$.repeat(' ', this._currentIndent);
+ return this._fillText(text, textWidth, indentIncriment) + c.EOL + c.EOL;
+};
+
+HelpFormatter.prototype._formatAction = function (action) {
+ var self = this;
+
+ var helpText;
+ var helpLines;
+ var parts;
+ var indentFirst;
+
+ // determine the required width and the entry label
+ var helpPosition = Math.min(this._actionMaxLength + 2, this._maxHelpPosition);
+ var helpWidth = this._width - helpPosition;
+ var actionWidth = helpPosition - this._currentIndent - 2;
+ var actionHeader = this._formatActionInvocation(action);
+
+ // no help; start on same line and add a final newline
+ if (!action.help) {
+ actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;
+
+ // short action name; start on the same line and pad two spaces
+ } else if (actionHeader.length <= actionWidth) {
+ actionHeader = $$.repeat(' ', this._currentIndent) +
+ actionHeader +
+ ' ' +
+ $$.repeat(' ', actionWidth - actionHeader.length);
+ indentFirst = 0;
+
+ // long action name; start on the next line
+ } else {
+ actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;
+ indentFirst = helpPosition;
+ }
+
+ // collect the pieces of the action help
+ parts = [ actionHeader ];
+
+ // if there was help for the action, add lines of help text
+ if (action.help) {
+ helpText = this._expandHelp(action);
+ helpLines = this._splitLines(helpText, helpWidth);
+ parts.push($$.repeat(' ', indentFirst) + helpLines[0] + c.EOL);
+ helpLines.slice(1).forEach(function (line) {
+ parts.push($$.repeat(' ', helpPosition) + line + c.EOL);
+ });
+
+ // or add a newline if the description doesn't end with one
+ } else if (actionHeader.charAt(actionHeader.length - 1) !== c.EOL) {
+ parts.push(c.EOL);
+ }
+ // if there are any sub-actions, add their help as well
+ if (action._getSubactions) {
+ this._indent();
+ action._getSubactions().forEach(function (subaction) {
+ parts.push(self._formatAction(subaction));
+ });
+ this._dedent();
+ }
+ // return a single string
+ return this._joinParts(parts);
+};
+
+HelpFormatter.prototype._formatActionInvocation = function (action) {
+ if (!action.isOptional()) {
+ var format_func = this._metavarFormatter(action, action.dest);
+ var metavars = format_func(1);
+ return metavars[0];
+ }
+
+ var parts = [];
+ var argsDefault;
+ var argsString;
+
+ // if the Optional doesn't take a value, format is: -s, --long
+ if (action.nargs === 0) {
+ parts = parts.concat(action.optionStrings);
+
+ // if the Optional takes a value, format is: -s ARGS, --long ARGS
+ } else {
+ argsDefault = action.dest.toUpperCase();
+ argsString = this._formatArgs(action, argsDefault);
+ action.optionStrings.forEach(function (optionString) {
+ parts.push(optionString + ' ' + argsString);
+ });
+ }
+ return parts.join(', ');
+};
+
+HelpFormatter.prototype._metavarFormatter = function (action, metavarDefault) {
+ var result;
+
+ if (action.metavar || action.metavar === '') {
+ result = action.metavar;
+ } else if (action.choices) {
+ var choices = action.choices;
+
+ if (typeof choices === 'string') {
+ choices = choices.split('').join(', ');
+ } else if (Array.isArray(choices)) {
+ choices = choices.join(',');
+ } else {
+ choices = Object.keys(choices).join(',');
+ }
+ result = '{' + choices + '}';
+ } else {
+ result = metavarDefault;
+ }
+
+ return function (size) {
+ if (Array.isArray(result)) {
+ return result;
+ }
+
+ var metavars = [];
+ for (var i = 0; i < size; i += 1) {
+ metavars.push(result);
+ }
+ return metavars;
+ };
+};
+
+HelpFormatter.prototype._formatArgs = function (action, metavarDefault) {
+ var result;
+ var metavars;
+
+ var buildMetavar = this._metavarFormatter(action, metavarDefault);
+
+ switch (action.nargs) {
+ /*eslint-disable no-undefined*/
+ case undefined:
+ case null:
+ metavars = buildMetavar(1);
+ result = '' + metavars[0];
+ break;
+ case c.OPTIONAL:
+ metavars = buildMetavar(1);
+ result = '[' + metavars[0] + ']';
+ break;
+ case c.ZERO_OR_MORE:
+ metavars = buildMetavar(2);
+ result = '[' + metavars[0] + ' [' + metavars[1] + ' ...]]';
+ break;
+ case c.ONE_OR_MORE:
+ metavars = buildMetavar(2);
+ result = '' + metavars[0] + ' [' + metavars[1] + ' ...]';
+ break;
+ case c.REMAINDER:
+ result = '...';
+ break;
+ case c.PARSER:
+ metavars = buildMetavar(1);
+ result = metavars[0] + ' ...';
+ break;
+ default:
+ metavars = buildMetavar(action.nargs);
+ result = metavars.join(' ');
+ }
+ return result;
+};
+
+HelpFormatter.prototype._expandHelp = function (action) {
+ var params = { prog: this._prog };
+
+ Object.keys(action).forEach(function (actionProperty) {
+ var actionValue = action[actionProperty];
+
+ if (actionValue !== c.SUPPRESS) {
+ params[actionProperty] = actionValue;
+ }
+ });
+
+ if (params.choices) {
+ if (typeof params.choices === 'string') {
+ params.choices = params.choices.split('').join(', ');
+ } else if (Array.isArray(params.choices)) {
+ params.choices = params.choices.join(', ');
+ } else {
+ params.choices = Object.keys(params.choices).join(', ');
+ }
+ }
+
+ return sprintf(this._getHelpString(action), params);
+};
+
+HelpFormatter.prototype._splitLines = function (text, width) {
+ var lines = [];
+ var delimiters = [ ' ', '.', ',', '!', '?' ];
+ var re = new RegExp('[' + delimiters.join('') + '][^' + delimiters.join('') + ']*$');
+
+ text = text.replace(/[\n\|\t]/g, ' ');
+
+ text = text.trim();
+ text = text.replace(this._whitespaceMatcher, ' ');
+
+ // Wraps the single paragraph in text (a string) so every line
+ // is at most width characters long.
+ text.split(c.EOL).forEach(function (line) {
+ if (width >= line.length) {
+ lines.push(line);
+ return;
+ }
+
+ var wrapStart = 0;
+ var wrapEnd = width;
+ var delimiterIndex = 0;
+ while (wrapEnd <= line.length) {
+ if (wrapEnd !== line.length && delimiters.indexOf(line[wrapEnd] < -1)) {
+ delimiterIndex = (re.exec(line.substring(wrapStart, wrapEnd)) || {}).index;
+ wrapEnd = wrapStart + delimiterIndex + 1;
+ }
+ lines.push(line.substring(wrapStart, wrapEnd));
+ wrapStart = wrapEnd;
+ wrapEnd += width;
+ }
+ if (wrapStart < line.length) {
+ lines.push(line.substring(wrapStart, wrapEnd));
+ }
+ });
+
+ return lines;
+};
+
+HelpFormatter.prototype._fillText = function (text, width, indent) {
+ var lines = this._splitLines(text, width);
+ lines = lines.map(function (line) {
+ return indent + line;
+ });
+ return lines.join(c.EOL);
+};
+
+HelpFormatter.prototype._getHelpString = function (action) {
+ return action.help;
+};
diff --git a/node_modules/argparse/lib/namespace.js b/node_modules/argparse/lib/namespace.js
new file mode 100644
index 0000000..a860de9
--- /dev/null
+++ b/node_modules/argparse/lib/namespace.js
@@ -0,0 +1,76 @@
+/**
+ * class Namespace
+ *
+ * Simple object for storing attributes. Implements equality by attribute names
+ * and values, and provides a simple string representation.
+ *
+ * See also [original guide][1]
+ *
+ * [1]:http://docs.python.org/dev/library/argparse.html#the-namespace-object
+ **/
+'use strict';
+
+var $$ = require('./utils');
+
+/**
+ * new Namespace(options)
+ * - options(object): predefined propertis for result object
+ *
+ **/
+var Namespace = module.exports = function Namespace(options) {
+ $$.extend(this, options);
+};
+
+/**
+ * Namespace#isset(key) -> Boolean
+ * - key (string|number): property name
+ *
+ * Tells whenever `namespace` contains given `key` or not.
+ **/
+Namespace.prototype.isset = function (key) {
+ return $$.has(this, key);
+};
+
+/**
+ * Namespace#set(key, value) -> self
+ * -key (string|number|object): propery name
+ * -value (mixed): new property value
+ *
+ * Set the property named key with value.
+ * If key object then set all key properties to namespace object
+ **/
+Namespace.prototype.set = function (key, value) {
+ if (typeof (key) === 'object') {
+ $$.extend(this, key);
+ } else {
+ this[key] = value;
+ }
+ return this;
+};
+
+/**
+ * Namespace#get(key, defaultValue) -> mixed
+ * - key (string|number): property name
+ * - defaultValue (mixed): default value
+ *
+ * Return the property key or defaulValue if not set
+ **/
+Namespace.prototype.get = function (key, defaultValue) {
+ return !this[key] ? defaultValue : this[key];
+};
+
+/**
+ * Namespace#unset(key, defaultValue) -> mixed
+ * - key (string|number): property name
+ * - defaultValue (mixed): default value
+ *
+ * Return data[key](and delete it) or defaultValue
+ **/
+Namespace.prototype.unset = function (key, defaultValue) {
+ var value = this[key];
+ if (value !== null) {
+ delete this[key];
+ return value;
+ }
+ return defaultValue;
+};
diff --git a/node_modules/argparse/lib/utils.js b/node_modules/argparse/lib/utils.js
new file mode 100644
index 0000000..4a9cf3e
--- /dev/null
+++ b/node_modules/argparse/lib/utils.js
@@ -0,0 +1,57 @@
+'use strict';
+
+exports.repeat = function (str, num) {
+ var result = '';
+ for (var i = 0; i < num; i++) { result += str; }
+ return result;
+};
+
+exports.arrayEqual = function (a, b) {
+ if (a.length !== b.length) { return false; }
+ for (var i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) { return false; }
+ }
+ return true;
+};
+
+exports.trimChars = function (str, chars) {
+ var start = 0;
+ var end = str.length - 1;
+ while (chars.indexOf(str.charAt(start)) >= 0) { start++; }
+ while (chars.indexOf(str.charAt(end)) >= 0) { end--; }
+ return str.slice(start, end + 1);
+};
+
+exports.capitalize = function (str) {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+};
+
+exports.arrayUnion = function () {
+ var result = [];
+ for (var i = 0, values = {}; i < arguments.length; i++) {
+ var arr = arguments[i];
+ for (var j = 0; j < arr.length; j++) {
+ if (!values[arr[j]]) {
+ values[arr[j]] = true;
+ result.push(arr[j]);
+ }
+ }
+ }
+ return result;
+};
+
+function has(obj, key) {
+ return Object.prototype.hasOwnProperty.call(obj, key);
+}
+
+exports.has = has;
+
+exports.extend = function (dest, src) {
+ for (var i in src) {
+ if (has(src, i)) { dest[i] = src[i]; }
+ }
+};
+
+exports.trimEnd = function (str) {
+ return str.replace(/\s+$/g, '');
+};
diff --git a/node_modules/argparse/package.json b/node_modules/argparse/package.json
new file mode 100644
index 0000000..f997c30
--- /dev/null
+++ b/node_modules/argparse/package.json
@@ -0,0 +1,74 @@
+{
+ "_args": [
+ [
+ "argparse@1.0.10",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "argparse@1.0.10",
+ "_id": "argparse@1.0.10",
+ "_inBundle": false,
+ "_integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "_location": "/argparse",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "argparse@1.0.10",
+ "name": "argparse",
+ "escapedName": "argparse",
+ "rawSpec": "1.0.10",
+ "saveSpec": null,
+ "fetchSpec": "1.0.10"
+ },
+ "_requiredBy": [
+ "/js-yaml"
+ ],
+ "_resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "_spec": "1.0.10",
+ "_where": "C:\\POC\\Natours",
+ "bugs": {
+ "url": "https://github.com/nodeca/argparse/issues"
+ },
+ "contributors": [
+ {
+ "name": "Eugene Shkuropat"
+ },
+ {
+ "name": "Paul Jacobson"
+ }
+ ],
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ },
+ "description": "Very powerful CLI arguments parser. Native port of argparse - python's options parsing library",
+ "devDependencies": {
+ "eslint": "^2.13.1",
+ "istanbul": "^0.4.5",
+ "mocha": "^3.1.0",
+ "ndoc": "^5.0.1"
+ },
+ "files": [
+ "index.js",
+ "lib/"
+ ],
+ "homepage": "https://github.com/nodeca/argparse#readme",
+ "keywords": [
+ "cli",
+ "parser",
+ "argparse",
+ "option",
+ "args"
+ ],
+ "license": "MIT",
+ "name": "argparse",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/nodeca/argparse.git"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "version": "1.0.10"
+}
diff --git a/node_modules/arr-diff/LICENSE b/node_modules/arr-diff/LICENSE
new file mode 100644
index 0000000..fa30c4c
--- /dev/null
+++ b/node_modules/arr-diff/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2015, Jon Schlinkert.
+
+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.
diff --git a/node_modules/arr-diff/README.md b/node_modules/arr-diff/README.md
new file mode 100644
index 0000000..7705c6c
--- /dev/null
+++ b/node_modules/arr-diff/README.md
@@ -0,0 +1,74 @@
+# arr-diff [![NPM version](https://img.shields.io/npm/v/arr-diff.svg)](https://www.npmjs.com/package/arr-diff) [![Build Status](https://img.shields.io/travis/jonschlinkert/base.svg)](https://travis-ci.org/jonschlinkert/base)
+
+> Returns an array with only the unique values from the first array, by excluding all values from additional arrays using strict equality for comparisons.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/)
+
+```sh
+$ npm i arr-diff --save
+```
+Install with [bower](http://bower.io/)
+
+```sh
+$ bower install arr-diff --save
+```
+
+## API
+
+### [diff](index.js#L33)
+
+Return the difference between the first array and additional arrays.
+
+**Params**
+
+* `a` **{Array}**
+* `b` **{Array}**
+* `returns` **{Array}**
+
+**Example**
+
+```js
+var diff = require('arr-diff');
+
+var a = ['a', 'b', 'c', 'd'];
+var b = ['b', 'c'];
+
+console.log(diff(a, b))
+//=> ['a', 'd']
+```
+
+## Related projects
+
+* [arr-flatten](https://www.npmjs.com/package/arr-flatten): Recursively flatten an array or arrays. This is the fastest implementation of array flatten. | [homepage](https://github.com/jonschlinkert/arr-flatten)
+* [array-filter](https://www.npmjs.com/package/array-filter): Array#filter for older browsers. | [homepage](https://github.com/juliangruber/array-filter)
+* [array-intersection](https://www.npmjs.com/package/array-intersection): Return an array with the unique values present in _all_ given arrays using strict equality… [more](https://www.npmjs.com/package/array-intersection) | [homepage](https://github.com/jonschlinkert/array-intersection)
+
+## Running tests
+
+Install dev dependencies:
+
+```sh
+$ npm i -d && npm test
+```
+
+## Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/arr-diff/issues/new).
+
+## Author
+
+**Jon Schlinkert**
+
++ [github/jonschlinkert](https://github.com/jonschlinkert)
++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+## License
+
+Copyright © 2015 [Jon Schlinkert](https://github.com/jonschlinkert)
+Released under the MIT license.
+
+***
+
+_This file was generated by [verb](https://github.com/verbose/verb) on Sat Dec 05 2015 23:24:53 GMT-0500 (EST)._
diff --git a/node_modules/arr-diff/index.js b/node_modules/arr-diff/index.js
new file mode 100644
index 0000000..bc7200d
--- /dev/null
+++ b/node_modules/arr-diff/index.js
@@ -0,0 +1,58 @@
+/*!
+ * arr-diff
+ *
+ * Copyright (c) 2014 Jon Schlinkert, contributors.
+ * Licensed under the MIT License
+ */
+
+'use strict';
+
+var flatten = require('arr-flatten');
+var slice = [].slice;
+
+/**
+ * Return the difference between the first array and
+ * additional arrays.
+ *
+ * ```js
+ * var diff = require('{%= name %}');
+ *
+ * var a = ['a', 'b', 'c', 'd'];
+ * var b = ['b', 'c'];
+ *
+ * console.log(diff(a, b))
+ * //=> ['a', 'd']
+ * ```
+ *
+ * @param {Array} `a`
+ * @param {Array} `b`
+ * @return {Array}
+ * @api public
+ */
+
+function diff(arr, arrays) {
+ var argsLen = arguments.length;
+ var len = arr.length, i = -1;
+ var res = [], arrays;
+
+ if (argsLen === 1) {
+ return arr;
+ }
+
+ if (argsLen > 2) {
+ arrays = flatten(slice.call(arguments, 1));
+ }
+
+ while (++i < len) {
+ if (!~arrays.indexOf(arr[i])) {
+ res.push(arr[i]);
+ }
+ }
+ return res;
+}
+
+/**
+ * Expose `diff`
+ */
+
+module.exports = diff;
diff --git a/node_modules/arr-diff/package.json b/node_modules/arr-diff/package.json
new file mode 100644
index 0000000..e60a538
--- /dev/null
+++ b/node_modules/arr-diff/package.json
@@ -0,0 +1,84 @@
+{
+ "_args": [
+ [
+ "arr-diff@2.0.0",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "arr-diff@2.0.0",
+ "_id": "arr-diff@2.0.0",
+ "_inBundle": false,
+ "_integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "_location": "/arr-diff",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "arr-diff@2.0.0",
+ "name": "arr-diff",
+ "escapedName": "arr-diff",
+ "rawSpec": "2.0.0",
+ "saveSpec": null,
+ "fetchSpec": "2.0.0"
+ },
+ "_requiredBy": [
+ "/micromatch"
+ ],
+ "_resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "_spec": "2.0.0",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Jon Schlinkert",
+ "url": "https://github.com/jonschlinkert"
+ },
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/arr-diff/issues"
+ },
+ "dependencies": {
+ "arr-flatten": "^1.0.1"
+ },
+ "description": "Returns an array with only the unique values from the first array, by excluding all values from additional arrays using strict equality for comparisons.",
+ "devDependencies": {
+ "array-differ": "^1.0.0",
+ "array-slice": "^0.2.3",
+ "benchmarked": "^0.1.4",
+ "chalk": "^1.1.1",
+ "mocha": "*",
+ "should": "*"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/jonschlinkert/arr-diff",
+ "keywords": [
+ "arr",
+ "array",
+ "diff",
+ "differ",
+ "difference"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "arr-diff",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jonschlinkert/arr-diff.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "verb": {
+ "related": {
+ "list": [
+ "arr-flatten",
+ "array-filter",
+ "array-intersection"
+ ]
+ }
+ },
+ "version": "2.0.0"
+}
diff --git a/node_modules/arr-flatten/LICENSE b/node_modules/arr-flatten/LICENSE
new file mode 100644
index 0000000..3f2eca1
--- /dev/null
+++ b/node_modules/arr-flatten/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2017, Jon Schlinkert.
+
+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.
diff --git a/node_modules/arr-flatten/README.md b/node_modules/arr-flatten/README.md
new file mode 100644
index 0000000..7dc7a97
--- /dev/null
+++ b/node_modules/arr-flatten/README.md
@@ -0,0 +1,86 @@
+# arr-flatten [![NPM version](https://img.shields.io/npm/v/arr-flatten.svg?style=flat)](https://www.npmjs.com/package/arr-flatten) [![NPM monthly downloads](https://img.shields.io/npm/dm/arr-flatten.svg?style=flat)](https://npmjs.org/package/arr-flatten) [![NPM total downloads](https://img.shields.io/npm/dt/arr-flatten.svg?style=flat)](https://npmjs.org/package/arr-flatten) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/arr-flatten.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/arr-flatten) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/arr-flatten.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/arr-flatten)
+
+> Recursively flatten an array or arrays.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save arr-flatten
+```
+
+## Install
+
+Install with [bower](https://bower.io/)
+
+```sh
+$ bower install arr-flatten --save
+```
+
+## Usage
+
+```js
+var flatten = require('arr-flatten');
+
+flatten(['a', ['b', ['c']], 'd', ['e']]);
+//=> ['a', 'b', 'c', 'd', 'e']
+```
+
+## Why another flatten utility?
+
+I wanted the fastest implementation I could find, with implementation choices that should work for 95% of use cases, but no cruft to cover the other 5%.
+
+## About
+
+### Related projects
+
+* [arr-filter](https://www.npmjs.com/package/arr-filter): Faster alternative to javascript's native filter method. | [homepage](https://github.com/jonschlinkert/arr-filter "Faster alternative to javascript's native filter method.")
+* [arr-union](https://www.npmjs.com/package/arr-union): Combines a list of arrays, returning a single array with unique values, using strict equality… [more](https://github.com/jonschlinkert/arr-union) | [homepage](https://github.com/jonschlinkert/arr-union "Combines a list of arrays, returning a single array with unique values, using strict equality for comparisons.")
+* [array-each](https://www.npmjs.com/package/array-each): Loop over each item in an array and call the given function on every element. | [homepage](https://github.com/jonschlinkert/array-each "Loop over each item in an array and call the given function on every element.")
+* [array-unique](https://www.npmjs.com/package/array-unique): Remove duplicate values from an array. Fastest ES5 implementation. | [homepage](https://github.com/jonschlinkert/array-unique "Remove duplicate values from an array. Fastest ES5 implementation.")
+
+### Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 20 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 1 | [lukeed](https://github.com/lukeed) |
+
+### Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+### Running tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+### Author
+
+**Jon Schlinkert**
+
+* [github/jonschlinkert](https://github.com/jonschlinkert)
+* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 05, 2017._
\ No newline at end of file
diff --git a/node_modules/arr-flatten/index.js b/node_modules/arr-flatten/index.js
new file mode 100644
index 0000000..0cb4ea4
--- /dev/null
+++ b/node_modules/arr-flatten/index.js
@@ -0,0 +1,22 @@
+/*!
+ * arr-flatten
+ *
+ * Copyright (c) 2014-2017, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+'use strict';
+
+module.exports = function (arr) {
+ return flat(arr, []);
+};
+
+function flat(arr, res) {
+ var i = 0, cur;
+ var len = arr.length;
+ for (; i < len; i++) {
+ cur = arr[i];
+ Array.isArray(cur) ? flat(cur, res) : res.push(cur);
+ }
+ return res;
+}
diff --git a/node_modules/arr-flatten/package.json b/node_modules/arr-flatten/package.json
new file mode 100644
index 0000000..74a89ca
--- /dev/null
+++ b/node_modules/arr-flatten/package.json
@@ -0,0 +1,119 @@
+{
+ "_args": [
+ [
+ "arr-flatten@1.1.0",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "arr-flatten@1.1.0",
+ "_id": "arr-flatten@1.1.0",
+ "_inBundle": false,
+ "_integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "_location": "/arr-flatten",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "arr-flatten@1.1.0",
+ "name": "arr-flatten",
+ "escapedName": "arr-flatten",
+ "rawSpec": "1.1.0",
+ "saveSpec": null,
+ "fetchSpec": "1.1.0"
+ },
+ "_requiredBy": [
+ "/arr-diff",
+ "/fast-glob/braces",
+ "/postcss-cli/braces"
+ ],
+ "_resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "_spec": "1.1.0",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Jon Schlinkert",
+ "url": "https://github.com/jonschlinkert"
+ },
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/arr-flatten/issues"
+ },
+ "contributors": [
+ {
+ "name": "Jon Schlinkert",
+ "url": "http://twitter.com/jonschlinkert"
+ },
+ {
+ "name": "Luke Edwards",
+ "url": "https://lukeed.com"
+ }
+ ],
+ "description": "Recursively flatten an array or arrays.",
+ "devDependencies": {
+ "ansi-bold": "^0.1.1",
+ "array-flatten": "^2.1.1",
+ "array-slice": "^1.0.0",
+ "benchmarked": "^1.0.0",
+ "compute-flatten": "^1.0.0",
+ "flatit": "^1.1.1",
+ "flatten": "^1.0.2",
+ "flatten-array": "^1.0.0",
+ "glob": "^7.1.1",
+ "gulp-format-md": "^0.1.12",
+ "just-flatten-it": "^1.1.23",
+ "lodash.flattendeep": "^4.4.0",
+ "m_flattened": "^1.0.1",
+ "mocha": "^3.2.0",
+ "utils-flatten": "^1.0.0",
+ "write": "^0.3.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/jonschlinkert/arr-flatten",
+ "keywords": [
+ "arr",
+ "array",
+ "elements",
+ "flat",
+ "flatten",
+ "nested",
+ "recurse",
+ "recursive",
+ "recursively"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "arr-flatten",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jonschlinkert/arr-flatten.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "verb": {
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "related": {
+ "list": [
+ "arr-filter",
+ "arr-union",
+ "array-each",
+ "array-unique"
+ ]
+ },
+ "lint": {
+ "reflinks": true
+ }
+ },
+ "version": "1.1.0"
+}
diff --git a/node_modules/arr-union/LICENSE b/node_modules/arr-union/LICENSE
new file mode 100644
index 0000000..39245ac
--- /dev/null
+++ b/node_modules/arr-union/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2016, Jon Schlinkert.
+
+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.
diff --git a/node_modules/arr-union/README.md b/node_modules/arr-union/README.md
new file mode 100644
index 0000000..b3cd4f4
--- /dev/null
+++ b/node_modules/arr-union/README.md
@@ -0,0 +1,99 @@
+# arr-union [![NPM version](https://img.shields.io/npm/v/arr-union.svg)](https://www.npmjs.com/package/arr-union) [![Build Status](https://img.shields.io/travis/jonschlinkert/arr-union.svg)](https://travis-ci.org/jonschlinkert/arr-union)
+
+> Combines a list of arrays, returning a single array with unique values, using strict equality for comparisons.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm i arr-union --save
+```
+
+## Benchmarks
+
+This library is **10-20 times faster** and more performant than [array-union](https://github.com/sindresorhus/array-union).
+
+See the [benchmarks](./benchmark).
+
+```sh
+#1: five-arrays
+ array-union x 511,121 ops/sec ±0.80% (96 runs sampled)
+ arr-union x 5,716,039 ops/sec ±0.86% (93 runs sampled)
+
+#2: ten-arrays
+ array-union x 245,196 ops/sec ±0.69% (94 runs sampled)
+ arr-union x 1,850,786 ops/sec ±0.84% (97 runs sampled)
+
+#3: two-arrays
+ array-union x 563,869 ops/sec ±0.97% (94 runs sampled)
+ arr-union x 9,602,852 ops/sec ±0.87% (92 runs sampled)
+```
+
+## Usage
+
+```js
+var union = require('arr-union');
+
+union(['a'], ['b', 'c'], ['d', 'e', 'f']);
+//=> ['a', 'b', 'c', 'd', 'e', 'f']
+```
+
+Returns only unique elements:
+
+```js
+union(['a', 'a'], ['b', 'c']);
+//=> ['a', 'b', 'c']
+```
+
+## Related projects
+
+* [arr-diff](https://www.npmjs.com/package/arr-diff): Returns an array with only the unique values from the first array, by excluding all… [more](https://www.npmjs.com/package/arr-diff) | [homepage](https://github.com/jonschlinkert/arr-diff)
+* [arr-filter](https://www.npmjs.com/package/arr-filter): Faster alternative to javascript's native filter method. | [homepage](https://github.com/jonschlinkert/arr-filter)
+* [arr-flatten](https://www.npmjs.com/package/arr-flatten): Recursively flatten an array or arrays. This is the fastest implementation of array flatten. | [homepage](https://github.com/jonschlinkert/arr-flatten)
+* [arr-map](https://www.npmjs.com/package/arr-map): Faster, node.js focused alternative to JavaScript's native array map. | [homepage](https://github.com/jonschlinkert/arr-map)
+* [arr-pluck](https://www.npmjs.com/package/arr-pluck): Retrieves the value of a specified property from all elements in the collection. | [homepage](https://github.com/jonschlinkert/arr-pluck)
+* [arr-reduce](https://www.npmjs.com/package/arr-reduce): Fast array reduce that also loops over sparse elements. | [homepage](https://github.com/jonschlinkert/arr-reduce)
+* [array-unique](https://www.npmjs.com/package/array-unique): Return an array free of duplicate values. Fastest ES5 implementation. | [homepage](https://github.com/jonschlinkert/array-unique)
+
+## Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/arr-union/issues/new).
+
+## Building docs
+
+Generate readme and API documentation with [verb](https://github.com/verbose/verb):
+
+```sh
+$ npm i verb && npm run docs
+```
+
+Or, if [verb](https://github.com/verbose/verb) is installed globally:
+
+```sh
+$ verb
+```
+
+## Running tests
+
+Install dev dependencies:
+
+```sh
+$ npm i -d && npm test
+```
+
+## Author
+
+**Jon Schlinkert**
+
+* [github/jonschlinkert](https://github.com/jonschlinkert)
+* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+## License
+
+Copyright © 2016 [Jon Schlinkert](https://github.com/jonschlinkert)
+Released under the [MIT license](https://github.com/jonschlinkert/arr-union/blob/master/LICENSE).
+
+***
+
+_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on February 23, 2016._
\ No newline at end of file
diff --git a/node_modules/arr-union/index.js b/node_modules/arr-union/index.js
new file mode 100644
index 0000000..5ae6c4a
--- /dev/null
+++ b/node_modules/arr-union/index.js
@@ -0,0 +1,29 @@
+'use strict';
+
+module.exports = function union(init) {
+ if (!Array.isArray(init)) {
+ throw new TypeError('arr-union expects the first argument to be an array.');
+ }
+
+ var len = arguments.length;
+ var i = 0;
+
+ while (++i < len) {
+ var arg = arguments[i];
+ if (!arg) continue;
+
+ if (!Array.isArray(arg)) {
+ arg = [arg];
+ }
+
+ for (var j = 0; j < arg.length; j++) {
+ var ele = arg[j];
+
+ if (init.indexOf(ele) >= 0) {
+ continue;
+ }
+ init.push(ele);
+ }
+ }
+ return init;
+};
diff --git a/node_modules/arr-union/package.json b/node_modules/arr-union/package.json
new file mode 100644
index 0000000..1330702
--- /dev/null
+++ b/node_modules/arr-union/package.json
@@ -0,0 +1,112 @@
+{
+ "_args": [
+ [
+ "arr-union@3.1.0",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "arr-union@3.1.0",
+ "_id": "arr-union@3.1.0",
+ "_inBundle": false,
+ "_integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "_location": "/arr-union",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "arr-union@3.1.0",
+ "name": "arr-union",
+ "escapedName": "arr-union",
+ "rawSpec": "3.1.0",
+ "saveSpec": null,
+ "fetchSpec": "3.1.0"
+ },
+ "_requiredBy": [
+ "/class-utils",
+ "/union-value"
+ ],
+ "_resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "_spec": "3.1.0",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Jon Schlinkert",
+ "url": "https://github.com/jonschlinkert"
+ },
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/arr-union/issues"
+ },
+ "description": "Combines a list of arrays, returning a single array with unique values, using strict equality for comparisons.",
+ "devDependencies": {
+ "ansi-bold": "^0.1.1",
+ "array-union": "^1.0.1",
+ "array-unique": "^0.2.1",
+ "benchmarked": "^0.1.4",
+ "gulp-format-md": "^0.1.7",
+ "minimist": "^1.1.1",
+ "mocha": "*",
+ "should": "*"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/jonschlinkert/arr-union",
+ "keywords": [
+ "add",
+ "append",
+ "array",
+ "arrays",
+ "combine",
+ "concat",
+ "extend",
+ "union",
+ "uniq",
+ "unique",
+ "util",
+ "utility",
+ "utils"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "arr-union",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jonschlinkert/arr-union.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "verb": {
+ "run": true,
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "related": {
+ "list": [
+ "arr-diff",
+ "arr-flatten",
+ "arr-filter",
+ "arr-map",
+ "arr-pluck",
+ "arr-reduce",
+ "array-unique"
+ ]
+ },
+ "reflinks": [
+ "verb",
+ "array-union"
+ ],
+ "lint": {
+ "reflinks": true
+ }
+ },
+ "version": "3.1.0"
+}
diff --git a/node_modules/array-filter/.npmignore b/node_modules/array-filter/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/array-filter/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/array-filter/.travis.yml b/node_modules/array-filter/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/node_modules/array-filter/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
diff --git a/node_modules/array-filter/README.md b/node_modules/array-filter/README.md
new file mode 100644
index 0000000..b6e417f
--- /dev/null
+++ b/node_modules/array-filter/README.md
@@ -0,0 +1,54 @@
+
+# array-filter
+
+`Array#filter` for older browsers.
+
+[![testling badge](https://ci.testling.com/juliangruber/array-filter.png)](https://ci.testling.com/juliangruber/array-filter)
+
+[![build status](https://secure.travis-ci.org/juliangruber/array-filter.png)](http://travis-ci.org/juliangruber/array-filter)
+
+## Usage
+
+```js
+var filter = require('array-filter');
+
+var array = [1, 2, 3];
+console.log(filter(array, function (el, i, arr) {
+ return false; // I throw it on the ground!
+}));
+// => []
+```
+
+## Installation
+
+With [npm](http://npmjs.org) do
+
+```bash
+$ npm install array-filter
+```
+
+Then bundle for the browser with [browserify](https://github.com/substack/browserify).
+
+## License
+
+(MIT)
+
+Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
+
+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.
diff --git a/node_modules/array-filter/index.js b/node_modules/array-filter/index.js
new file mode 100644
index 0000000..3db0422
--- /dev/null
+++ b/node_modules/array-filter/index.js
@@ -0,0 +1,19 @@
+/**
+ * Array#filter.
+ *
+ * @param {Array} arr
+ * @param {Function} fn
+ * @return {Array}
+ */
+
+module.exports = function (arr, fn) {
+ if (arr.filter) return arr.filter(fn);
+ var ret = [];
+ for (var i = 0; i < arr.length; i++) {
+ if (!hasOwn.call(arr, i)) continue;
+ if (fn(arr[i], i, arr)) ret.push(arr[i]);
+ }
+ return ret;
+};
+
+var hasOwn = Object.prototype.hasOwnProperty;
diff --git a/node_modules/array-filter/package.json b/node_modules/array-filter/package.json
new file mode 100644
index 0000000..9296a5a
--- /dev/null
+++ b/node_modules/array-filter/package.json
@@ -0,0 +1,79 @@
+{
+ "_args": [
+ [
+ "array-filter@0.0.1",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "array-filter@0.0.1",
+ "_id": "array-filter@0.0.1",
+ "_inBundle": false,
+ "_integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+ "_location": "/array-filter",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "array-filter@0.0.1",
+ "name": "array-filter",
+ "escapedName": "array-filter",
+ "rawSpec": "0.0.1",
+ "saveSpec": null,
+ "fetchSpec": "0.0.1"
+ },
+ "_requiredBy": [
+ "/shell-quote"
+ ],
+ "_resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "_spec": "0.0.1",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Julian Gruber",
+ "email": "mail@juliangruber.com",
+ "url": "http://juliangruber.com"
+ },
+ "bugs": {
+ "url": "https://github.com/juliangruber/array-filter/issues"
+ },
+ "dependencies": {},
+ "description": "Array#filter for older browsers.",
+ "devDependencies": {
+ "tape": "~2.3.2"
+ },
+ "homepage": "https://github.com/juliangruber/array-filter",
+ "keywords": [
+ "array",
+ "filter",
+ "browser",
+ "html",
+ "browserify"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "array-filter",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/juliangruber/array-filter.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/17..latest",
+ "firefox/nightly",
+ "chrome/22..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "version": "0.0.1"
+}
diff --git a/node_modules/array-filter/test/filter.js b/node_modules/array-filter/test/filter.js
new file mode 100644
index 0000000..d258681
--- /dev/null
+++ b/node_modules/array-filter/test/filter.js
@@ -0,0 +1,12 @@
+var filter = require('..');
+var test = require('tape');
+
+test('filter', function(t) {
+ var arr = [1, 2, 3, 4, 5];
+ delete arr.filter;
+ var even = filter(arr, function(el) {
+ return el % 2 == 0;
+ });
+ t.deepEqual(even, [2, 4]);
+ t.end();
+});
diff --git a/node_modules/array-filter/test/holes.js b/node_modules/array-filter/test/holes.js
new file mode 100644
index 0000000..117fa96
--- /dev/null
+++ b/node_modules/array-filter/test/holes.js
@@ -0,0 +1,12 @@
+var filter = require('..');
+var test = require('tape');
+
+test('skip over holes', function(t) {
+ var arr = new Array(5);
+ delete arr.filter;
+ var res = filter(arr, function(el) {
+ return false;
+ });
+ t.deepEqual(res, []);
+ t.end();
+});
diff --git a/node_modules/array-map/.travis.yml b/node_modules/array-map/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/node_modules/array-map/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
diff --git a/node_modules/array-map/LICENSE b/node_modules/array-map/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/array-map/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+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.
diff --git a/node_modules/array-map/example/map.js b/node_modules/array-map/example/map.js
new file mode 100644
index 0000000..64d9ead
--- /dev/null
+++ b/node_modules/array-map/example/map.js
@@ -0,0 +1,5 @@
+var map = require('../');
+var letters = map([97,98,99], function (c) {
+ return String.fromCharCode(c);
+});
+console.log(letters.join(''));
diff --git a/node_modules/array-map/index.js b/node_modules/array-map/index.js
new file mode 100644
index 0000000..d36c48d
--- /dev/null
+++ b/node_modules/array-map/index.js
@@ -0,0 +1,11 @@
+module.exports = function (xs, f) {
+ if (xs.map) return xs.map(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ var x = xs[i];
+ if (hasOwn.call(xs, i)) res.push(f(x, i, xs));
+ }
+ return res;
+};
+
+var hasOwn = Object.prototype.hasOwnProperty;
diff --git a/node_modules/array-map/package.json b/node_modules/array-map/package.json
new file mode 100644
index 0000000..7d58aa0
--- /dev/null
+++ b/node_modules/array-map/package.json
@@ -0,0 +1,81 @@
+{
+ "_args": [
+ [
+ "array-map@0.0.0",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "array-map@0.0.0",
+ "_id": "array-map@0.0.0",
+ "_inBundle": false,
+ "_integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+ "_location": "/array-map",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "array-map@0.0.0",
+ "name": "array-map",
+ "escapedName": "array-map",
+ "rawSpec": "0.0.0",
+ "saveSpec": null,
+ "fetchSpec": "0.0.0"
+ },
+ "_requiredBy": [
+ "/shell-quote"
+ ],
+ "_resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "_spec": "0.0.0",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/array-map/issues"
+ },
+ "description": "`[].map(f)` for older browsers",
+ "devDependencies": {
+ "tape": "~2.3.2"
+ },
+ "homepage": "https://github.com/substack/array-map",
+ "keywords": [
+ "array",
+ "map",
+ "browser",
+ "es5",
+ "shim",
+ "ie6",
+ "ie7",
+ "ie8"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "array-map",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/array-map.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/6..latest",
+ "firefox/3.5",
+ "firefox/latest",
+ "chrome/5",
+ "chrome/latest",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "version": "0.0.0"
+}
diff --git a/node_modules/array-map/readme.markdown b/node_modules/array-map/readme.markdown
new file mode 100644
index 0000000..7612274
--- /dev/null
+++ b/node_modules/array-map/readme.markdown
@@ -0,0 +1,46 @@
+# array-map
+
+`[].map(f)` for older browsers
+
+[![testling badge](https://ci.testling.com/substack/array-map.png)](https://ci.testling.com/substack/array-map)
+
+[![build status](https://secure.travis-ci.org/substack/array-map.png)](http://travis-ci.org/substack/array-map)
+
+# example
+
+``` js
+var map = require('array-map');
+var letters = map([97,98,99], function (c) {
+ return String.fromCharCode(c);
+});
+console.log(letters.join(''));
+```
+
+output:
+
+```
+abc
+```
+
+# methods
+
+``` js
+var map = require('array-map')
+```
+
+## var ys = map(xs, f)
+
+Create a new array `ys` by applying `f(xs[i], i, xs)` to each element in `xs` at
+index `i`.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install array-map
+```
+
+# license
+
+MIT
diff --git a/node_modules/array-map/test/map.js b/node_modules/array-map/test/map.js
new file mode 100644
index 0000000..8f50228
--- /dev/null
+++ b/node_modules/array-map/test/map.js
@@ -0,0 +1,77 @@
+var map = require('../');
+var test = require('tape');
+
+test('numbers -> letters', function (t) {
+ t.plan(2);
+ var a = map([97,98,99], function (c) {
+ return String.fromCharCode(c);
+ });
+ t.equal(a.join(''), 'abc');
+
+ var b = map(cripple([97,98,99]), function (c) {
+ return String.fromCharCode(c);
+ });
+ t.equal(b.join(''), 'abc');
+});
+
+test('elements and indexes', function (t) {
+ t.plan(8);
+ var x = { q: 5 }, y = 3, z = null;
+
+ t.deepEqual(
+ map([x,y,z], function (c, i) { return i }),
+ [ 0, 1, 2 ],
+ 'index check'
+ );
+ t.deepEqual(
+ map([x,y,z], function (c, i) { return i }),
+ [ 0, 1, 2 ],
+ 'crippled index check'
+ );
+
+ var xs0 = [ x, y, z ];
+ map(xs0, function (c, i, xs) {
+ t.strictEqual(xs, xs0, 'argument[2]');
+ });
+ var xs1 = [ x, y, z ];
+ map(xs1, function (c, i, xs) {
+ t.strictEqual(xs, xs1, 'crippled argument[2]');
+ });
+});
+
+test('ignore holes', function (t) {
+ t.plan(2);
+ t.deepEqual(
+ map(new Array(5), function (x) { return x }),
+ []
+ );
+ t.deepEqual(
+ map(cripple(new Array(5)), function (x) { return x }),
+ []
+ );
+});
+
+test('sparse map', function (t) {
+ t.plan(2);
+ var xs = new Array(5);
+ xs[2] = 'a';
+ xs[4] = 'b';
+ t.equal(
+ map(xs, function (x, i) { return x + i }).join(''),
+ 'a2b4'
+ );
+
+ var ys = new Array(5);
+ ys[2] = 'a';
+ ys[4] = 'b';
+ t.equal(
+ map(cripple(xs), function (x, i) { return x + i }).join(''),
+ 'a2b4'
+ );
+ t.end();
+});
+
+function cripple (xs) {
+ xs.map = undefined;
+ return xs;
+}
diff --git a/node_modules/array-reduce/.travis.yml b/node_modules/array-reduce/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/node_modules/array-reduce/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
diff --git a/node_modules/array-reduce/LICENSE b/node_modules/array-reduce/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/array-reduce/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+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.
diff --git a/node_modules/array-reduce/example/sum.js b/node_modules/array-reduce/example/sum.js
new file mode 100644
index 0000000..ede09c8
--- /dev/null
+++ b/node_modules/array-reduce/example/sum.js
@@ -0,0 +1,4 @@
+var reduce = require('../');
+var xs = [ 1, 2, 3, 4 ];
+var sum = reduce(xs, function (acc, x) { return acc + x }, 0);
+console.log(sum);
diff --git a/node_modules/array-reduce/index.js b/node_modules/array-reduce/index.js
new file mode 100644
index 0000000..2f35849
--- /dev/null
+++ b/node_modules/array-reduce/index.js
@@ -0,0 +1,18 @@
+var hasOwn = Object.prototype.hasOwnProperty;
+
+module.exports = function (xs, f, acc) {
+ var hasAcc = arguments.length >= 3;
+ if (hasAcc && xs.reduce) return xs.reduce(f, acc);
+ if (xs.reduce) return xs.reduce(f);
+
+ for (var i = 0; i < xs.length; i++) {
+ if (!hasOwn.call(xs, i)) continue;
+ if (!hasAcc) {
+ acc = xs[i];
+ hasAcc = true;
+ continue;
+ }
+ acc = f(acc, xs[i], i);
+ }
+ return acc;
+};
diff --git a/node_modules/array-reduce/package.json b/node_modules/array-reduce/package.json
new file mode 100644
index 0000000..3ae3899
--- /dev/null
+++ b/node_modules/array-reduce/package.json
@@ -0,0 +1,80 @@
+{
+ "_args": [
+ [
+ "array-reduce@0.0.0",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "array-reduce@0.0.0",
+ "_id": "array-reduce@0.0.0",
+ "_inBundle": false,
+ "_integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+ "_location": "/array-reduce",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "array-reduce@0.0.0",
+ "name": "array-reduce",
+ "escapedName": "array-reduce",
+ "rawSpec": "0.0.0",
+ "saveSpec": null,
+ "fetchSpec": "0.0.0"
+ },
+ "_requiredBy": [
+ "/shell-quote"
+ ],
+ "_resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "_spec": "0.0.0",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/array-reduce/issues"
+ },
+ "description": "`[].reduce()` for old browsers",
+ "devDependencies": {
+ "tape": "~2.3.2"
+ },
+ "homepage": "https://github.com/substack/array-reduce",
+ "keywords": [
+ "array",
+ "reduce",
+ "es5",
+ "ie6",
+ "ie7",
+ "ie8",
+ "fold"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "array-reduce",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/array-reduce.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/16..latest",
+ "firefox/nightly",
+ "chrome/22..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "version": "0.0.0"
+}
diff --git a/node_modules/array-reduce/readme.markdown b/node_modules/array-reduce/readme.markdown
new file mode 100644
index 0000000..395ab98
--- /dev/null
+++ b/node_modules/array-reduce/readme.markdown
@@ -0,0 +1,46 @@
+# array-reduce
+
+`[].reduce()` for old browsers
+
+[![testling badge](https://ci.testling.com/substack/array-reduce.png)](https://ci.testling.com/substack/array-reduce)
+
+[![build status](https://secure.travis-ci.org/substack/array-reduce.png)](http://travis-ci.org/substack/array-reduce)
+
+# example
+
+```
+var reduce = require('array-reduce');
+var xs = [ 1, 2, 3, 4 ];
+var sum = reduce(xs, function (acc, x) { return acc + x }, 0);
+console.log(sum);
+```
+
+output:
+
+```
+10
+```
+
+# methods
+
+``` js
+var reduce = require('array-reduce')
+```
+
+## var res = reduce(xs, f, init)
+
+Create a result `res` by folding `acc = f(acc, xs[i], i)` over each element in
+the array `xs` at element `i`. If `init` is given, the first `acc` value is
+`init`, otherwise `xs[0]` is used.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install array-reduce
+```
+
+# license
+
+MIT
diff --git a/node_modules/array-reduce/test/reduce.js b/node_modules/array-reduce/test/reduce.js
new file mode 100644
index 0000000..0014b98
--- /dev/null
+++ b/node_modules/array-reduce/test/reduce.js
@@ -0,0 +1,85 @@
+var reduce = require('../');
+var test = require('tape');
+
+test('numeric reduces', function (t) {
+ t.plan(6);
+
+ var xs = [ 1, 2, 3, 4 ];
+ t.equal(
+ reduce(xs, function (acc, x) { return acc + x }, 0),
+ 10
+ );
+ t.equal(
+ reduce(xs, function (acc, x) { return acc + x }, 100),
+ 110
+ );
+ t.equal(
+ reduce(xs, function (acc, x) { return acc + x }),
+ 10
+ );
+
+ var ys = cripple([ 1, 2, 3, 4 ]);
+ t.equal(
+ reduce(ys, function (acc, x) { return acc + x }, 0),
+ 10
+ );
+ t.equal(
+ reduce(ys, function (acc, x) { return acc + x }, 100),
+ 110
+ );
+ t.equal(
+ reduce(ys, function (acc, x) { return acc + x }),
+ 10
+ );
+});
+
+test('holes', function (t) {
+ t.plan(4);
+
+ var xs = Array(10);
+ xs[2] = 5; xs[4] = 6; xs[8] = 4;
+ t.equal(
+ reduce(xs, function (acc, x) { return acc + x }),
+ 15
+ );
+ t.equal(
+ reduce(xs, function (acc, x) { return acc + x }, 100),
+ 115
+ );
+
+ var ys = cripple(Array(10));
+ ys[2] = 5; ys[4] = 6; ys[8] = 4;
+ t.equal(
+ reduce(ys, function (acc, x) { return acc + x }),
+ 15
+ );
+ t.equal(
+ reduce(ys, function (acc, x) { return acc + x }, 100),
+ 115
+ );
+});
+
+test('object', function (t) {
+ t.plan(1);
+ var obj = { a: 3, b: 4, c: 5 };
+ var res = reduce(objectKeys(obj), function (acc, key) {
+ acc[key.toUpperCase()] = obj[key] * 111;
+ return acc;
+ }, {});
+ t.deepEqual(res, { A: 333, B: 444, C: 555 });
+});
+
+function cripple (xs) {
+ xs.reduce = undefined;
+ return xs;
+}
+
+var objectKeys = function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ if (hasOwn.call(obj, key)) keys.push(key);
+ }
+ return keys;
+};
+
+var hasOwn = Object.prototype.hasOwnProperty;
diff --git a/node_modules/array-union/index.js b/node_modules/array-union/index.js
new file mode 100644
index 0000000..e33f38a
--- /dev/null
+++ b/node_modules/array-union/index.js
@@ -0,0 +1,6 @@
+'use strict';
+var arrayUniq = require('array-uniq');
+
+module.exports = function () {
+ return arrayUniq([].concat.apply([], arguments));
+};
diff --git a/node_modules/array-union/license b/node_modules/array-union/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/array-union/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+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.
diff --git a/node_modules/array-union/package.json b/node_modules/array-union/package.json
new file mode 100644
index 0000000..a558071
--- /dev/null
+++ b/node_modules/array-union/package.json
@@ -0,0 +1,76 @@
+{
+ "_args": [
+ [
+ "array-union@1.0.2",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "array-union@1.0.2",
+ "_id": "array-union@1.0.2",
+ "_inBundle": false,
+ "_integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "_location": "/array-union",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "array-union@1.0.2",
+ "name": "array-union",
+ "escapedName": "array-union",
+ "rawSpec": "1.0.2",
+ "saveSpec": null,
+ "fetchSpec": "1.0.2"
+ },
+ "_requiredBy": [
+ "/globby"
+ ],
+ "_resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "_spec": "1.0.2",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/array-union/issues"
+ },
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "description": "Create an array of unique values, in order, from the input arrays",
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/sindresorhus/array-union#readme",
+ "keywords": [
+ "array",
+ "arr",
+ "set",
+ "uniq",
+ "unique",
+ "duplicate",
+ "remove",
+ "union",
+ "combine",
+ "merge"
+ ],
+ "license": "MIT",
+ "name": "array-union",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/array-union.git"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "version": "1.0.2"
+}
diff --git a/node_modules/array-union/readme.md b/node_modules/array-union/readme.md
new file mode 100644
index 0000000..ea472dd
--- /dev/null
+++ b/node_modules/array-union/readme.md
@@ -0,0 +1,28 @@
+# array-union [![Build Status](https://travis-ci.org/sindresorhus/array-union.svg?branch=master)](https://travis-ci.org/sindresorhus/array-union)
+
+> Create an array of unique values, in order, from the input arrays
+
+
+## Install
+
+```
+$ npm install --save array-union
+```
+
+
+## Usage
+
+```js
+const arrayUnion = require('array-union');
+
+arrayUnion([1, 1, 2, 3], [2, 3]);
+//=> [1, 2, 3]
+
+arrayUnion(['foo', 'foo', 'bar'], ['foo']);
+//=> ['foo', 'bar']
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/array-uniq/index.js b/node_modules/array-uniq/index.js
new file mode 100644
index 0000000..edd09f8
--- /dev/null
+++ b/node_modules/array-uniq/index.js
@@ -0,0 +1,62 @@
+'use strict';
+
+// there's 3 implementations written in increasing order of efficiency
+
+// 1 - no Set type is defined
+function uniqNoSet(arr) {
+ var ret = [];
+
+ for (var i = 0; i < arr.length; i++) {
+ if (ret.indexOf(arr[i]) === -1) {
+ ret.push(arr[i]);
+ }
+ }
+
+ return ret;
+}
+
+// 2 - a simple Set type is defined
+function uniqSet(arr) {
+ var seen = new Set();
+ return arr.filter(function (el) {
+ if (!seen.has(el)) {
+ seen.add(el);
+ return true;
+ }
+
+ return false;
+ });
+}
+
+// 3 - a standard Set type is defined and it has a forEach method
+function uniqSetWithForEach(arr) {
+ var ret = [];
+
+ (new Set(arr)).forEach(function (el) {
+ ret.push(el);
+ });
+
+ return ret;
+}
+
+// V8 currently has a broken implementation
+// https://github.com/joyent/node/issues/8449
+function doesForEachActuallyWork() {
+ var ret = false;
+
+ (new Set([true])).forEach(function (el) {
+ ret = el;
+ });
+
+ return ret === true;
+}
+
+if ('Set' in global) {
+ if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {
+ module.exports = uniqSetWithForEach;
+ } else {
+ module.exports = uniqSet;
+ }
+} else {
+ module.exports = uniqNoSet;
+}
diff --git a/node_modules/array-uniq/license b/node_modules/array-uniq/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/array-uniq/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+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.
diff --git a/node_modules/array-uniq/package.json b/node_modules/array-uniq/package.json
new file mode 100644
index 0000000..89392d5
--- /dev/null
+++ b/node_modules/array-uniq/package.json
@@ -0,0 +1,73 @@
+{
+ "_args": [
+ [
+ "array-uniq@1.0.3",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "array-uniq@1.0.3",
+ "_id": "array-uniq@1.0.3",
+ "_inBundle": false,
+ "_integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "_location": "/array-uniq",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "array-uniq@1.0.3",
+ "name": "array-uniq",
+ "escapedName": "array-uniq",
+ "rawSpec": "1.0.3",
+ "saveSpec": null,
+ "fetchSpec": "1.0.3"
+ },
+ "_requiredBy": [
+ "/array-union"
+ ],
+ "_resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "_spec": "1.0.3",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/array-uniq/issues"
+ },
+ "description": "Create an array without duplicates",
+ "devDependencies": {
+ "ava": "*",
+ "es6-set": "^0.1.0",
+ "require-uncached": "^1.0.2",
+ "xo": "*"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/sindresorhus/array-uniq#readme",
+ "keywords": [
+ "array",
+ "arr",
+ "set",
+ "uniq",
+ "unique",
+ "es6",
+ "duplicate",
+ "remove"
+ ],
+ "license": "MIT",
+ "name": "array-uniq",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/array-uniq.git"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "version": "1.0.3"
+}
diff --git a/node_modules/array-uniq/readme.md b/node_modules/array-uniq/readme.md
new file mode 100644
index 0000000..f0bd98c
--- /dev/null
+++ b/node_modules/array-uniq/readme.md
@@ -0,0 +1,30 @@
+# array-uniq [![Build Status](https://travis-ci.org/sindresorhus/array-uniq.svg?branch=master)](https://travis-ci.org/sindresorhus/array-uniq)
+
+> Create an array without duplicates
+
+It's already pretty fast, but will be much faster when [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) becomes available in V8 (especially with large arrays).
+
+
+## Install
+
+```
+$ npm install --save array-uniq
+```
+
+
+## Usage
+
+```js
+const arrayUniq = require('array-uniq');
+
+arrayUniq([1, 1, 2, 3, 3]);
+//=> [1, 2, 3]
+
+arrayUniq(['foo', 'foo', 'bar', 'foo']);
+//=> ['foo', 'bar']
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/array-unique/LICENSE b/node_modules/array-unique/LICENSE
new file mode 100644
index 0000000..fa30c4c
--- /dev/null
+++ b/node_modules/array-unique/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2015, Jon Schlinkert.
+
+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.
diff --git a/node_modules/array-unique/README.md b/node_modules/array-unique/README.md
new file mode 100644
index 0000000..2e28774
--- /dev/null
+++ b/node_modules/array-unique/README.md
@@ -0,0 +1,51 @@
+# array-unique [![NPM version](https://badge.fury.io/js/array-unique.svg)](http://badge.fury.io/js/array-unique) [![Build Status](https://travis-ci.org/jonschlinkert/array-unique.svg)](https://travis-ci.org/jonschlinkert/array-unique)
+
+> Return an array free of duplicate values. Fastest ES5 implementation.
+
+## Install with [npm](npmjs.org)
+
+```bash
+npm i array-unique --save
+```
+
+## Usage
+
+```js
+var unique = require('array-unique');
+
+unique(['a', 'b', 'c', 'c']);
+//=> ['a', 'b', 'c']
+```
+
+## Related
+* [arr-diff](https://github.com/jonschlinkert/arr-diff): Returns an array with only the unique values from the first array, by excluding all values from additional arrays using strict equality for comparisons.
+* [arr-union](https://github.com/jonschlinkert/arr-union): Returns an array of unique values using strict equality for comparisons.
+* [arr-flatten](https://github.com/jonschlinkert/arr-flatten): Recursively flatten an array or arrays. This is the fastest implementation of array flatten.
+* [arr-reduce](https://github.com/jonschlinkert/arr-reduce): Fast array reduce that also loops over sparse elements.
+* [arr-map](https://github.com/jonschlinkert/arr-map): Faster, node.js focused alternative to JavaScript's native array map.
+* [arr-pluck](https://github.com/jonschlinkert/arr-pluck): Retrieves the value of a specified property from all elements in the collection.
+
+## Run tests
+Install dev dependencies.
+
+```bash
+npm i -d && npm test
+```
+
+## Contributing
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/array-unique/issues)
+
+## Author
+
+**Jon Schlinkert**
+
++ [github/jonschlinkert](https://github.com/jonschlinkert)
++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+## License
+Copyright (c) 2015 Jon Schlinkert
+Released under the MIT license
+
+***
+
+_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on March 24, 2015._
\ No newline at end of file
diff --git a/node_modules/array-unique/index.js b/node_modules/array-unique/index.js
new file mode 100644
index 0000000..7fa75af
--- /dev/null
+++ b/node_modules/array-unique/index.js
@@ -0,0 +1,28 @@
+/*!
+ * array-unique
+ *
+ * Copyright (c) 2014-2015, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+'use strict';
+
+module.exports = function unique(arr) {
+ if (!Array.isArray(arr)) {
+ throw new TypeError('array-unique expects an array.');
+ }
+
+ var len = arr.length;
+ var i = -1;
+
+ while (i++ < len) {
+ var j = i + 1;
+
+ for (; j < arr.length; ++j) {
+ if (arr[i] === arr[j]) {
+ arr.splice(j--, 1);
+ }
+ }
+ }
+ return arr;
+};
diff --git a/node_modules/array-unique/package.json b/node_modules/array-unique/package.json
new file mode 100644
index 0000000..2bd3a6a
--- /dev/null
+++ b/node_modules/array-unique/package.json
@@ -0,0 +1,66 @@
+{
+ "_args": [
+ [
+ "array-unique@0.2.1",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "array-unique@0.2.1",
+ "_id": "array-unique@0.2.1",
+ "_inBundle": false,
+ "_integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "_location": "/array-unique",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "array-unique@0.2.1",
+ "name": "array-unique",
+ "escapedName": "array-unique",
+ "rawSpec": "0.2.1",
+ "saveSpec": null,
+ "fetchSpec": "0.2.1"
+ },
+ "_requiredBy": [
+ "/micromatch"
+ ],
+ "_resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "_spec": "0.2.1",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Jon Schlinkert",
+ "url": "https://github.com/jonschlinkert"
+ },
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/array-unique/issues"
+ },
+ "description": "Return an array free of duplicate values. Fastest ES5 implementation.",
+ "devDependencies": {
+ "array-uniq": "^1.0.2",
+ "benchmarked": "^0.1.3",
+ "mocha": "*",
+ "should": "*"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/jonschlinkert/array-unique",
+ "license": {
+ "type": "MIT",
+ "url": "https://github.com/jonschlinkert/array-unique/blob/master/LICENSE"
+ },
+ "main": "index.js",
+ "name": "array-unique",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/jonschlinkert/array-unique.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "version": "0.2.1"
+}
diff --git a/node_modules/arrify/index.js b/node_modules/arrify/index.js
new file mode 100644
index 0000000..2a2fdee
--- /dev/null
+++ b/node_modules/arrify/index.js
@@ -0,0 +1,8 @@
+'use strict';
+module.exports = function (val) {
+ if (val === null || val === undefined) {
+ return [];
+ }
+
+ return Array.isArray(val) ? val : [val];
+};
diff --git a/node_modules/arrify/license b/node_modules/arrify/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/arrify/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+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.
diff --git a/node_modules/arrify/package.json b/node_modules/arrify/package.json
new file mode 100644
index 0000000..69d14af
--- /dev/null
+++ b/node_modules/arrify/package.json
@@ -0,0 +1,69 @@
+{
+ "_args": [
+ [
+ "arrify@1.0.1",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "arrify@1.0.1",
+ "_id": "arrify@1.0.1",
+ "_inBundle": false,
+ "_integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "_location": "/arrify",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "arrify@1.0.1",
+ "name": "arrify",
+ "escapedName": "arrify",
+ "rawSpec": "1.0.1",
+ "saveSpec": null,
+ "fetchSpec": "1.0.1"
+ },
+ "_requiredBy": [
+ "/dir-glob"
+ ],
+ "_resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "_spec": "1.0.1",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/arrify/issues"
+ },
+ "description": "Convert a value to an array",
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/sindresorhus/arrify#readme",
+ "keywords": [
+ "array",
+ "arr",
+ "arrify",
+ "arrayify",
+ "convert",
+ "value"
+ ],
+ "license": "MIT",
+ "name": "arrify",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/arrify.git"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "version": "1.0.1"
+}
diff --git a/node_modules/arrify/readme.md b/node_modules/arrify/readme.md
new file mode 100644
index 0000000..183d075
--- /dev/null
+++ b/node_modules/arrify/readme.md
@@ -0,0 +1,36 @@
+# arrify [![Build Status](https://travis-ci.org/sindresorhus/arrify.svg?branch=master)](https://travis-ci.org/sindresorhus/arrify)
+
+> Convert a value to an array
+
+
+## Install
+
+```
+$ npm install --save arrify
+```
+
+
+## Usage
+
+```js
+const arrify = require('arrify');
+
+arrify('unicorn');
+//=> ['unicorn']
+
+arrify(['unicorn']);
+//=> ['unicorn']
+
+arrify(null);
+//=> []
+
+arrify(undefined);
+//=> []
+```
+
+*Supplying `null` or `undefined` results in an empty array.*
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/assign-symbols/LICENSE b/node_modules/assign-symbols/LICENSE
new file mode 100644
index 0000000..65f90ac
--- /dev/null
+++ b/node_modules/assign-symbols/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015, Jon Schlinkert.
+
+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.
diff --git a/node_modules/assign-symbols/README.md b/node_modules/assign-symbols/README.md
new file mode 100644
index 0000000..422729d
--- /dev/null
+++ b/node_modules/assign-symbols/README.md
@@ -0,0 +1,73 @@
+# assign-symbols [![NPM version](https://badge.fury.io/js/assign-symbols.svg)](http://badge.fury.io/js/assign-symbols)
+
+> Assign the enumerable es6 Symbol properties from an object (or objects) to the first object passed on the arguments. Can be used as a supplement to other extend, assign or merge methods as a polyfill for the Symbols part of the es6 Object.assign method.
+
+From the [Mozilla Developer docs for Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol):
+
+> A symbol is a unique and immutable data type and may be used as an identifier for object properties. The symbol object is an implicit object wrapper for the symbol primitive data type.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/)
+
+```sh
+$ npm i assign-symbols --save
+```
+
+## Usage
+
+```js
+var assignSymbols = require('assign-symbols');
+var obj = {};
+
+var one = {};
+var symbolOne = Symbol('aaa');
+one[symbolOne] = 'bbb';
+
+var two = {};
+var symbolTwo = Symbol('ccc');
+two[symbolTwo] = 'ddd';
+
+assignSymbols(obj, one, two);
+
+console.log(obj[symbolOne]);
+//=> 'bbb'
+console.log(obj[symbolTwo]);
+//=> 'ddd'
+```
+
+## Similar projects
+
+* [assign-deep](https://www.npmjs.com/package/assign-deep): Deeply assign the enumerable properties of source objects to a destination object. | [homepage](https://github.com/jonschlinkert/assign-deep)
+* [clone-deep](https://www.npmjs.com/package/clone-deep): Recursively (deep) clone JavaScript native types, like Object, Array, RegExp, Date as well as primitives. | [homepage](https://github.com/jonschlinkert/clone-deep)
+* [extend-shallow](https://www.npmjs.com/package/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. | [homepage](https://github.com/jonschlinkert/extend-shallow)
+* [merge-deep](https://www.npmjs.com/package/merge-deep): Recursively merge values in a javascript object. | [homepage](https://github.com/jonschlinkert/merge-deep)
+* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep)
+
+## Running tests
+
+Install dev dependencies:
+
+```sh
+$ npm i -d && npm test
+```
+
+## Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/assign-symbols/issues/new).
+
+## Author
+
+**Jon Schlinkert**
+
++ [github/jonschlinkert](https://github.com/jonschlinkert)
++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+## License
+
+Copyright © 2015 Jon Schlinkert
+Released under the MIT license.
+
+***
+
+_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on November 06, 2015._
\ No newline at end of file
diff --git a/node_modules/assign-symbols/index.js b/node_modules/assign-symbols/index.js
new file mode 100644
index 0000000..c08a232
--- /dev/null
+++ b/node_modules/assign-symbols/index.js
@@ -0,0 +1,40 @@
+/*!
+ * assign-symbols
+ *
+ * Copyright (c) 2015, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+'use strict';
+
+module.exports = function(receiver, objects) {
+ if (receiver === null || typeof receiver === 'undefined') {
+ throw new TypeError('expected first argument to be an object.');
+ }
+
+ if (typeof objects === 'undefined' || typeof Symbol === 'undefined') {
+ return receiver;
+ }
+
+ if (typeof Object.getOwnPropertySymbols !== 'function') {
+ return receiver;
+ }
+
+ var isEnumerable = Object.prototype.propertyIsEnumerable;
+ var target = Object(receiver);
+ var len = arguments.length, i = 0;
+
+ while (++i < len) {
+ var provider = Object(arguments[i]);
+ var names = Object.getOwnPropertySymbols(provider);
+
+ for (var j = 0; j < names.length; j++) {
+ var key = names[j];
+
+ if (isEnumerable.call(provider, key)) {
+ target[key] = provider[key];
+ }
+ }
+ }
+ return target;
+};
diff --git a/node_modules/assign-symbols/package.json b/node_modules/assign-symbols/package.json
new file mode 100644
index 0000000..6516ece
--- /dev/null
+++ b/node_modules/assign-symbols/package.json
@@ -0,0 +1,75 @@
+{
+ "_args": [
+ [
+ "assign-symbols@1.0.0",
+ "C:\\POC\\Natours"
+ ]
+ ],
+ "_development": true,
+ "_from": "assign-symbols@1.0.0",
+ "_id": "assign-symbols@1.0.0",
+ "_inBundle": false,
+ "_integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "_location": "/assign-symbols",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "assign-symbols@1.0.0",
+ "name": "assign-symbols",
+ "escapedName": "assign-symbols",
+ "rawSpec": "1.0.0",
+ "saveSpec": null,
+ "fetchSpec": "1.0.0"
+ },
+ "_requiredBy": [
+ "/extend-shallow"
+ ],
+ "_resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "_spec": "1.0.0",
+ "_where": "C:\\POC\\Natours",
+ "author": {
+ "name": "Jon Schlinkert",
+ "url": "https://github.com/jonschlinkert"
+ },
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/assign-symbols/issues"
+ },
+ "description": "Assign the enumerable es6 Symbol properties from an object (or objects) to the first object passed on the arguments. Can be used as a supplement to other extend, assign or merge methods as a polyfill for the Symbols part of the es6 Object.assign method.",
+ "devDependencies": {
+ "mocha": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "homepage": "https://github.com/jonschlinkert/assign-symbols",
+ "keywords": [
+ "assign",
+ "symbols"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "assign-symbols",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jonschlinkert/assign-symbols.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "verb": {
+ "related": {
+ "list": [
+ "assign-deep",
+ "mixin-deep",
+ "merge-deep",
+ "extend-shallow",
+ "clone-deep"
+ ]
+ }
+ },
+ "version": "1.0.0"
+}
diff --git a/node_modules/async-each/.npmignore b/node_modules/async-each/.npmignore
new file mode 100644
index 0000000..3887b2b
--- /dev/null
+++ b/node_modules/async-each/.npmignore
@@ -0,0 +1,3 @@
+bower.json
+component.json
+CHANGELOG.md
diff --git a/node_modules/async-each/CHANGELOG.md b/node_modules/async-each/CHANGELOG.md
new file mode 100644
index 0000000..bee2548
--- /dev/null
+++ b/node_modules/async-each/CHANGELOG.md
@@ -0,0 +1,23 @@
+# async-each 1.0.0 (26 November 2015)
+* Bumped version to 1.0.0 (no functional changes)
+
+# async-each 0.1.6 (5 November 2014)
+* Add license to package.json
+
+# async-each 0.1.5 (22 October 2014)
+* Clean up package.json to fix npm warning about `repo`
+
+# async-each 0.1.4 (12 November 2013)
+* Fixed AMD definition.
+
+# async-each 0.1.3 (25 July 2013)
+* Fixed double wrapping of errors.
+
+# async-each 0.1.2 (7 July 2013)
+* Fixed behaviour on empty arrays.
+
+# async-each 0.1.1 (14 June 2013)
+* Wrapped function in closure, enabled strict mode.
+
+# async-each 0.1.0 (14 June 2013)
+* Initial release.
diff --git a/node_modules/async-each/README.md b/node_modules/async-each/README.md
new file mode 100644
index 0000000..a79cbd7
--- /dev/null
+++ b/node_modules/async-each/README.md
@@ -0,0 +1,38 @@
+# async-each
+
+No-bullshit, ultra-simple, 35-lines-of-code async parallel forEach function for JavaScript.
+
+We don't need junky 30K async libs. Really.
+
+For browsers and node.js.
+
+## Installation
+* Just include async-each before your scripts.
+* `npm install async-each` if you’re using node.js.
+* `bower install async-each` if you’re using [Bower](http://bower.io).
+
+## Usage
+
+* `each(array, iterator, callback);` — `Array`, `Function`, `(optional) Function`
+* `iterator(item, next)` receives current item and a callback that will mark the item as done. `next` callback receives optional `error, transformedItem` arguments.
+* `callback(error, transformedArray)` optionally receives first error and transformed result `Array`.
+
+Node.js:
+
+```javascript
+var each = require('async-each');
+each(['a.js', 'b.js', 'c.js'], fs.readFile, function(error, contents) {
+ if (error) console.error(error);
+ console.log('Contents for a, b and c:', contents);
+});
+```
+
+Browser:
+
+```javascript
+window.asyncEach(list, fn, callback);
+```
+
+## License
+
+[The MIT License](https://raw.githubusercontent.com/paulmillr/mit/master/README.md)
diff --git a/node_modules/async-each/index.js b/node_modules/async-each/index.js
new file mode 100644
index 0000000..1c51c95
--- /dev/null
+++ b/node_modules/async-each/index.js
@@ -0,0 +1,38 @@
+// async-each MIT license (by Paul Miller from http://paulmillr.com).
+(function(globals) {
+ 'use strict';
+ var each = function(items, next, callback) {
+ if (!Array.isArray(items)) throw new TypeError('each() expects array as first argument');
+ if (typeof next !== 'function') throw new TypeError('each() expects function as second argument');
+ if (typeof callback !== 'function') callback = Function.prototype; // no-op
+
+ if (items.length === 0) return callback(undefined, items);
+
+ var transformed = new Array(items.length);
+ var count = 0;
+ var returned = false;
+
+ items.forEach(function(item, index) {
+ next(item, function(error, transformedItem) {
+ if (returned) return;
+ if (error) {
+ returned = true;
+ return callback(error);
+ }
+ transformed[index] = transformedItem;
+ count += 1;
+ if (count === items.length) return callback(undefined, transformed);
+ });
+ });
+ };
+
+ if (typeof define !== 'undefined' && define.amd) {
+ define([], function() {
+ return each;
+ }); // RequireJS
+ } else if (typeof module !== 'undefined' && module.exports) {
+ module.exports = each; // CommonJS
+ } else {
+ globals.asyncEach = each; //
+
+