├── .gitignore ├── .npmrc ├── Gruntfile.js ├── LICENSE ├── README.md ├── assets └── less │ ├── base.less │ ├── cards.less │ ├── lib │ └── bootstrap │ │ ├── mixins.less │ │ ├── mixins │ │ ├── alerts.less │ │ ├── background-variant.less │ │ ├── border-radius.less │ │ ├── buttons.less │ │ ├── center-block.less │ │ ├── clearfix.less │ │ ├── forms.less │ │ ├── gradients.less │ │ ├── grid-framework.less │ │ ├── grid.less │ │ ├── hide-text.less │ │ ├── image.less │ │ ├── labels.less │ │ ├── list-group.less │ │ ├── nav-divider.less │ │ ├── nav-vertical-align.less │ │ ├── opacity.less │ │ ├── pagination.less │ │ ├── panels.less │ │ ├── progress-bar.less │ │ ├── reset-filter.less │ │ ├── resize.less │ │ ├── responsive-visibility.less │ │ ├── size.less │ │ ├── tab-focus.less │ │ ├── table-row.less │ │ ├── text-emphasis.less │ │ ├── text-overflow.less │ │ └── vendor-prefixes.less │ │ └── variables.less │ ├── mixins.less │ ├── print.less │ ├── sections │ ├── references.less │ └── skills.less │ ├── theme.less │ ├── utilities.less │ └── variables.less ├── build.js ├── index.js ├── package.json ├── pnpm-lock.yaml ├── resume.hbs └── serve.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | resume.json 3 | *.log 4 | dist 5 | .DS_Store 6 | assets/css 7 | resume.json -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | node-linker=hoist 2 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | // Project Configuration 3 | grunt.initConfig({ 4 | pkg: grunt.file.readJSON('package.json'), 5 | less: { 6 | compile: { 7 | src: './assets/less/theme.less', 8 | dest: './assets/css/theme.css' 9 | } 10 | }, 11 | watch: { 12 | styles: { 13 | files: ['assets/less/**/*.less'], 14 | tasks: ['less'], 15 | options: { 16 | nospawn: true 17 | } 18 | } 19 | } 20 | }); 21 | 22 | // Load the plugin that compiles less to css 23 | grunt.loadNpmTasks('grunt-contrib-less'); 24 | 25 | // Load the plugin that watches file changes 26 | grunt.loadNpmTasks('grunt-contrib-watch'); 27 | 28 | // Default tasks 29 | grunt.registerTask('default', ['less']); 30 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Anthony Fu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Résumé d'antfu 2 | 3 | This is my Résumé generator. You can check out my Résumé [here](https://resume.antfu.me). 4 | 5 | The theme is heavy modified from [jsonresume-theme-kwan](https://github.com/icoloma/jsonresume-theme-kwan). 6 | 7 | ## How it works 8 | 9 | - The data is hosted by [Gist](https://gist.github.com/antfu/ceb04ede6daf195eaf51e32b6aef5d4e) with [JSON Resume](https://jsonresume.org/) standard. 10 | - The website is hosted by [Netlify](http://netlify.com/) with CI/CD. 11 | - HTML is generated with [Handlebars](https://handlebarsjs.com/) and PDF is printed with [puppeteer](https://github.com/puppeteer/puppeteer/). 12 | 13 | > Note: I did a lot quick hacks to make it suitable for my design, which may not be good to be general used as a theme. While I may not have time to improve it, PRs are great welcome! 14 | 15 | ## License 16 | 17 | The script is licensed with MIT. 18 | -------------------------------------------------------------------------------- /assets/less/base.less: -------------------------------------------------------------------------------- 1 | @import "variables"; 2 | @import "mixins"; 3 | 4 | body { 5 | font-family: @font-family-sans-serif; 6 | color: @theme-font-color; 7 | font-size: @font-size-base; 8 | } 9 | 10 | .text-bolder { 11 | font-weight: bold; 12 | } 13 | 14 | .enumeration:last-child:after { 15 | content: '' !important; 16 | } 17 | 18 | .name-and-profession { 19 | .name { 20 | font-size: 2.8rem; 21 | margin-bottom: 0; 22 | } 23 | .job { 24 | margin-bottom: 0.5rem; 25 | } 26 | } 27 | 28 | @media only screen { 29 | .container { 30 | display: grid; 31 | grid-template-columns: auto 15fr 50fr auto; 32 | .page { 33 | max-width: 50em; 34 | } 35 | } 36 | } 37 | 38 | @media (max-width: @screen-tablet) { 39 | ul { 40 | padding-left: 25px; 41 | } 42 | .container { 43 | display: block; 44 | } 45 | .card { 46 | padding: 1em !important; 47 | } 48 | .background-details { 49 | display: block; 50 | 51 | .icon { 52 | max-width: inherit; 53 | min-width: inherit; 54 | text-align: left; 55 | } 56 | 57 | .icon, 58 | .info { 59 | display: block; 60 | padding: 10px 0; 61 | } 62 | 63 | .title { 64 | display: none; 65 | } 66 | } 67 | .card-nested { 68 | padding: 5px 0; 69 | } 70 | } 71 | 72 | -------------------------------------------------------------------------------- /assets/less/cards.less: -------------------------------------------------------------------------------- 1 | .profile-card { 2 | width: 100%; 3 | text-align: left; 4 | } 5 | 6 | .profile-pic { 7 | display: block; 8 | padding: 1rem; 9 | } 10 | 11 | .profile-pic img { 12 | width: 100px; 13 | height: 100px; 14 | } 15 | 16 | .contact-details { 17 | .detail { 18 | display: block; 19 | line-height: 2; 20 | 21 | .icon { 22 | padding-right: 7px; 23 | color: #888; 24 | } 25 | 26 | .info { 27 | font-size: 0.8em; 28 | } 29 | } 30 | } 31 | 32 | .social-links { 33 | margin-top: 1.5rem; 34 | } 35 | 36 | .social-link { 37 | padding: 0 0.6rem; 38 | color: inherit; 39 | opacity: 0.7; 40 | 41 | &:hover, 42 | &:focus { 43 | opacity: 1; 44 | } 45 | 46 | &:first-child { 47 | padding-left: 0; 48 | } 49 | 50 | &:last-child { 51 | padding-right: 0; 52 | } 53 | 54 | & > * { 55 | vertical-align: middle; 56 | } 57 | } 58 | 59 | a { 60 | color: inherit; 61 | text-decoration: none; 62 | 63 | &:not(.icon) { 64 | border-bottom: 1px dashed #0005; 65 | } 66 | &:hover, 67 | &:focus { 68 | text-decoration: none; 69 | } 70 | } 71 | 72 | .background-card h4 { 73 | line-height: 1.2; 74 | font-size: 1em; 75 | 76 | .title { 77 | background: black !important; 78 | color: white !important; 79 | display: inline-block; 80 | padding: 2px 12px 0 3px; 81 | font-weight: bold; 82 | } 83 | 84 | &:not(:first-child) { 85 | margin-top: 2em; 86 | } 87 | } 88 | 89 | @iconWidth: 4rem; 90 | 91 | .content { 92 | line-height: 1.5; 93 | } 94 | 95 | .card { 96 | background: @card-bg; 97 | padding: 2em 3.5em; 98 | } 99 | 100 | .card-nested { 101 | padding: 0.8rem 0 0.8rem 2rem; 102 | 103 | &.relax { 104 | padding-top: 1.5rem; 105 | padding-bottom: 1.5rem; 106 | } 107 | } 108 | 109 | .card-wrapper { 110 | padding: 5px; 111 | } 112 | 113 | .enumeration:not(:last-child):after { 114 | content: ", "; 115 | } 116 | .enumeration:last-child:after { 117 | content: "."; 118 | } 119 | 120 | .github-stars { 121 | opacity: 0.6; 122 | font-size: 0.9em; 123 | } 124 | 125 | .projects { 126 | padding: 1rem 0; 127 | .text-muted { 128 | margin-bottom: 0.4rem; 129 | } 130 | .icon { 131 | margin-right: 2px; 132 | } 133 | } 134 | 135 | .px10 { 136 | height: 10px; 137 | } 138 | 139 | .skill-table { 140 | display: grid; 141 | grid-template-columns: max-content auto; 142 | grid-gap: 1.5rem 1rem; 143 | 144 | .name { 145 | font-weight: bold; 146 | text-align: right; 147 | } 148 | } 149 | 150 | .project-table { 151 | display: grid; 152 | grid-template-columns: 1fr 1fr; 153 | grid-gap: 1rem 1rem; 154 | } 155 | 156 | .print-only { 157 | display: none; 158 | } 159 | 160 | @media only screen and (max-width: @screen-tablet) { 161 | .profile-card, 162 | .contact-details, 163 | .profile-pic { 164 | display: block; 165 | text-align: center; 166 | } 167 | .card-nested { 168 | padding-left: 0; 169 | } 170 | .project-table { 171 | display: block; 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------------------------------- 3 | 4 | // Utilities 5 | @import "mixins/hide-text.less"; 6 | @import "mixins/opacity.less"; 7 | @import "mixins/image.less"; 8 | @import "mixins/labels.less"; 9 | @import "mixins/reset-filter.less"; 10 | @import "mixins/resize.less"; 11 | @import "mixins/responsive-visibility.less"; 12 | @import "mixins/size.less"; 13 | @import "mixins/tab-focus.less"; 14 | @import "mixins/text-emphasis.less"; 15 | @import "mixins/text-overflow.less"; 16 | @import "mixins/vendor-prefixes.less"; 17 | 18 | // Components 19 | @import "mixins/alerts.less"; 20 | @import "mixins/buttons.less"; 21 | @import "mixins/panels.less"; 22 | @import "mixins/pagination.less"; 23 | @import "mixins/list-group.less"; 24 | @import "mixins/nav-divider.less"; 25 | @import "mixins/forms.less"; 26 | @import "mixins/progress-bar.less"; 27 | @import "mixins/table-row.less"; 28 | 29 | // Skins 30 | @import "mixins/background-variant.less"; 31 | @import "mixins/border-radius.less"; 32 | @import "mixins/gradients.less"; 33 | 34 | // Layout 35 | @import "mixins/clearfix.less"; 36 | @import "mixins/center-block.less"; 37 | @import "mixins/nav-vertical-align.less"; 38 | @import "mixins/grid-framework.less"; 39 | @import "mixins/grid.less"; 40 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins/alerts.less: -------------------------------------------------------------------------------- 1 | // Alerts 2 | 3 | .alert-variant(@background; @border; @text-color) { 4 | background-color: @background; 5 | border-color: @border; 6 | color: @text-color; 7 | 8 | hr { 9 | border-top-color: darken(@border, 5%); 10 | } 11 | .alert-link { 12 | color: darken(@text-color, 10%); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins/background-variant.less: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | .bg-variant(@color) { 4 | background-color: @color; 5 | a&:hover { 6 | background-color: darken(@color, 10%); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins/border-radius.less: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | .border-top-radius(@radius) { 4 | border-top-right-radius: @radius; 5 | border-top-left-radius: @radius; 6 | } 7 | .border-right-radius(@radius) { 8 | border-bottom-right-radius: @radius; 9 | border-top-right-radius: @radius; 10 | } 11 | .border-bottom-radius(@radius) { 12 | border-bottom-right-radius: @radius; 13 | border-bottom-left-radius: @radius; 14 | } 15 | .border-left-radius(@radius) { 16 | border-bottom-left-radius: @radius; 17 | border-top-left-radius: @radius; 18 | } 19 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins/buttons.less: -------------------------------------------------------------------------------- 1 | // Button variants 2 | // 3 | // Easily pump out default styles, as well as :hover, :focus, :active, 4 | // and disabled options for all buttons 5 | 6 | .button-variant(@color; @background; @border) { 7 | color: @color; 8 | background-color: @background; 9 | border-color: @border; 10 | 11 | &:hover, 12 | &:focus, 13 | &:active, 14 | &.active, 15 | .open > .dropdown-toggle& { 16 | color: @color; 17 | background-color: darken(@background, 10%); 18 | border-color: darken(@border, 12%); 19 | } 20 | &:active, 21 | &.active, 22 | .open > .dropdown-toggle& { 23 | background-image: none; 24 | } 25 | &.disabled, 26 | &[disabled], 27 | fieldset[disabled] & { 28 | &, 29 | &:hover, 30 | &:focus, 31 | &:active, 32 | &.active { 33 | background-color: @background; 34 | border-color: @border; 35 | } 36 | } 37 | 38 | .badge { 39 | color: @background; 40 | background-color: @color; 41 | } 42 | } 43 | 44 | // Button sizes 45 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 46 | padding: @padding-vertical @padding-horizontal; 47 | font-size: @font-size; 48 | line-height: @line-height; 49 | border-radius: @border-radius; 50 | } 51 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins/center-block.less: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | .center-block() { 4 | display: block; 5 | margin-left: auto; 6 | margin-right: auto; 7 | } 8 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins/clearfix.less: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | .clearfix() { 14 | &:before, 15 | &:after { 16 | content: " "; // 1 17 | display: table; // 2 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /assets/less/lib/bootstrap/mixins/forms.less: -------------------------------------------------------------------------------- 1 | // Form validation states 2 | // 3 | // Used in forms.less to generate the form validation CSS for warnings, errors, 4 | // and successes. 5 | 6 | .form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { 7 | // Color the label and help text 8 | .help-block, 9 | .control-label, 10 | .radio, 11 | .checkbox, 12 | .radio-inline, 13 | .checkbox-inline { 14 | color: @text-color; 15 | } 16 | // Set the border and box shadow on specific inputs to match 17 | .form-control { 18 | border-color: @border-color; 19 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work 20 | &:focus { 21 | border-color: darken(@border-color, 10%); 22 | @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); 23 | .box-shadow(@shadow); 24 | } 25 | } 26 | // Set validation states also for addons 27 | .input-group-addon { 28 | color: @text-color; 29 | border-color: @border-color; 30 | background-color: @background-color; 31 | } 32 | // Optional feedback icon 33 | .form-control-feedback { 34 | color: @text-color; 35 | } 36 | } 37 | 38 | 39 | // Form control focus state 40 | // 41 | // Generate a customized focus state and for any input with the specified color, 42 | // which defaults to the `@input-border-focus` variable. 43 | // 44 | // We highly encourage you to not customize the default value, but instead use 45 | // this to tweak colors on an as-needed basis. This aesthetic change is based on 46 | // WebKit's default styles, but applicable to a wider range of browsers. Its 47 | // usability and accessibility should be taken into account with any change. 48 | // 49 | // Example usage: change the default blue border and shadow to white for better 50 | // contrast against a dark gray background. 51 | .form-control-focus(@color: @input-border-focus) { 52 | @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); 53 | &:focus { 54 | border-color: @color; 55 | outline: 0; 56 | .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); 57 | } 58 | } 59 | 60 | // Form control sizing 61 | // 62 | // Relative text size, padding, and border-radii changes for form controls. For 63 | // horizontal sizing, wrap controls in the predefined grid classes. `` background color 176 | @input-bg: #fff; 177 | //** `` background color 178 | @input-bg-disabled: @gray-lighter; 179 | 180 | //** Text color for ``s 181 | @input-color: @gray; 182 | //** `` border color 183 | @input-border: #ccc; 184 | //** `` border radius 185 | @input-border-radius: @border-radius-base; 186 | //** Border color for inputs on focus 187 | @input-border-focus: #66afe9; 188 | 189 | //** Placeholder text color 190 | @input-color-placeholder: @gray-light; 191 | 192 | //** Default `.form-control` height 193 | @input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); 194 | //** Large `.form-control` height 195 | @input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); 196 | //** Small `.form-control` height 197 | @input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); 198 | 199 | @legend-color: @gray-dark; 200 | @legend-border-color: #e5e5e5; 201 | 202 | //** Background color for textual input addons 203 | @input-group-addon-bg: @gray-lighter; 204 | //** Border color for textual input addons 205 | @input-group-addon-border-color: @input-border; 206 | 207 | 208 | //== Dropdowns 209 | // 210 | //## Dropdown menu container and contents. 211 | 212 | //** Background for the dropdown menu. 213 | @dropdown-bg: #fff; 214 | //** Dropdown menu `border-color`. 215 | @dropdown-border: rgba(0,0,0,.15); 216 | //** Dropdown menu `border-color` **for IE8**. 217 | @dropdown-fallback-border: #ccc; 218 | //** Divider color for between dropdown items. 219 | @dropdown-divider-bg: #e5e5e5; 220 | 221 | //** Dropdown link text color. 222 | @dropdown-link-color: @gray-dark; 223 | //** Hover color for dropdown links. 224 | @dropdown-link-hover-color: darken(@gray-dark, 5%); 225 | //** Hover background for dropdown links. 226 | @dropdown-link-hover-bg: #f5f5f5; 227 | 228 | //** Active dropdown menu item text color. 229 | @dropdown-link-active-color: @component-active-color; 230 | //** Active dropdown menu item background color. 231 | @dropdown-link-active-bg: @component-active-bg; 232 | 233 | //** Disabled dropdown menu item background color. 234 | @dropdown-link-disabled-color: @gray-light; 235 | 236 | //** Text color for headers within dropdown menus. 237 | @dropdown-header-color: @gray-light; 238 | 239 | //** Deprecated `@dropdown-caret-color` as of v3.1.0 240 | @dropdown-caret-color: #000; 241 | 242 | 243 | //-- Z-index master list 244 | // 245 | // Warning: Avoid customizing these values. They're used for a bird's eye view 246 | // of components dependent on the z-axis and are designed to all work together. 247 | // 248 | // Note: These variables are not generated into the Customizer. 249 | 250 | @zindex-navbar: 1000; 251 | @zindex-dropdown: 1000; 252 | @zindex-popover: 1060; 253 | @zindex-tooltip: 1070; 254 | @zindex-navbar-fixed: 1030; 255 | @zindex-modal-background: 1040; 256 | @zindex-modal: 1050; 257 | 258 | 259 | //== Media queries breakpoints 260 | // 261 | //## Define the breakpoints at which your layout will change, adapting to different screen sizes. 262 | 263 | // Extra small screen / phone 264 | //** Deprecated `@screen-xs` as of v3.0.1 265 | @screen-xs: 480px; 266 | //** Deprecated `@screen-xs-min` as of v3.2.0 267 | @screen-xs-min: @screen-xs; 268 | //** Deprecated `@screen-phone` as of v3.0.1 269 | @screen-phone: @screen-xs-min; 270 | 271 | // Small screen / tablet 272 | //** Deprecated `@screen-sm` as of v3.0.1 273 | @screen-sm: 768px; 274 | @screen-sm-min: @screen-sm; 275 | //** Deprecated `@screen-tablet` as of v3.0.1 276 | @screen-tablet: @screen-sm-min; 277 | 278 | // Medium screen / desktop 279 | //** Deprecated `@screen-md` as of v3.0.1 280 | @screen-md: 992px; 281 | @screen-md-min: @screen-md; 282 | //** Deprecated `@screen-desktop` as of v3.0.1 283 | @screen-desktop: @screen-md-min; 284 | 285 | // Large screen / wide desktop 286 | //** Deprecated `@screen-lg` as of v3.0.1 287 | @screen-lg: 1200px; 288 | @screen-lg-min: @screen-lg; 289 | //** Deprecated `@screen-lg-desktop` as of v3.0.1 290 | @screen-lg-desktop: @screen-lg-min; 291 | 292 | // So media queries don't overlap when required, provide a maximum 293 | @screen-xs-max: (@screen-sm-min - 1); 294 | @screen-sm-max: (@screen-md-min - 1); 295 | @screen-md-max: (@screen-lg-min - 1); 296 | 297 | 298 | //== Grid system 299 | // 300 | //## Define your custom responsive grid. 301 | 302 | //** Number of columns in the grid. 303 | @grid-columns: 12; 304 | //** Padding between columns. Gets divided in half for the left and right. 305 | @grid-gutter-width: 30px; 306 | // Navbar collapse 307 | //** Point at which the navbar becomes uncollapsed. 308 | @grid-float-breakpoint: @screen-sm-min; 309 | //** Point at which the navbar begins collapsing. 310 | @grid-float-breakpoint-max: (@grid-float-breakpoint - 1); 311 | 312 | 313 | //== Container sizes 314 | // 315 | //## Define the maximum width of `.container` for different screen sizes. 316 | 317 | // Small screen / tablet 318 | @container-tablet: ((720px + @grid-gutter-width)); 319 | //** For `@screen-sm-min` and up. 320 | @container-sm: @container-tablet; 321 | 322 | // Medium screen / desktop 323 | @container-desktop: ((940px + @grid-gutter-width)); 324 | //** For `@screen-md-min` and up. 325 | @container-md: @container-desktop; 326 | 327 | // Large screen / wide desktop 328 | @container-large-desktop: ((1140px + @grid-gutter-width)); 329 | //** For `@screen-lg-min` and up. 330 | @container-lg: @container-large-desktop; 331 | 332 | 333 | //== Navbar 334 | // 335 | //## 336 | 337 | // Basics of a navbar 338 | @navbar-height: 50px; 339 | @navbar-margin-bottom: @line-height-computed; 340 | @navbar-border-radius: @border-radius-base; 341 | @navbar-padding-horizontal: floor((@grid-gutter-width / 2)); 342 | @navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); 343 | @navbar-collapse-max-height: 340px; 344 | 345 | @navbar-default-color: #777; 346 | @navbar-default-bg: #f8f8f8; 347 | @navbar-default-border: darken(@navbar-default-bg, 6.5%); 348 | 349 | // Navbar links 350 | @navbar-default-link-color: #777; 351 | @navbar-default-link-hover-color: #333; 352 | @navbar-default-link-hover-bg: transparent; 353 | @navbar-default-link-active-color: #555; 354 | @navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%); 355 | @navbar-default-link-disabled-color: #ccc; 356 | @navbar-default-link-disabled-bg: transparent; 357 | 358 | // Navbar brand label 359 | @navbar-default-brand-color: @navbar-default-link-color; 360 | @navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%); 361 | @navbar-default-brand-hover-bg: transparent; 362 | 363 | // Navbar toggle 364 | @navbar-default-toggle-hover-bg: #ddd; 365 | @navbar-default-toggle-icon-bar-bg: #888; 366 | @navbar-default-toggle-border-color: #ddd; 367 | 368 | 369 | // Inverted navbar 370 | // Reset inverted navbar basics 371 | @navbar-inverse-color: @gray-light; 372 | @navbar-inverse-bg: #222; 373 | @navbar-inverse-border: darken(@navbar-inverse-bg, 10%); 374 | 375 | // Inverted navbar links 376 | @navbar-inverse-link-color: @gray-light; 377 | @navbar-inverse-link-hover-color: #fff; 378 | @navbar-inverse-link-hover-bg: transparent; 379 | @navbar-inverse-link-active-color: @navbar-inverse-link-hover-color; 380 | @navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%); 381 | @navbar-inverse-link-disabled-color: #444; 382 | @navbar-inverse-link-disabled-bg: transparent; 383 | 384 | // Inverted navbar brand label 385 | @navbar-inverse-brand-color: @navbar-inverse-link-color; 386 | @navbar-inverse-brand-hover-color: #fff; 387 | @navbar-inverse-brand-hover-bg: transparent; 388 | 389 | // Inverted navbar toggle 390 | @navbar-inverse-toggle-hover-bg: #333; 391 | @navbar-inverse-toggle-icon-bar-bg: #fff; 392 | @navbar-inverse-toggle-border-color: #333; 393 | 394 | 395 | //== Navs 396 | // 397 | //## 398 | 399 | //=== Shared nav styles 400 | @nav-link-padding: 10px 15px; 401 | @nav-link-hover-bg: @gray-lighter; 402 | 403 | @nav-disabled-link-color: @gray-light; 404 | @nav-disabled-link-hover-color: @gray-light; 405 | 406 | @nav-open-link-hover-color: #fff; 407 | 408 | //== Tabs 409 | @nav-tabs-border-color: #ddd; 410 | 411 | @nav-tabs-link-hover-border-color: @gray-lighter; 412 | 413 | @nav-tabs-active-link-hover-bg: @body-bg; 414 | @nav-tabs-active-link-hover-color: @gray; 415 | @nav-tabs-active-link-hover-border-color: #ddd; 416 | 417 | @nav-tabs-justified-link-border-color: #ddd; 418 | @nav-tabs-justified-active-link-border-color: @body-bg; 419 | 420 | //== Pills 421 | @nav-pills-border-radius: @border-radius-base; 422 | @nav-pills-active-link-hover-bg: @component-active-bg; 423 | @nav-pills-active-link-hover-color: @component-active-color; 424 | 425 | 426 | //== Pagination 427 | // 428 | //## 429 | 430 | @pagination-color: @link-color; 431 | @pagination-bg: #fff; 432 | @pagination-border: #ddd; 433 | 434 | @pagination-hover-color: @link-hover-color; 435 | @pagination-hover-bg: @gray-lighter; 436 | @pagination-hover-border: #ddd; 437 | 438 | @pagination-active-color: #fff; 439 | @pagination-active-bg: @brand-primary; 440 | @pagination-active-border: @brand-primary; 441 | 442 | @pagination-disabled-color: @gray-light; 443 | @pagination-disabled-bg: #fff; 444 | @pagination-disabled-border: #ddd; 445 | 446 | 447 | //== Pager 448 | // 449 | //## 450 | 451 | @pager-bg: @pagination-bg; 452 | @pager-border: @pagination-border; 453 | @pager-border-radius: 15px; 454 | 455 | @pager-hover-bg: @pagination-hover-bg; 456 | 457 | @pager-active-bg: @pagination-active-bg; 458 | @pager-active-color: @pagination-active-color; 459 | 460 | @pager-disabled-color: @pagination-disabled-color; 461 | 462 | 463 | //== Jumbotron 464 | // 465 | //## 466 | 467 | @jumbotron-padding: 30px; 468 | @jumbotron-color: inherit; 469 | @jumbotron-bg: @gray-lighter; 470 | @jumbotron-heading-color: inherit; 471 | @jumbotron-font-size: ceil((@font-size-base * 1.5)); 472 | 473 | 474 | //== Form states and alerts 475 | // 476 | //## Define colors for form feedback states and, by default, alerts. 477 | 478 | @state-success-text: #3c763d; 479 | @state-success-bg: #dff0d8; 480 | @state-success-border: darken(spin(@state-success-bg, -10), 5%); 481 | 482 | @state-info-text: #31708f; 483 | @state-info-bg: #d9edf7; 484 | @state-info-border: darken(spin(@state-info-bg, -10), 7%); 485 | 486 | @state-warning-text: #8a6d3b; 487 | @state-warning-bg: #fcf8e3; 488 | @state-warning-border: darken(spin(@state-warning-bg, -10), 5%); 489 | 490 | @state-danger-text: #a94442; 491 | @state-danger-bg: #f2dede; 492 | @state-danger-border: darken(spin(@state-danger-bg, -10), 5%); 493 | 494 | 495 | //== Tooltips 496 | // 497 | //## 498 | 499 | //** Tooltip max width 500 | @tooltip-max-width: 200px; 501 | //** Tooltip text color 502 | @tooltip-color: #fff; 503 | //** Tooltip background color 504 | @tooltip-bg: #000; 505 | @tooltip-opacity: .9; 506 | 507 | //** Tooltip arrow width 508 | @tooltip-arrow-width: 5px; 509 | //** Tooltip arrow color 510 | @tooltip-arrow-color: @tooltip-bg; 511 | 512 | 513 | //== Popovers 514 | // 515 | //## 516 | 517 | //** Popover body background color 518 | @popover-bg: #fff; 519 | //** Popover maximum width 520 | @popover-max-width: 276px; 521 | //** Popover border color 522 | @popover-border-color: rgba(0,0,0,.2); 523 | //** Popover fallback border color 524 | @popover-fallback-border-color: #ccc; 525 | 526 | //** Popover title background color 527 | @popover-title-bg: darken(@popover-bg, 3%); 528 | 529 | //** Popover arrow width 530 | @popover-arrow-width: 10px; 531 | //** Popover arrow color 532 | @popover-arrow-color: #fff; 533 | 534 | //** Popover outer arrow width 535 | @popover-arrow-outer-width: (@popover-arrow-width + 1); 536 | //** Popover outer arrow color 537 | @popover-arrow-outer-color: fadein(@popover-border-color, 5%); 538 | //** Popover outer arrow fallback color 539 | @popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%); 540 | 541 | 542 | //== Labels 543 | // 544 | //## 545 | 546 | //** Default label background color 547 | @label-default-bg: @gray-light; 548 | //** Primary label background color 549 | @label-primary-bg: @brand-primary; 550 | //** Success label background color 551 | @label-success-bg: @brand-success; 552 | //** Info label background color 553 | @label-info-bg: @brand-info; 554 | //** Warning label background color 555 | @label-warning-bg: @brand-warning; 556 | //** Danger label background color 557 | @label-danger-bg: @brand-danger; 558 | 559 | //** Default label text color 560 | @label-color: #fff; 561 | //** Default text color of a linked label 562 | @label-link-hover-color: #fff; 563 | 564 | 565 | //== Modals 566 | // 567 | //## 568 | 569 | //** Padding applied to the modal body 570 | @modal-inner-padding: 15px; 571 | 572 | //** Padding applied to the modal title 573 | @modal-title-padding: 15px; 574 | //** Modal title line-height 575 | @modal-title-line-height: @line-height-base; 576 | 577 | //** Background color of modal content area 578 | @modal-content-bg: #fff; 579 | //** Modal content border color 580 | @modal-content-border-color: rgba(0,0,0,.2); 581 | //** Modal content border color **for IE8** 582 | @modal-content-fallback-border-color: #999; 583 | 584 | //** Modal backdrop background color 585 | @modal-backdrop-bg: #000; 586 | //** Modal backdrop opacity 587 | @modal-backdrop-opacity: .5; 588 | //** Modal header border color 589 | @modal-header-border-color: #e5e5e5; 590 | //** Modal footer border color 591 | @modal-footer-border-color: @modal-header-border-color; 592 | 593 | @modal-lg: 900px; 594 | @modal-md: 600px; 595 | @modal-sm: 300px; 596 | 597 | 598 | //== Alerts 599 | // 600 | //## Define alert colors, border radius, and padding. 601 | 602 | @alert-padding: 15px; 603 | @alert-border-radius: @border-radius-base; 604 | @alert-link-font-weight: bold; 605 | 606 | @alert-success-bg: @state-success-bg; 607 | @alert-success-text: @state-success-text; 608 | @alert-success-border: @state-success-border; 609 | 610 | @alert-info-bg: @state-info-bg; 611 | @alert-info-text: @state-info-text; 612 | @alert-info-border: @state-info-border; 613 | 614 | @alert-warning-bg: @state-warning-bg; 615 | @alert-warning-text: @state-warning-text; 616 | @alert-warning-border: @state-warning-border; 617 | 618 | @alert-danger-bg: @state-danger-bg; 619 | @alert-danger-text: @state-danger-text; 620 | @alert-danger-border: @state-danger-border; 621 | 622 | 623 | //== Progress bars 624 | // 625 | //## 626 | 627 | //** Background color of the whole progress component 628 | @progress-bg: #f5f5f5; 629 | //** Progress bar text color 630 | @progress-bar-color: #fff; 631 | 632 | //** Default progress bar color 633 | @progress-bar-bg: @brand-primary; 634 | //** Success progress bar color 635 | @progress-bar-success-bg: @brand-success; 636 | //** Warning progress bar color 637 | @progress-bar-warning-bg: @brand-warning; 638 | //** Danger progress bar color 639 | @progress-bar-danger-bg: @brand-danger; 640 | //** Info progress bar color 641 | @progress-bar-info-bg: @brand-info; 642 | 643 | 644 | //== List group 645 | // 646 | //## 647 | 648 | //** Background color on `.list-group-item` 649 | @list-group-bg: #fff; 650 | //** `.list-group-item` border color 651 | @list-group-border: #ddd; 652 | //** List group border radius 653 | @list-group-border-radius: @border-radius-base; 654 | 655 | //** Background color of single list items on hover 656 | @list-group-hover-bg: #f5f5f5; 657 | //** Text color of active list items 658 | @list-group-active-color: @component-active-color; 659 | //** Background color of active list items 660 | @list-group-active-bg: @component-active-bg; 661 | //** Border color of active list elements 662 | @list-group-active-border: @list-group-active-bg; 663 | //** Text color for content within active list items 664 | @list-group-active-text-color: lighten(@list-group-active-bg, 40%); 665 | 666 | //** Text color of disabled list items 667 | @list-group-disabled-color: @gray-light; 668 | //** Background color of disabled list items 669 | @list-group-disabled-bg: @gray-lighter; 670 | //** Text color for content within disabled list items 671 | @list-group-disabled-text-color: @list-group-disabled-color; 672 | 673 | @list-group-link-color: #555; 674 | @list-group-link-hover-color: @list-group-link-color; 675 | @list-group-link-heading-color: #333; 676 | 677 | 678 | //== Panels 679 | // 680 | //## 681 | 682 | @panel-bg: #fff; 683 | @panel-body-padding: 15px; 684 | @panel-heading-padding: 10px 15px; 685 | @panel-footer-padding: @panel-heading-padding; 686 | @panel-border-radius: @border-radius-base; 687 | 688 | //** Border color for elements within panels 689 | @panel-inner-border: #ddd; 690 | @panel-footer-bg: #f5f5f5; 691 | 692 | @panel-default-text: @gray-dark; 693 | @panel-default-border: #ddd; 694 | @panel-default-heading-bg: #f5f5f5; 695 | 696 | @panel-primary-text: #fff; 697 | @panel-primary-border: @brand-primary; 698 | @panel-primary-heading-bg: @brand-primary; 699 | 700 | @panel-success-text: @state-success-text; 701 | @panel-success-border: @state-success-border; 702 | @panel-success-heading-bg: @state-success-bg; 703 | 704 | @panel-info-text: @state-info-text; 705 | @panel-info-border: @state-info-border; 706 | @panel-info-heading-bg: @state-info-bg; 707 | 708 | @panel-warning-text: @state-warning-text; 709 | @panel-warning-border: @state-warning-border; 710 | @panel-warning-heading-bg: @state-warning-bg; 711 | 712 | @panel-danger-text: @state-danger-text; 713 | @panel-danger-border: @state-danger-border; 714 | @panel-danger-heading-bg: @state-danger-bg; 715 | 716 | 717 | //== Thumbnails 718 | // 719 | //## 720 | 721 | //** Padding around the thumbnail image 722 | @thumbnail-padding: 4px; 723 | //** Thumbnail background color 724 | @thumbnail-bg: @body-bg; 725 | //** Thumbnail border color 726 | @thumbnail-border: #ddd; 727 | //** Thumbnail border radius 728 | @thumbnail-border-radius: @border-radius-base; 729 | 730 | //** Custom text color for thumbnail captions 731 | @thumbnail-caption-color: @text-color; 732 | //** Padding around the thumbnail caption 733 | @thumbnail-caption-padding: 9px; 734 | 735 | 736 | //== Wells 737 | // 738 | //## 739 | 740 | @well-bg: #f5f5f5; 741 | @well-border: darken(@well-bg, 7%); 742 | 743 | 744 | //== Badges 745 | // 746 | //## 747 | 748 | @badge-color: #fff; 749 | //** Linked badge text color on hover 750 | @badge-link-hover-color: #fff; 751 | @badge-bg: @gray-light; 752 | 753 | //** Badge text color in active nav link 754 | @badge-active-color: @link-color; 755 | //** Badge background color in active nav link 756 | @badge-active-bg: #fff; 757 | 758 | @badge-font-weight: bold; 759 | @badge-line-height: 1; 760 | @badge-border-radius: 10px; 761 | 762 | 763 | //== Breadcrumbs 764 | // 765 | //## 766 | 767 | @breadcrumb-padding-vertical: 8px; 768 | @breadcrumb-padding-horizontal: 15px; 769 | //** Breadcrumb background color 770 | @breadcrumb-bg: #f5f5f5; 771 | //** Breadcrumb text color 772 | @breadcrumb-color: #ccc; 773 | //** Text color of current page in the breadcrumb 774 | @breadcrumb-active-color: @gray-light; 775 | //** Textual separator for between breadcrumb elements 776 | @breadcrumb-separator: "/"; 777 | 778 | 779 | //== Carousel 780 | // 781 | //## 782 | 783 | @carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6); 784 | 785 | @carousel-control-color: #fff; 786 | @carousel-control-width: 15%; 787 | @carousel-control-opacity: .5; 788 | @carousel-control-font-size: 20px; 789 | 790 | @carousel-indicator-active-bg: #fff; 791 | @carousel-indicator-border-color: #fff; 792 | 793 | @carousel-caption-color: #fff; 794 | 795 | 796 | //== Close 797 | // 798 | //## 799 | 800 | @close-font-weight: bold; 801 | @close-color: #000; 802 | @close-text-shadow: 0 1px 0 #fff; 803 | 804 | 805 | //== Code 806 | // 807 | //## 808 | 809 | @code-color: #c7254e; 810 | @code-bg: #f9f2f4; 811 | 812 | @kbd-color: #fff; 813 | @kbd-bg: #333; 814 | 815 | @pre-bg: #f5f5f5; 816 | @pre-color: @gray-dark; 817 | @pre-border-color: #ccc; 818 | @pre-scrollable-max-height: 340px; 819 | 820 | 821 | //== Type 822 | // 823 | //## 824 | 825 | //** Horizontal offset for forms and lists. 826 | @component-offset-horizontal: 180px; 827 | //** Text muted color 828 | @text-muted: @gray-light; 829 | //** Abbreviations and acronyms border color 830 | @abbr-border-color: @gray-light; 831 | //** Headings small color 832 | @headings-small-color: @gray-light; 833 | //** Blockquote small color 834 | @blockquote-small-color: @gray-light; 835 | //** Blockquote font size 836 | @blockquote-font-size: (@font-size-base * 1.25); 837 | //** Blockquote border color 838 | @blockquote-border-color: @gray-lighter; 839 | //** Page header border color 840 | @page-header-border-color: @gray-lighter; 841 | //** Width of horizontal description list titles 842 | @dl-horizontal-offset: @component-offset-horizontal; 843 | //** Horizontal line color. 844 | @hr-border: @gray-lighter; 845 | 846 | 847 | -------------------------------------------------------------------------------- /assets/less/mixins.less: -------------------------------------------------------------------------------- 1 | @import 'lib/bootstrap/mixins.less'; 2 | 3 | .make-social-link(@color){ 4 | color: @color; 5 | 6 | &:hover, &:focus { 7 | text-decoration: none; 8 | color: darken(@color, 10%); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /assets/less/print.less: -------------------------------------------------------------------------------- 1 | @media print { 2 | .name-and-profession .name { 3 | margin-top: -2rem; 4 | } 5 | .page { 6 | margin-top: -4rem; 7 | } 8 | .social-links { 9 | margin-top: 0.5rem; 10 | } 11 | body { 12 | font-size: 10pt; 13 | } 14 | a[href]:after { 15 | content: none !important; 16 | } 17 | .pagebreak { 18 | page-break-before: always; 19 | } 20 | .card { 21 | border: 0; 22 | padding: 0; 23 | } 24 | .text-muted { 25 | color: #777 !important; 26 | * { 27 | color: inherit !important; 28 | } 29 | } 30 | .container { 31 | max-width: 100%; 32 | width: 100%; 33 | } 34 | .contact-details .detail .icon { 35 | color: #888 !important; 36 | } 37 | .labels { 38 | display: inline; 39 | } 40 | .skill-info { 41 | margin-left: 0; 42 | } 43 | .profile-card { 44 | text-align: center; 45 | } 46 | .print-only { 47 | display: inherit; 48 | } 49 | .no-print { 50 | display: none; 51 | } 52 | .project-table { 53 | display: grid; 54 | grid-template-columns: 1fr; 55 | grid-gap: 0.8rem 1rem; 56 | } 57 | .highlight { 58 | margin-top: -0.3rem; 59 | } 60 | blockquote { 61 | font-size: 100%; 62 | } 63 | .card-nested { 64 | padding: 0.1rem 0 0.1rem 1rem; 65 | 66 | &.relax { 67 | padding-top: 1rem; 68 | padding-bottom: 1rem; 69 | } 70 | } 71 | .skill-table { 72 | grid-gap: 0.8rem 0.5rem; 73 | } 74 | .background-card h4:not(:first-child) { 75 | margin-top: 1em; 76 | } 77 | #work-projects-group { 78 | display: grid; 79 | grid-gap: 1rem; 80 | grid-template-columns: 2fr 4fr; 81 | page-break-after: always; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /assets/less/sections/references.less: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | @import "../mixins"; 3 | 4 | .quote { 5 | @media (max-width: @screen-tablet) { 6 | font-size: inherit; 7 | } 8 | } -------------------------------------------------------------------------------- /assets/less/sections/skills.less: -------------------------------------------------------------------------------- 1 | @import "../variables"; 2 | @import "../mixins"; 3 | 4 | 5 | .card-skills { 6 | position: relative; 7 | } 8 | 9 | 10 | .skill-info { 11 | margin-left: 20px; 12 | } -------------------------------------------------------------------------------- /assets/less/theme.less: -------------------------------------------------------------------------------- 1 | // All the variables utilized across files go here 2 | @import "variables"; 3 | 4 | // All the mixins go here 5 | @import "mixins"; 6 | 7 | // Utility classes go here 8 | @import "utilities"; 9 | 10 | // All the base styles go here 11 | @import "base.less"; // PUN intended ;-) 12 | 13 | // All the styles related to the info card seen on the left goes here 14 | @import "cards"; 15 | 16 | // Styles related to each section on the background card seen on the right 17 | @import "sections/skills"; 18 | @import "sections/references"; 19 | 20 | @import "print"; -------------------------------------------------------------------------------- /assets/less/utilities.less: -------------------------------------------------------------------------------- 1 | .clear-margin { 2 | margin: 0; 3 | } 4 | 5 | .space-top { 6 | margin-top: 10px; 7 | } 8 | 9 | .space-right { 10 | margin-right: 10px; 11 | } 12 | 13 | .icon-left { 14 | margin-right: 5px; 15 | } 16 | 17 | .icon-right { 18 | margin-left: 5px; 19 | } 20 | 21 | .labels { 22 | word-spacing: 5px; 23 | line-height: 2; 24 | } 25 | 26 | .label-keyword { 27 | display: inline-block; 28 | background: @theme-label-bg; 29 | color: white; 30 | font-size: 0.9em; 31 | padding: 5px; 32 | border: 1px solid @theme-label-border-color; 33 | } 34 | 35 | .link-disguise { 36 | color: inherit; 37 | 38 | &:hover { 39 | color: inherit 40 | } 41 | } 42 | 43 | .clear-margin-sm { 44 | margin-bottom: 0; 45 | } -------------------------------------------------------------------------------- /assets/less/variables.less: -------------------------------------------------------------------------------- 1 | @import "lib/bootstrap/variables.less"; 2 | 3 | @theme-bg: #f0f0f0; 4 | @theme-font-color: #333; 5 | @theme-red: #e74c3c; 6 | @theme-blue: #428bca; 7 | @theme-yellow: #f1c40f; 8 | @theme-green: #5cb85c; 9 | 10 | //Icon styles 11 | @icon-color: #707070; 12 | 13 | // card variables 14 | @card-bg: white; 15 | @card-border-color: #e6e6e6; 16 | @card-border-radius: 3px; 17 | 18 | // Label styles 19 | @theme-label-bg: lighten(@theme-blue, 15%); 20 | @theme-label-border-color: darken(@theme-label-bg, 20%); -------------------------------------------------------------------------------- /build.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs-extra') 2 | const axios = require('axios') 3 | const puppeteer = require('puppeteer') 4 | 5 | const gist = 'antfu/ceb04ede6daf195eaf51e32b6aef5d4e' 6 | 7 | async function buildHTML() { 8 | await fs.remove('./dist') 9 | await fs.ensureDir('./dist') 10 | 11 | let resume 12 | if (fs.existsSync('./resume.json')) { 13 | console.log(`Loading from locale "resume.json"`) 14 | resume = JSON.parse(fs.readFileSync('./resume.json', 'utf-8')) 15 | } else { 16 | console.log(`Downloading resume... [${gist}]`) 17 | const { data } = await axios.get(`https://gist.githubusercontent.com/${gist}/raw/resume.json`) 18 | resume = data 19 | } 20 | console.log('Rendering...') 21 | const html = await require("./index.js").render(resume) 22 | console.log('Saving file...') 23 | fs.writeFileSync('./dist/index.html', html, 'utf-8') 24 | console.log('Done') 25 | return html 26 | } 27 | 28 | async function buildPDF(html) { 29 | const browser = await puppeteer.launch({ headless: true }) 30 | const page = await browser.newPage(); 31 | console.log('Opening puppeteer...') 32 | await page.setContent(html, { waitUntil: 'networkidle0' }) 33 | console.log('Generating PDF...') 34 | const pdf = await page.pdf({ 35 | format: 'A4', 36 | displayHeaderFooter: false, 37 | printBackground: true, 38 | margin: { 39 | top: '0.4in', 40 | bottom: '0.4in', 41 | left: '0.4in', 42 | right: '0.4in', 43 | } 44 | }) 45 | await browser.close() 46 | console.log('Saving file...') 47 | fs.writeFileSync('./dist/resume.pdf', pdf) 48 | console.log('Done') 49 | return pdf 50 | } 51 | 52 | async function buildAll() { 53 | const html = await buildHTML() 54 | await buildPDF(html) 55 | } 56 | 57 | buildAll().catch(e => { 58 | console.error(e) 59 | process.exit(1) 60 | }) 61 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var Handlebars = require('handlebars'); 3 | var gravatar = require('gravatar'); 4 | var _ = require('underscore'); 5 | var _s = require('underscore.string'); 6 | var moment = require('moment'); 7 | var axios = require('axios') 8 | 9 | function hasEmail(resume) { 10 | return !!resume.basics && !!resume.basics.email; 11 | } 12 | 13 | function getNetwork(profiles, network_name) { 14 | return _.find(profiles, function (profile) { 15 | return profile.network.toLowerCase() === network_name; 16 | }); 17 | } 18 | 19 | function humanizeDuration(moment_obj, did_leave_company) { 20 | var days, 21 | months = moment_obj.months(), 22 | years = moment_obj.years(), 23 | month_str = months > 1 ? 'months' : 'month', 24 | year_str = years > 1 ? 'years' : 'year'; 25 | 26 | if (months && years) { 27 | return years + ' ' + year_str + ' ' + months + ' ' + month_str; 28 | } 29 | 30 | if (months) { 31 | return months + ' ' + month_str; 32 | } 33 | 34 | if (years) { 35 | return years + ' ' + year_str; 36 | } 37 | 38 | if (did_leave_company) { 39 | days = moment_obj.days(); 40 | 41 | return (days > 1 ? days + ' days' : days + ' day'); 42 | } else { 43 | return 'Recently joined'; 44 | } 45 | } 46 | 47 | function getUrlFromUsername(site, username) { 48 | var url_map = { 49 | github: 'github.com', 50 | twitter: 'twitter.com', 51 | soundcloud: 'soundcloud.com', 52 | pinterest: 'pinterest.com', 53 | vimeo: 'vimeo.com', 54 | behance: 'behance.net', 55 | codepen: 'codepen.io', 56 | foursquare: 'foursquare.com', 57 | reddit: 'reddit.com', 58 | spotify: 'spotify.com', 59 | dribble: 'dribbble.com', 60 | dribbble: 'dribbble.com', 61 | facebook: 'facebook.com', 62 | angellist: 'angel.co', 63 | bitbucket: 'bitbucket.org' 64 | }; 65 | 66 | site = site.toLowerCase(); 67 | 68 | if (!username || !url_map[site]) { 69 | return; 70 | } 71 | 72 | switch (site) { 73 | case 'skype': 74 | return 'skype:' + username + '?call'; 75 | case 'reddit': 76 | case 'spotify': 77 | return '//' + 'open.' + url_map[site] + '/user/' + username; 78 | default: 79 | return '//' + url_map[site] + '/' + username; 80 | } 81 | } 82 | 83 | const githubRepoCache = {} 84 | 85 | function getGithubApi(url) { 86 | return url.replace('https://github.com/', 'https://api.github.com/repos/') 87 | } 88 | 89 | async function getRepoStars (url) { 90 | if (githubRepoCache[url]) 91 | return githubRepoCache[url].stargazers_count 92 | try { 93 | const api = getGithubApi(url) 94 | const { data } = await axios.get(api) 95 | githubRepoCache[url] = data 96 | return data.stargazers_count 97 | } 98 | catch(e){ 99 | console.error(e) 100 | return 'NaN' 101 | } 102 | } 103 | 104 | async function render(resume) { 105 | var css = fs.readFileSync(__dirname + '/assets/css/theme.css', 'utf-8'), 106 | template = fs.readFileSync(__dirname + '/resume.hbs', 'utf-8'), 107 | profiles = resume.basics.profiles, 108 | social_sites = ["github", "linkedin", "stackoverflow", "twitter", 109 | "soundcloud", "pinterest", "vimeo", "behance", 110 | "codepen", "foursquare", "reddit", "spotify", 111 | "dribble", "dribbble", "facebook", "angellist", 112 | "bitbucket", "skype"], 113 | date_format = 'MMM YYYY'; 114 | 115 | if (!resume.basics.picture && hasEmail(resume)) { 116 | resume.basics.picture = gravatar.url(resume.basics.email.replace('(at)', '@'), { 117 | s: '100', 118 | r: 'pg', 119 | d: 'mm' 120 | }); 121 | } 122 | 123 | if (resume.languages) { 124 | resume.basics.languages = _.pluck(resume.languages, 'language').join(', '); 125 | } 126 | 127 | _.each(resume.work, function (work_info) { 128 | var did_leave_company, 129 | start_date = work_info.startDate && new Date(work_info.startDate), 130 | end_date = work_info.endDate && new Date(work_info.endDate); 131 | 132 | if (start_date) { 133 | work_info.startDate = moment(start_date).format(date_format); 134 | } 135 | 136 | if (end_date) { 137 | work_info.endDate = moment(end_date).format(date_format); 138 | } 139 | 140 | did_leave_company = !!end_date; 141 | 142 | if (start_date) { 143 | end_date = end_date || new Date(); 144 | work_info.duration = humanizeDuration( 145 | moment.duration(end_date.getTime() - start_date.getTime()), 146 | did_leave_company) 147 | } 148 | }); 149 | 150 | _.each(resume.skills, function (skill_info) { 151 | var levels = ['Beginner', 'Intermediate', 'Advanced', 'Master']; 152 | 153 | if (skill_info.level) { 154 | skill_info.skill_class = skill_info.level.toLowerCase(); 155 | skill_info.level = _s.capitalize(skill_info.level.trim()); 156 | skill_info.display_progress_bar = _.contains(levels, 157 | skill_info.level); 158 | } 159 | }); 160 | 161 | _.each(resume.education, function (education_info) { 162 | _.each(['startDate', 'endDate'], function (date) { 163 | var date_obj = new Date(education_info[date]); 164 | 165 | if (education_info[date]) { 166 | education_info[date] = moment(date_obj).format(date_format); 167 | } 168 | }); 169 | }); 170 | 171 | _.each(resume.awards, function (award_info) { 172 | if (award_info.date) { 173 | award_info.date = moment(new Date(award_info.date)).format(date_format) 174 | } 175 | }); 176 | 177 | _.each(resume.publications, function (publication_info) { 178 | if (publication_info.releaseDate) { 179 | publication_info.releaseDate = moment(new Date(publication_info.releaseDate)).format('MMM DD, YYYY') 180 | } 181 | }); 182 | 183 | _.each(resume.volunteer, function (volunteer_info) { 184 | _.each(['startDate', 'endDate'], function (date) { 185 | var date_obj = new Date(volunteer_info[date]); 186 | 187 | if (volunteer_info[date]) { 188 | volunteer_info[date] = moment(date_obj).format(date_format); 189 | } 190 | }); 191 | }); 192 | 193 | _.each(social_sites, function (site) { 194 | var username, 195 | social_account = getNetwork(profiles, site); 196 | 197 | if (social_account) { 198 | username = social_account.username; 199 | resume.basics[site + '_url'] = 200 | getUrlFromUsername(site, username) || social_account.url; 201 | } 202 | }); 203 | 204 | for (const project of resume.projects){ 205 | if (project.githubUrl) 206 | project.stars = await getRepoStars(project.githubUrl) 207 | } 208 | 209 | Handlebars.registerHelper('toSocialIcon', function (text) { 210 | return { 211 | linkedin: 'ri:linkedin-box-fill', 212 | github: 'ri:github-fill', 213 | instagram: 'ri:instagram-line', 214 | twitter: 'ri:twitter-fill', 215 | website: 'ri:global-line', 216 | link: 'ri:arrow-right-up-line', 217 | portfolio: 'ri:account-circle-fill' 218 | }[text.trim().toLowerCase()] 219 | }) 220 | 221 | Handlebars.registerHelper('join', function (arr) { 222 | return arr.join(', ') 223 | }) 224 | 225 | Handlebars.registerHelper('getGithubApi', getGithubApi) 226 | 227 | Handlebars.registerHelper('breaklines', function(text) { 228 | text = Handlebars.Utils.escapeExpression(text); 229 | text = text.replace(/(\r\n|\n|\r)/gm, '
'); 230 | return new Handlebars.SafeString(text); 231 | }) 232 | 233 | Handlebars.registerHelper('getBuildDate', function() { 234 | return moment().format('MMMM Do YYYY, h:mm:ss a') 235 | }) 236 | 237 | return Handlebars.compile(template)({ 238 | css: css, 239 | resume: resume 240 | }); 241 | } 242 | 243 | module.exports = { 244 | render: render 245 | }; 246 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@antfu/resume", 3 | "private": true, 4 | "packageManager": "pnpm@7.8.0", 5 | "scripts": { 6 | "dev": "concurrently \"npx grunt watch\" \"node ./serve.js ./resume.json\"", 7 | "build": "grunt less && node ./build.js" 8 | }, 9 | "dependencies": { 10 | "gravatar": "^1.8.2", 11 | "handlebars": "^4.7.7", 12 | "moment": "^2.29.4", 13 | "optimist": "^0.6.1", 14 | "resume-schema": "1.0.0", 15 | "tarball-extract": "0.0.6", 16 | "underscore": "^1.13.4" 17 | }, 18 | "devDependencies": { 19 | "axios": "^0.27.2", 20 | "concurrently": "^7.3.0", 21 | "fs-extra": "^10.1.0", 22 | "grunt": "^1.5.3", 23 | "grunt-cli": "^1.4.3", 24 | "grunt-contrib-less": "^3.0.0", 25 | "grunt-contrib-watch": "^1.1.0", 26 | "grunt-exec": "^3.0.0", 27 | "less": "^4.1.3", 28 | "puppeteer": "^15.5.0", 29 | "underscore.string": "^3.3.6" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | axios: ^0.27.2 5 | concurrently: ^7.3.0 6 | fs-extra: ^10.1.0 7 | gravatar: ^1.8.2 8 | grunt: ^1.5.3 9 | grunt-cli: ^1.4.3 10 | grunt-contrib-less: ^2.0.0 11 | grunt-contrib-watch: ^1.1.0 12 | grunt-exec: ^3.0.0 13 | handlebars: ^4.7.7 14 | less: ^4.1.3 15 | moment: ^2.29.4 16 | optimist: ^0.6.1 17 | puppeteer: ^15.5.0 18 | resume-schema: 1.0.0 19 | tarball-extract: 0.0.6 20 | underscore: ^1.13.4 21 | underscore.string: ^3.3.6 22 | 23 | dependencies: 24 | gravatar: 1.8.2 25 | handlebars: 4.7.7 26 | moment: 2.29.4 27 | optimist: 0.6.1 28 | resume-schema: 1.0.0 29 | tarball-extract: 0.0.6 30 | underscore: 1.13.4 31 | 32 | devDependencies: 33 | axios: 0.27.2 34 | concurrently: 7.3.0 35 | fs-extra: 10.1.0 36 | grunt: 1.5.3 37 | grunt-cli: 1.4.3 38 | grunt-contrib-less: 2.1.0 39 | grunt-contrib-watch: 1.1.0 40 | grunt-exec: 3.0.0_grunt@1.5.3 41 | less: 4.1.3 42 | puppeteer: 15.5.0 43 | underscore.string: 3.3.6 44 | 45 | packages: 46 | 47 | /@types/node/18.6.3: 48 | resolution: {integrity: sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==} 49 | dev: true 50 | optional: true 51 | 52 | /@types/yauzl/2.10.0: 53 | resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} 54 | requiresBuild: true 55 | dependencies: 56 | '@types/node': 18.6.3 57 | dev: true 58 | optional: true 59 | 60 | /abbrev/1.1.1: 61 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 62 | dev: true 63 | 64 | /agent-base/6.0.2: 65 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 66 | engines: {node: '>= 6.0.0'} 67 | dependencies: 68 | debug: 4.3.4 69 | transitivePeerDependencies: 70 | - supports-color 71 | dev: true 72 | 73 | /ansi-regex/5.0.1: 74 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 75 | engines: {node: '>=8'} 76 | 77 | /ansi-styles/4.3.0: 78 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 79 | engines: {node: '>=8'} 80 | dependencies: 81 | color-convert: 2.0.1 82 | 83 | /argparse/1.0.10: 84 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 85 | dependencies: 86 | sprintf-js: 1.0.3 87 | dev: true 88 | 89 | /array-each/1.0.1: 90 | resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} 91 | engines: {node: '>=0.10.0'} 92 | dev: true 93 | 94 | /array-slice/1.1.0: 95 | resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} 96 | engines: {node: '>=0.10.0'} 97 | dev: true 98 | 99 | /async/2.6.4: 100 | resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} 101 | dependencies: 102 | lodash: 4.17.21 103 | dev: true 104 | 105 | /async/3.2.4: 106 | resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} 107 | dev: true 108 | 109 | /asynckit/0.4.0: 110 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 111 | dev: true 112 | 113 | /axios/0.27.2: 114 | resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} 115 | dependencies: 116 | follow-redirects: 1.15.1 117 | form-data: 4.0.0 118 | transitivePeerDependencies: 119 | - debug 120 | dev: true 121 | 122 | /balanced-match/1.0.2: 123 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 124 | 125 | /base64-js/1.5.1: 126 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 127 | dev: true 128 | 129 | /bl/4.1.0: 130 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 131 | dependencies: 132 | buffer: 5.7.1 133 | inherits: 2.0.4 134 | readable-stream: 3.6.0 135 | dev: true 136 | 137 | /block-stream/0.0.9: 138 | resolution: {integrity: sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==} 139 | engines: {node: 0.4 || >=0.5.8} 140 | dependencies: 141 | inherits: 2.0.4 142 | dev: false 143 | 144 | /blueimp-md5/2.19.0: 145 | resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} 146 | dev: false 147 | 148 | /body/5.1.0: 149 | resolution: {integrity: sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==} 150 | dependencies: 151 | continuable-cache: 0.3.1 152 | error: 7.2.1 153 | raw-body: 1.1.7 154 | safe-json-parse: 1.0.1 155 | dev: true 156 | 157 | /brace-expansion/1.1.11: 158 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 159 | dependencies: 160 | balanced-match: 1.0.2 161 | concat-map: 0.0.1 162 | 163 | /braces/3.0.2: 164 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 165 | engines: {node: '>=8'} 166 | dependencies: 167 | fill-range: 7.0.1 168 | dev: true 169 | 170 | /buffer-crc32/0.2.13: 171 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 172 | dev: true 173 | 174 | /buffer/5.7.1: 175 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 176 | dependencies: 177 | base64-js: 1.5.1 178 | ieee754: 1.2.1 179 | dev: true 180 | 181 | /bytes/1.0.0: 182 | resolution: {integrity: sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==} 183 | dev: true 184 | 185 | /call-bind/1.0.2: 186 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 187 | dependencies: 188 | function-bind: 1.1.1 189 | get-intrinsic: 1.1.2 190 | dev: true 191 | 192 | /camelcase/5.3.1: 193 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 194 | engines: {node: '>=6'} 195 | dev: false 196 | 197 | /chalk/4.1.2: 198 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 199 | engines: {node: '>=10'} 200 | dependencies: 201 | ansi-styles: 4.3.0 202 | supports-color: 7.2.0 203 | dev: true 204 | 205 | /chownr/1.1.4: 206 | resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 207 | dev: true 208 | 209 | /cliui/6.0.0: 210 | resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} 211 | dependencies: 212 | string-width: 4.2.3 213 | strip-ansi: 6.0.1 214 | wrap-ansi: 6.2.0 215 | dev: false 216 | 217 | /cliui/7.0.4: 218 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 219 | dependencies: 220 | string-width: 4.2.3 221 | strip-ansi: 6.0.1 222 | wrap-ansi: 7.0.0 223 | dev: true 224 | 225 | /color-convert/2.0.1: 226 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 227 | engines: {node: '>=7.0.0'} 228 | dependencies: 229 | color-name: 1.1.4 230 | 231 | /color-name/1.1.4: 232 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 233 | 234 | /colors/1.1.2: 235 | resolution: {integrity: sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==} 236 | engines: {node: '>=0.1.90'} 237 | dev: true 238 | 239 | /combined-stream/1.0.8: 240 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 241 | engines: {node: '>= 0.8'} 242 | dependencies: 243 | delayed-stream: 1.0.0 244 | dev: true 245 | 246 | /commander/2.20.3: 247 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 248 | requiresBuild: true 249 | dev: false 250 | optional: true 251 | 252 | /concat-map/0.0.1: 253 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 254 | 255 | /concurrently/7.3.0: 256 | resolution: {integrity: sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==} 257 | engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} 258 | hasBin: true 259 | dependencies: 260 | chalk: 4.1.2 261 | date-fns: 2.29.1 262 | lodash: 4.17.21 263 | rxjs: 7.5.6 264 | shell-quote: 1.7.3 265 | spawn-command: 0.0.2-1 266 | supports-color: 8.1.1 267 | tree-kill: 1.2.2 268 | yargs: 17.5.1 269 | dev: true 270 | 271 | /continuable-cache/0.3.1: 272 | resolution: {integrity: sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==} 273 | dev: true 274 | 275 | /copy-anything/2.0.6: 276 | resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} 277 | dependencies: 278 | is-what: 3.14.1 279 | dev: true 280 | 281 | /cross-fetch/3.1.5: 282 | resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} 283 | dependencies: 284 | node-fetch: 2.6.7 285 | transitivePeerDependencies: 286 | - encoding 287 | dev: true 288 | 289 | /date-fns/2.29.1: 290 | resolution: {integrity: sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==} 291 | engines: {node: '>=0.11'} 292 | dev: true 293 | 294 | /dateformat/3.0.3: 295 | resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} 296 | dev: true 297 | 298 | /debug/3.2.7: 299 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 300 | peerDependencies: 301 | supports-color: '*' 302 | peerDependenciesMeta: 303 | supports-color: 304 | optional: true 305 | dependencies: 306 | ms: 2.1.3 307 | dev: true 308 | 309 | /debug/4.3.4: 310 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 311 | engines: {node: '>=6.0'} 312 | peerDependencies: 313 | supports-color: '*' 314 | peerDependenciesMeta: 315 | supports-color: 316 | optional: true 317 | dependencies: 318 | ms: 2.1.2 319 | dev: true 320 | 321 | /decamelize/1.2.0: 322 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 323 | engines: {node: '>=0.10.0'} 324 | dev: false 325 | 326 | /delayed-stream/1.0.0: 327 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 328 | engines: {node: '>=0.4.0'} 329 | dev: true 330 | 331 | /detect-file/1.0.0: 332 | resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} 333 | engines: {node: '>=0.10.0'} 334 | dev: true 335 | 336 | /devtools-protocol/0.0.1019158: 337 | resolution: {integrity: sha512-wvq+KscQ7/6spEV7czhnZc9RM/woz1AY+/Vpd8/h2HFMwJSdTliu7f/yr1A6vDdJfKICZsShqsYpEQbdhg8AFQ==} 338 | dev: true 339 | 340 | /email-validator/2.0.4: 341 | resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} 342 | engines: {node: '>4.0'} 343 | dev: false 344 | 345 | /emoji-regex/8.0.0: 346 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 347 | 348 | /end-of-stream/1.4.4: 349 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 350 | dependencies: 351 | once: 1.4.0 352 | dev: true 353 | 354 | /errno/0.1.8: 355 | resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} 356 | hasBin: true 357 | requiresBuild: true 358 | dependencies: 359 | prr: 1.0.1 360 | dev: true 361 | optional: true 362 | 363 | /error/7.2.1: 364 | resolution: {integrity: sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==} 365 | dependencies: 366 | string-template: 0.2.1 367 | dev: true 368 | 369 | /escalade/3.1.1: 370 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 371 | engines: {node: '>=6'} 372 | dev: true 373 | 374 | /esprima/4.0.1: 375 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 376 | engines: {node: '>=4'} 377 | hasBin: true 378 | dev: true 379 | 380 | /eventemitter2/0.4.14: 381 | resolution: {integrity: sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==} 382 | dev: true 383 | 384 | /exit/0.1.2: 385 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 386 | engines: {node: '>= 0.8.0'} 387 | dev: true 388 | 389 | /expand-tilde/2.0.2: 390 | resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} 391 | engines: {node: '>=0.10.0'} 392 | dependencies: 393 | homedir-polyfill: 1.0.3 394 | dev: true 395 | 396 | /extend/3.0.2: 397 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 398 | dev: true 399 | 400 | /extract-zip/2.0.1: 401 | resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} 402 | engines: {node: '>= 10.17.0'} 403 | hasBin: true 404 | dependencies: 405 | debug: 4.3.4 406 | get-stream: 5.2.0 407 | yauzl: 2.10.0 408 | optionalDependencies: 409 | '@types/yauzl': 2.10.0 410 | transitivePeerDependencies: 411 | - supports-color 412 | dev: true 413 | 414 | /faye-websocket/0.10.0: 415 | resolution: {integrity: sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==} 416 | engines: {node: '>=0.4.0'} 417 | dependencies: 418 | websocket-driver: 0.7.4 419 | dev: true 420 | 421 | /fd-slicer/1.1.0: 422 | resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} 423 | dependencies: 424 | pend: 1.2.0 425 | dev: true 426 | 427 | /fill-range/7.0.1: 428 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 429 | engines: {node: '>=8'} 430 | dependencies: 431 | to-regex-range: 5.0.1 432 | dev: true 433 | 434 | /find-up/4.1.0: 435 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 436 | engines: {node: '>=8'} 437 | dependencies: 438 | locate-path: 5.0.0 439 | path-exists: 4.0.0 440 | 441 | /findup-sync/0.3.0: 442 | resolution: {integrity: sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==} 443 | engines: {node: '>= 0.6.0'} 444 | dependencies: 445 | glob: 5.0.15 446 | dev: true 447 | 448 | /findup-sync/4.0.0: 449 | resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} 450 | engines: {node: '>= 8'} 451 | dependencies: 452 | detect-file: 1.0.0 453 | is-glob: 4.0.3 454 | micromatch: 4.0.5 455 | resolve-dir: 1.0.1 456 | dev: true 457 | 458 | /fined/1.2.0: 459 | resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} 460 | engines: {node: '>= 0.10'} 461 | dependencies: 462 | expand-tilde: 2.0.2 463 | is-plain-object: 2.0.4 464 | object.defaults: 1.1.0 465 | object.pick: 1.3.0 466 | parse-filepath: 1.0.2 467 | dev: true 468 | 469 | /flagged-respawn/1.0.1: 470 | resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} 471 | engines: {node: '>= 0.10'} 472 | dev: true 473 | 474 | /follow-redirects/1.15.1: 475 | resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} 476 | engines: {node: '>=4.0'} 477 | peerDependencies: 478 | debug: '*' 479 | peerDependenciesMeta: 480 | debug: 481 | optional: true 482 | dev: true 483 | 484 | /for-in/1.0.2: 485 | resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} 486 | engines: {node: '>=0.10.0'} 487 | dev: true 488 | 489 | /for-own/1.0.0: 490 | resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} 491 | engines: {node: '>=0.10.0'} 492 | dependencies: 493 | for-in: 1.0.2 494 | dev: true 495 | 496 | /form-data/4.0.0: 497 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 498 | engines: {node: '>= 6'} 499 | dependencies: 500 | asynckit: 0.4.0 501 | combined-stream: 1.0.8 502 | mime-types: 2.1.35 503 | dev: true 504 | 505 | /fs-constants/1.0.0: 506 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 507 | dev: true 508 | 509 | /fs-extra/10.1.0: 510 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 511 | engines: {node: '>=12'} 512 | dependencies: 513 | graceful-fs: 4.2.10 514 | jsonfile: 6.1.0 515 | universalify: 2.0.0 516 | dev: true 517 | 518 | /fs.realpath/1.0.0: 519 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 520 | 521 | /fstream/1.0.12: 522 | resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} 523 | engines: {node: '>=0.6'} 524 | dependencies: 525 | graceful-fs: 4.2.10 526 | inherits: 2.0.4 527 | mkdirp: 0.5.6 528 | rimraf: 2.7.1 529 | dev: false 530 | 531 | /function-bind/1.1.1: 532 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 533 | dev: true 534 | 535 | /gaze/1.1.3: 536 | resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} 537 | engines: {node: '>= 4.0.0'} 538 | dependencies: 539 | globule: 1.3.4 540 | dev: true 541 | 542 | /get-caller-file/2.0.5: 543 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 544 | engines: {node: 6.* || 8.* || >= 10.*} 545 | 546 | /get-intrinsic/1.1.2: 547 | resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} 548 | dependencies: 549 | function-bind: 1.1.1 550 | has: 1.0.3 551 | has-symbols: 1.0.3 552 | dev: true 553 | 554 | /get-stream/5.2.0: 555 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 556 | engines: {node: '>=8'} 557 | dependencies: 558 | pump: 3.0.0 559 | dev: true 560 | 561 | /getobject/1.0.2: 562 | resolution: {integrity: sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==} 563 | engines: {node: '>=10'} 564 | dev: true 565 | 566 | /glob/5.0.15: 567 | resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} 568 | dependencies: 569 | inflight: 1.0.6 570 | inherits: 2.0.4 571 | minimatch: 3.0.8 572 | once: 1.4.0 573 | path-is-absolute: 1.0.1 574 | dev: true 575 | 576 | /glob/7.1.7: 577 | resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 578 | dependencies: 579 | fs.realpath: 1.0.0 580 | inflight: 1.0.6 581 | inherits: 2.0.4 582 | minimatch: 3.0.8 583 | once: 1.4.0 584 | path-is-absolute: 1.0.1 585 | dev: true 586 | 587 | /glob/7.2.3: 588 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 589 | dependencies: 590 | fs.realpath: 1.0.0 591 | inflight: 1.0.6 592 | inherits: 2.0.4 593 | minimatch: 3.1.2 594 | once: 1.4.0 595 | path-is-absolute: 1.0.1 596 | 597 | /global-modules/1.0.0: 598 | resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} 599 | engines: {node: '>=0.10.0'} 600 | dependencies: 601 | global-prefix: 1.0.2 602 | is-windows: 1.0.2 603 | resolve-dir: 1.0.1 604 | dev: true 605 | 606 | /global-prefix/1.0.2: 607 | resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} 608 | engines: {node: '>=0.10.0'} 609 | dependencies: 610 | expand-tilde: 2.0.2 611 | homedir-polyfill: 1.0.3 612 | ini: 1.3.8 613 | is-windows: 1.0.2 614 | which: 1.3.1 615 | dev: true 616 | 617 | /globule/1.3.4: 618 | resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==} 619 | engines: {node: '>= 0.10'} 620 | dependencies: 621 | glob: 7.1.7 622 | lodash: 4.17.21 623 | minimatch: 3.0.8 624 | dev: true 625 | 626 | /graceful-fs/4.2.10: 627 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 628 | 629 | /gravatar/1.8.2: 630 | resolution: {integrity: sha512-GdRwLM3oYpFQKy47MKuluw9hZ2gaCtiKPbDGdcDEuYDKlc8eNnW27KYL9LVbIDzEsx88WtDWQm2ClBcsgBnj6w==} 631 | engines: {node: '>=10'} 632 | hasBin: true 633 | dependencies: 634 | blueimp-md5: 2.19.0 635 | email-validator: 2.0.4 636 | querystring: 0.2.0 637 | yargs: 15.4.1 638 | dev: false 639 | 640 | /grunt-cli/1.4.3: 641 | resolution: {integrity: sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==} 642 | engines: {node: '>=10'} 643 | hasBin: true 644 | dependencies: 645 | grunt-known-options: 2.0.0 646 | interpret: 1.1.0 647 | liftup: 3.0.1 648 | nopt: 4.0.3 649 | v8flags: 3.2.0 650 | dev: true 651 | 652 | /grunt-contrib-less/2.1.0: 653 | resolution: {integrity: sha512-+GNKFKpZfiopgUd5cDYNuzsVHZ7WFHM7MOUPKtmMDhfKQ4ZSFuVpNP5PoTFs669TARE6Rvgtv1izILKCpuhFZw==} 654 | engines: {node: '>=10'} 655 | dependencies: 656 | async: 3.2.4 657 | chalk: 4.1.2 658 | less: 3.13.1 659 | lodash: 4.17.21 660 | dev: true 661 | 662 | /grunt-contrib-watch/1.1.0: 663 | resolution: {integrity: sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==} 664 | engines: {node: '>=0.10.0'} 665 | dependencies: 666 | async: 2.6.4 667 | gaze: 1.1.3 668 | lodash: 4.17.21 669 | tiny-lr: 1.1.1 670 | transitivePeerDependencies: 671 | - supports-color 672 | dev: true 673 | 674 | /grunt-exec/3.0.0_grunt@1.5.3: 675 | resolution: {integrity: sha512-cgAlreXf3muSYS5LzW0Cc4xHK03BjFOYk0MqCQ/MZ3k1Xz2GU7D+IAJg4UKicxpO+XdONJdx/NJ6kpy2wI+uHg==} 676 | engines: {node: '>=0.8.0'} 677 | peerDependencies: 678 | grunt: '>=0.4' 679 | dependencies: 680 | grunt: 1.5.3 681 | dev: true 682 | 683 | /grunt-known-options/2.0.0: 684 | resolution: {integrity: sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==} 685 | engines: {node: '>=0.10.0'} 686 | dev: true 687 | 688 | /grunt-legacy-log-utils/2.1.0: 689 | resolution: {integrity: sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==} 690 | engines: {node: '>=10'} 691 | dependencies: 692 | chalk: 4.1.2 693 | lodash: 4.17.21 694 | dev: true 695 | 696 | /grunt-legacy-log/3.0.0: 697 | resolution: {integrity: sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==} 698 | engines: {node: '>= 0.10.0'} 699 | dependencies: 700 | colors: 1.1.2 701 | grunt-legacy-log-utils: 2.1.0 702 | hooker: 0.2.3 703 | lodash: 4.17.21 704 | dev: true 705 | 706 | /grunt-legacy-util/2.0.1: 707 | resolution: {integrity: sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==} 708 | engines: {node: '>=10'} 709 | dependencies: 710 | async: 3.2.4 711 | exit: 0.1.2 712 | getobject: 1.0.2 713 | hooker: 0.2.3 714 | lodash: 4.17.21 715 | underscore.string: 3.3.6 716 | which: 2.0.2 717 | dev: true 718 | 719 | /grunt/1.5.3: 720 | resolution: {integrity: sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==} 721 | engines: {node: '>=8'} 722 | hasBin: true 723 | dependencies: 724 | dateformat: 3.0.3 725 | eventemitter2: 0.4.14 726 | exit: 0.1.2 727 | findup-sync: 0.3.0 728 | glob: 7.1.7 729 | grunt-cli: 1.4.3 730 | grunt-known-options: 2.0.0 731 | grunt-legacy-log: 3.0.0 732 | grunt-legacy-util: 2.0.1 733 | iconv-lite: 0.4.24 734 | js-yaml: 3.14.1 735 | minimatch: 3.0.8 736 | mkdirp: 1.0.4 737 | nopt: 3.0.6 738 | rimraf: 3.0.2 739 | dev: true 740 | 741 | /handlebars/4.7.7: 742 | resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} 743 | engines: {node: '>=0.4.7'} 744 | hasBin: true 745 | dependencies: 746 | minimist: 1.2.6 747 | neo-async: 2.6.2 748 | source-map: 0.6.1 749 | wordwrap: 1.0.0 750 | optionalDependencies: 751 | uglify-js: 3.16.3 752 | dev: false 753 | 754 | /has-flag/4.0.0: 755 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 756 | engines: {node: '>=8'} 757 | dev: true 758 | 759 | /has-symbols/1.0.3: 760 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 761 | engines: {node: '>= 0.4'} 762 | dev: true 763 | 764 | /has/1.0.3: 765 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 766 | engines: {node: '>= 0.4.0'} 767 | dependencies: 768 | function-bind: 1.1.1 769 | dev: true 770 | 771 | /homedir-polyfill/1.0.3: 772 | resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} 773 | engines: {node: '>=0.10.0'} 774 | dependencies: 775 | parse-passwd: 1.0.0 776 | dev: true 777 | 778 | /hooker/0.2.3: 779 | resolution: {integrity: sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==} 780 | dev: true 781 | 782 | /http-parser-js/0.5.8: 783 | resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} 784 | dev: true 785 | 786 | /https-proxy-agent/5.0.1: 787 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 788 | engines: {node: '>= 6'} 789 | dependencies: 790 | agent-base: 6.0.2 791 | debug: 4.3.4 792 | transitivePeerDependencies: 793 | - supports-color 794 | dev: true 795 | 796 | /iconv-lite/0.4.24: 797 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 798 | engines: {node: '>=0.10.0'} 799 | dependencies: 800 | safer-buffer: 2.1.2 801 | dev: true 802 | 803 | /iconv-lite/0.6.3: 804 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 805 | engines: {node: '>=0.10.0'} 806 | dependencies: 807 | safer-buffer: 2.1.2 808 | dev: true 809 | optional: true 810 | 811 | /ieee754/1.2.1: 812 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 813 | dev: true 814 | 815 | /image-size/0.5.5: 816 | resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} 817 | engines: {node: '>=0.10.0'} 818 | hasBin: true 819 | requiresBuild: true 820 | dev: true 821 | optional: true 822 | 823 | /inflight/1.0.6: 824 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 825 | dependencies: 826 | once: 1.4.0 827 | wrappy: 1.0.2 828 | 829 | /inherits/2.0.4: 830 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 831 | 832 | /ini/1.3.8: 833 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 834 | dev: true 835 | 836 | /interpret/1.1.0: 837 | resolution: {integrity: sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==} 838 | dev: true 839 | 840 | /is-absolute/1.0.0: 841 | resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} 842 | engines: {node: '>=0.10.0'} 843 | dependencies: 844 | is-relative: 1.0.0 845 | is-windows: 1.0.2 846 | dev: true 847 | 848 | /is-core-module/2.9.0: 849 | resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} 850 | dependencies: 851 | has: 1.0.3 852 | dev: true 853 | 854 | /is-extglob/2.1.1: 855 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 856 | engines: {node: '>=0.10.0'} 857 | dev: true 858 | 859 | /is-fullwidth-code-point/3.0.0: 860 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 861 | engines: {node: '>=8'} 862 | 863 | /is-glob/4.0.3: 864 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 865 | engines: {node: '>=0.10.0'} 866 | dependencies: 867 | is-extglob: 2.1.1 868 | dev: true 869 | 870 | /is-number/7.0.0: 871 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 872 | engines: {node: '>=0.12.0'} 873 | dev: true 874 | 875 | /is-plain-object/2.0.4: 876 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 877 | engines: {node: '>=0.10.0'} 878 | dependencies: 879 | isobject: 3.0.1 880 | dev: true 881 | 882 | /is-relative/1.0.0: 883 | resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} 884 | engines: {node: '>=0.10.0'} 885 | dependencies: 886 | is-unc-path: 1.0.0 887 | dev: true 888 | 889 | /is-unc-path/1.0.0: 890 | resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} 891 | engines: {node: '>=0.10.0'} 892 | dependencies: 893 | unc-path-regex: 0.1.2 894 | dev: true 895 | 896 | /is-what/3.14.1: 897 | resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} 898 | dev: true 899 | 900 | /is-windows/1.0.2: 901 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 902 | engines: {node: '>=0.10.0'} 903 | dev: true 904 | 905 | /isexe/2.0.0: 906 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 907 | dev: true 908 | 909 | /isobject/3.0.1: 910 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 911 | engines: {node: '>=0.10.0'} 912 | dev: true 913 | 914 | /js-yaml/3.14.1: 915 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 916 | hasBin: true 917 | dependencies: 918 | argparse: 1.0.10 919 | esprima: 4.0.1 920 | dev: true 921 | 922 | /jsonfile/6.1.0: 923 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 924 | dependencies: 925 | universalify: 2.0.0 926 | optionalDependencies: 927 | graceful-fs: 4.2.10 928 | dev: true 929 | 930 | /kind-of/6.0.3: 931 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 932 | engines: {node: '>=0.10.0'} 933 | dev: true 934 | 935 | /less/3.13.1: 936 | resolution: {integrity: sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==} 937 | engines: {node: '>=6'} 938 | hasBin: true 939 | dependencies: 940 | copy-anything: 2.0.6 941 | tslib: 1.14.1 942 | optionalDependencies: 943 | errno: 0.1.8 944 | graceful-fs: 4.2.10 945 | image-size: 0.5.5 946 | make-dir: 2.1.0 947 | mime: 1.6.0 948 | native-request: 1.1.0 949 | source-map: 0.6.1 950 | dev: true 951 | 952 | /less/4.1.3: 953 | resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} 954 | engines: {node: '>=6'} 955 | hasBin: true 956 | dependencies: 957 | copy-anything: 2.0.6 958 | parse-node-version: 1.0.1 959 | tslib: 2.4.0 960 | optionalDependencies: 961 | errno: 0.1.8 962 | graceful-fs: 4.2.10 963 | image-size: 0.5.5 964 | make-dir: 2.1.0 965 | mime: 1.6.0 966 | needle: 3.1.0 967 | source-map: 0.6.1 968 | transitivePeerDependencies: 969 | - supports-color 970 | dev: true 971 | 972 | /liftup/3.0.1: 973 | resolution: {integrity: sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==} 974 | engines: {node: '>=10'} 975 | dependencies: 976 | extend: 3.0.2 977 | findup-sync: 4.0.0 978 | fined: 1.2.0 979 | flagged-respawn: 1.0.1 980 | is-plain-object: 2.0.4 981 | object.map: 1.0.1 982 | rechoir: 0.7.1 983 | resolve: 1.22.1 984 | dev: true 985 | 986 | /livereload-js/2.4.0: 987 | resolution: {integrity: sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==} 988 | dev: true 989 | 990 | /locate-path/5.0.0: 991 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 992 | engines: {node: '>=8'} 993 | dependencies: 994 | p-locate: 4.1.0 995 | 996 | /lodash.get/4.4.2: 997 | resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} 998 | dev: false 999 | 1000 | /lodash.isequal/4.5.0: 1001 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} 1002 | dev: false 1003 | 1004 | /lodash/4.17.21: 1005 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1006 | dev: true 1007 | 1008 | /make-dir/2.1.0: 1009 | resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} 1010 | engines: {node: '>=6'} 1011 | requiresBuild: true 1012 | dependencies: 1013 | pify: 4.0.1 1014 | semver: 5.7.1 1015 | dev: true 1016 | optional: true 1017 | 1018 | /make-iterator/1.0.1: 1019 | resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} 1020 | engines: {node: '>=0.10.0'} 1021 | dependencies: 1022 | kind-of: 6.0.3 1023 | dev: true 1024 | 1025 | /map-cache/0.2.2: 1026 | resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} 1027 | engines: {node: '>=0.10.0'} 1028 | dev: true 1029 | 1030 | /micromatch/4.0.5: 1031 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1032 | engines: {node: '>=8.6'} 1033 | dependencies: 1034 | braces: 3.0.2 1035 | picomatch: 2.3.1 1036 | dev: true 1037 | 1038 | /mime-db/1.52.0: 1039 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1040 | engines: {node: '>= 0.6'} 1041 | dev: true 1042 | 1043 | /mime-types/2.1.35: 1044 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1045 | engines: {node: '>= 0.6'} 1046 | dependencies: 1047 | mime-db: 1.52.0 1048 | dev: true 1049 | 1050 | /mime/1.6.0: 1051 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 1052 | engines: {node: '>=4'} 1053 | hasBin: true 1054 | requiresBuild: true 1055 | dev: true 1056 | optional: true 1057 | 1058 | /minimatch/3.0.8: 1059 | resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} 1060 | dependencies: 1061 | brace-expansion: 1.1.11 1062 | dev: true 1063 | 1064 | /minimatch/3.1.2: 1065 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1066 | dependencies: 1067 | brace-expansion: 1.1.11 1068 | 1069 | /minimist/0.0.10: 1070 | resolution: {integrity: sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==} 1071 | dev: false 1072 | 1073 | /minimist/1.2.6: 1074 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} 1075 | dev: false 1076 | 1077 | /mkdirp-classic/0.5.3: 1078 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1079 | dev: true 1080 | 1081 | /mkdirp/0.5.6: 1082 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1083 | hasBin: true 1084 | dependencies: 1085 | minimist: 1.2.6 1086 | dev: false 1087 | 1088 | /mkdirp/1.0.4: 1089 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1090 | engines: {node: '>=10'} 1091 | hasBin: true 1092 | dev: true 1093 | 1094 | /moment/2.29.4: 1095 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 1096 | dev: false 1097 | 1098 | /ms/2.1.2: 1099 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1100 | dev: true 1101 | 1102 | /ms/2.1.3: 1103 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1104 | dev: true 1105 | 1106 | /native-request/1.1.0: 1107 | resolution: {integrity: sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==} 1108 | requiresBuild: true 1109 | dev: true 1110 | optional: true 1111 | 1112 | /needle/3.1.0: 1113 | resolution: {integrity: sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==} 1114 | engines: {node: '>= 4.4.x'} 1115 | hasBin: true 1116 | requiresBuild: true 1117 | dependencies: 1118 | debug: 3.2.7 1119 | iconv-lite: 0.6.3 1120 | sax: 1.2.4 1121 | transitivePeerDependencies: 1122 | - supports-color 1123 | dev: true 1124 | optional: true 1125 | 1126 | /neo-async/2.6.2: 1127 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1128 | dev: false 1129 | 1130 | /node-fetch/2.6.7: 1131 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 1132 | engines: {node: 4.x || >=6.0.0} 1133 | peerDependencies: 1134 | encoding: ^0.1.0 1135 | peerDependenciesMeta: 1136 | encoding: 1137 | optional: true 1138 | dependencies: 1139 | whatwg-url: 5.0.0 1140 | dev: true 1141 | 1142 | /nopt/3.0.6: 1143 | resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} 1144 | hasBin: true 1145 | dependencies: 1146 | abbrev: 1.1.1 1147 | dev: true 1148 | 1149 | /nopt/4.0.3: 1150 | resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==} 1151 | hasBin: true 1152 | dependencies: 1153 | abbrev: 1.1.1 1154 | osenv: 0.1.5 1155 | dev: true 1156 | 1157 | /object-assign/4.1.1: 1158 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1159 | engines: {node: '>=0.10.0'} 1160 | dev: true 1161 | 1162 | /object-inspect/1.12.2: 1163 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1164 | dev: true 1165 | 1166 | /object.defaults/1.1.0: 1167 | resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} 1168 | engines: {node: '>=0.10.0'} 1169 | dependencies: 1170 | array-each: 1.0.1 1171 | array-slice: 1.1.0 1172 | for-own: 1.0.0 1173 | isobject: 3.0.1 1174 | dev: true 1175 | 1176 | /object.map/1.0.1: 1177 | resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} 1178 | engines: {node: '>=0.10.0'} 1179 | dependencies: 1180 | for-own: 1.0.0 1181 | make-iterator: 1.0.1 1182 | dev: true 1183 | 1184 | /object.pick/1.3.0: 1185 | resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} 1186 | engines: {node: '>=0.10.0'} 1187 | dependencies: 1188 | isobject: 3.0.1 1189 | dev: true 1190 | 1191 | /once/1.4.0: 1192 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1193 | dependencies: 1194 | wrappy: 1.0.2 1195 | 1196 | /optimist/0.6.1: 1197 | resolution: {integrity: sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==} 1198 | dependencies: 1199 | minimist: 0.0.10 1200 | wordwrap: 0.0.3 1201 | dev: false 1202 | 1203 | /os-homedir/1.0.2: 1204 | resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} 1205 | engines: {node: '>=0.10.0'} 1206 | dev: true 1207 | 1208 | /os-tmpdir/1.0.2: 1209 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 1210 | engines: {node: '>=0.10.0'} 1211 | dev: true 1212 | 1213 | /osenv/0.1.5: 1214 | resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} 1215 | dependencies: 1216 | os-homedir: 1.0.2 1217 | os-tmpdir: 1.0.2 1218 | dev: true 1219 | 1220 | /p-limit/2.3.0: 1221 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1222 | engines: {node: '>=6'} 1223 | dependencies: 1224 | p-try: 2.2.0 1225 | 1226 | /p-locate/4.1.0: 1227 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1228 | engines: {node: '>=8'} 1229 | dependencies: 1230 | p-limit: 2.3.0 1231 | 1232 | /p-try/2.2.0: 1233 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1234 | engines: {node: '>=6'} 1235 | 1236 | /parse-filepath/1.0.2: 1237 | resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} 1238 | engines: {node: '>=0.8'} 1239 | dependencies: 1240 | is-absolute: 1.0.0 1241 | map-cache: 0.2.2 1242 | path-root: 0.1.1 1243 | dev: true 1244 | 1245 | /parse-node-version/1.0.1: 1246 | resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} 1247 | engines: {node: '>= 0.10'} 1248 | dev: true 1249 | 1250 | /parse-passwd/1.0.0: 1251 | resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} 1252 | engines: {node: '>=0.10.0'} 1253 | dev: true 1254 | 1255 | /path-exists/4.0.0: 1256 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1257 | engines: {node: '>=8'} 1258 | 1259 | /path-is-absolute/1.0.1: 1260 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1261 | engines: {node: '>=0.10.0'} 1262 | 1263 | /path-parse/1.0.7: 1264 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1265 | dev: true 1266 | 1267 | /path-root-regex/0.1.2: 1268 | resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} 1269 | engines: {node: '>=0.10.0'} 1270 | dev: true 1271 | 1272 | /path-root/0.1.1: 1273 | resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} 1274 | engines: {node: '>=0.10.0'} 1275 | dependencies: 1276 | path-root-regex: 0.1.2 1277 | dev: true 1278 | 1279 | /pend/1.2.0: 1280 | resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 1281 | dev: true 1282 | 1283 | /picomatch/2.3.1: 1284 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1285 | engines: {node: '>=8.6'} 1286 | dev: true 1287 | 1288 | /pify/4.0.1: 1289 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 1290 | engines: {node: '>=6'} 1291 | dev: true 1292 | optional: true 1293 | 1294 | /pkg-dir/4.2.0: 1295 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1296 | engines: {node: '>=8'} 1297 | dependencies: 1298 | find-up: 4.1.0 1299 | dev: true 1300 | 1301 | /progress/2.0.3: 1302 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 1303 | engines: {node: '>=0.4.0'} 1304 | dev: true 1305 | 1306 | /proxy-from-env/1.1.0: 1307 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 1308 | dev: true 1309 | 1310 | /prr/1.0.1: 1311 | resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} 1312 | dev: true 1313 | optional: true 1314 | 1315 | /pump/3.0.0: 1316 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1317 | dependencies: 1318 | end-of-stream: 1.4.4 1319 | once: 1.4.0 1320 | dev: true 1321 | 1322 | /puppeteer/15.5.0: 1323 | resolution: {integrity: sha512-+vZPU8iBSdCx1Kn5hHas80fyo0TiVyMeqLGv/1dygX2HKhAZjO9YThadbRTCoTYq0yWw+w/CysldPsEekDtjDQ==} 1324 | engines: {node: '>=14.1.0'} 1325 | requiresBuild: true 1326 | dependencies: 1327 | cross-fetch: 3.1.5 1328 | debug: 4.3.4 1329 | devtools-protocol: 0.0.1019158 1330 | extract-zip: 2.0.1 1331 | https-proxy-agent: 5.0.1 1332 | pkg-dir: 4.2.0 1333 | progress: 2.0.3 1334 | proxy-from-env: 1.1.0 1335 | rimraf: 3.0.2 1336 | tar-fs: 2.1.1 1337 | unbzip2-stream: 1.4.3 1338 | ws: 8.8.0 1339 | transitivePeerDependencies: 1340 | - bufferutil 1341 | - encoding 1342 | - supports-color 1343 | - utf-8-validate 1344 | dev: true 1345 | 1346 | /qs/6.11.0: 1347 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 1348 | engines: {node: '>=0.6'} 1349 | dependencies: 1350 | side-channel: 1.0.4 1351 | dev: true 1352 | 1353 | /querystring/0.2.0: 1354 | resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} 1355 | engines: {node: '>=0.4.x'} 1356 | deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. 1357 | dev: false 1358 | 1359 | /raw-body/1.1.7: 1360 | resolution: {integrity: sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==} 1361 | engines: {node: '>= 0.8.0'} 1362 | dependencies: 1363 | bytes: 1.0.0 1364 | string_decoder: 0.10.31 1365 | dev: true 1366 | 1367 | /readable-stream/3.6.0: 1368 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 1369 | engines: {node: '>= 6'} 1370 | dependencies: 1371 | inherits: 2.0.4 1372 | string_decoder: 1.3.0 1373 | util-deprecate: 1.0.2 1374 | dev: true 1375 | 1376 | /rechoir/0.7.1: 1377 | resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} 1378 | engines: {node: '>= 0.10'} 1379 | dependencies: 1380 | resolve: 1.22.1 1381 | dev: true 1382 | 1383 | /require-directory/2.1.1: 1384 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1385 | engines: {node: '>=0.10.0'} 1386 | 1387 | /require-main-filename/2.0.0: 1388 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 1389 | dev: false 1390 | 1391 | /resolve-dir/1.0.1: 1392 | resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} 1393 | engines: {node: '>=0.10.0'} 1394 | dependencies: 1395 | expand-tilde: 2.0.2 1396 | global-modules: 1.0.0 1397 | dev: true 1398 | 1399 | /resolve/1.22.1: 1400 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1401 | hasBin: true 1402 | dependencies: 1403 | is-core-module: 2.9.0 1404 | path-parse: 1.0.7 1405 | supports-preserve-symlinks-flag: 1.0.0 1406 | dev: true 1407 | 1408 | /resume-schema/1.0.0: 1409 | resolution: {integrity: sha512-9ZEP3oO1IRrjQWTOfDq7fDNNeJp7gWqfS/l2D02f6f25nRw/wRAkpDyvIlw9uoaDARK7Ebj/CN2D/6Ht27S0zg==} 1410 | engines: {node: '>=10'} 1411 | dependencies: 1412 | z-schema: 4.2.4 1413 | dev: false 1414 | 1415 | /rimraf/2.7.1: 1416 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1417 | hasBin: true 1418 | dependencies: 1419 | glob: 7.2.3 1420 | dev: false 1421 | 1422 | /rimraf/3.0.2: 1423 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1424 | hasBin: true 1425 | dependencies: 1426 | glob: 7.2.3 1427 | dev: true 1428 | 1429 | /rxjs/7.5.6: 1430 | resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} 1431 | dependencies: 1432 | tslib: 2.4.0 1433 | dev: true 1434 | 1435 | /safe-buffer/5.2.1: 1436 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1437 | dev: true 1438 | 1439 | /safe-json-parse/1.0.1: 1440 | resolution: {integrity: sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==} 1441 | dev: true 1442 | 1443 | /safer-buffer/2.1.2: 1444 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1445 | dev: true 1446 | 1447 | /sax/1.2.4: 1448 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} 1449 | dev: true 1450 | optional: true 1451 | 1452 | /semver/5.7.1: 1453 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1454 | hasBin: true 1455 | dev: true 1456 | optional: true 1457 | 1458 | /set-blocking/2.0.0: 1459 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 1460 | dev: false 1461 | 1462 | /shell-quote/1.7.3: 1463 | resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} 1464 | dev: true 1465 | 1466 | /side-channel/1.0.4: 1467 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1468 | dependencies: 1469 | call-bind: 1.0.2 1470 | get-intrinsic: 1.1.2 1471 | object-inspect: 1.12.2 1472 | dev: true 1473 | 1474 | /source-map/0.6.1: 1475 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1476 | engines: {node: '>=0.10.0'} 1477 | 1478 | /spawn-command/0.0.2-1: 1479 | resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} 1480 | dev: true 1481 | 1482 | /sprintf-js/1.0.3: 1483 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1484 | dev: true 1485 | 1486 | /sprintf-js/1.1.2: 1487 | resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} 1488 | dev: true 1489 | 1490 | /string-template/0.2.1: 1491 | resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} 1492 | dev: true 1493 | 1494 | /string-width/4.2.3: 1495 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1496 | engines: {node: '>=8'} 1497 | dependencies: 1498 | emoji-regex: 8.0.0 1499 | is-fullwidth-code-point: 3.0.0 1500 | strip-ansi: 6.0.1 1501 | 1502 | /string_decoder/0.10.31: 1503 | resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} 1504 | dev: true 1505 | 1506 | /string_decoder/1.3.0: 1507 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1508 | dependencies: 1509 | safe-buffer: 5.2.1 1510 | dev: true 1511 | 1512 | /strip-ansi/6.0.1: 1513 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1514 | engines: {node: '>=8'} 1515 | dependencies: 1516 | ansi-regex: 5.0.1 1517 | 1518 | /supports-color/7.2.0: 1519 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1520 | engines: {node: '>=8'} 1521 | dependencies: 1522 | has-flag: 4.0.0 1523 | dev: true 1524 | 1525 | /supports-color/8.1.1: 1526 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1527 | engines: {node: '>=10'} 1528 | dependencies: 1529 | has-flag: 4.0.0 1530 | dev: true 1531 | 1532 | /supports-preserve-symlinks-flag/1.0.0: 1533 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1534 | engines: {node: '>= 0.4'} 1535 | dev: true 1536 | 1537 | /tar-fs/2.1.1: 1538 | resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} 1539 | dependencies: 1540 | chownr: 1.1.4 1541 | mkdirp-classic: 0.5.3 1542 | pump: 3.0.0 1543 | tar-stream: 2.2.0 1544 | dev: true 1545 | 1546 | /tar-stream/2.2.0: 1547 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 1548 | engines: {node: '>=6'} 1549 | dependencies: 1550 | bl: 4.1.0 1551 | end-of-stream: 1.4.4 1552 | fs-constants: 1.0.0 1553 | inherits: 2.0.4 1554 | readable-stream: 3.6.0 1555 | dev: true 1556 | 1557 | /tar/2.2.1: 1558 | resolution: {integrity: sha512-2Tw2uNtZqQTSHTIMbKHKFeAPmKcljrNKqKiIN7pu3V/CxYqRgS8DLXvMkFRrbtXlg6mTOQcuTX7DMj18Xi0dtg==} 1559 | deprecated: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. 1560 | dependencies: 1561 | block-stream: 0.0.9 1562 | fstream: 1.0.12 1563 | inherits: 2.0.4 1564 | dev: false 1565 | 1566 | /tarball-extract/0.0.6: 1567 | resolution: {integrity: sha512-LB6De5Vwxq+ViknLoqueud3E+0y0616gTaPL3zctGoCuKuDFqdASy5JdPu++IYyqpuOwlEeYvMiquU31t4VBTQ==} 1568 | engines: {node: '>= 0.8.0'} 1569 | dependencies: 1570 | tar: 2.2.1 1571 | wget: 0.0.1 1572 | dev: false 1573 | 1574 | /through/2.3.8: 1575 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1576 | dev: true 1577 | 1578 | /tiny-lr/1.1.1: 1579 | resolution: {integrity: sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==} 1580 | dependencies: 1581 | body: 5.1.0 1582 | debug: 3.2.7 1583 | faye-websocket: 0.10.0 1584 | livereload-js: 2.4.0 1585 | object-assign: 4.1.1 1586 | qs: 6.11.0 1587 | transitivePeerDependencies: 1588 | - supports-color 1589 | dev: true 1590 | 1591 | /to-regex-range/5.0.1: 1592 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1593 | engines: {node: '>=8.0'} 1594 | dependencies: 1595 | is-number: 7.0.0 1596 | dev: true 1597 | 1598 | /tr46/0.0.3: 1599 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1600 | dev: true 1601 | 1602 | /tree-kill/1.2.2: 1603 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1604 | hasBin: true 1605 | dev: true 1606 | 1607 | /tslib/1.14.1: 1608 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1609 | dev: true 1610 | 1611 | /tslib/2.4.0: 1612 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 1613 | dev: true 1614 | 1615 | /tunnel/0.0.2: 1616 | resolution: {integrity: sha1-8jvNi3p7ioZCYbIIT2b5MZM5YzQ=} 1617 | engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} 1618 | dev: false 1619 | 1620 | /uglify-js/3.16.3: 1621 | resolution: {integrity: sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw==} 1622 | engines: {node: '>=0.8.0'} 1623 | hasBin: true 1624 | requiresBuild: true 1625 | dev: false 1626 | optional: true 1627 | 1628 | /unbzip2-stream/1.4.3: 1629 | resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} 1630 | dependencies: 1631 | buffer: 5.7.1 1632 | through: 2.3.8 1633 | dev: true 1634 | 1635 | /unc-path-regex/0.1.2: 1636 | resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} 1637 | engines: {node: '>=0.10.0'} 1638 | dev: true 1639 | 1640 | /underscore.string/3.3.6: 1641 | resolution: {integrity: sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==} 1642 | dependencies: 1643 | sprintf-js: 1.1.2 1644 | util-deprecate: 1.0.2 1645 | dev: true 1646 | 1647 | /underscore/1.13.4: 1648 | resolution: {integrity: sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==} 1649 | dev: false 1650 | 1651 | /universalify/2.0.0: 1652 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 1653 | engines: {node: '>= 10.0.0'} 1654 | dev: true 1655 | 1656 | /util-deprecate/1.0.2: 1657 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1658 | dev: true 1659 | 1660 | /v8flags/3.2.0: 1661 | resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} 1662 | engines: {node: '>= 0.10'} 1663 | dependencies: 1664 | homedir-polyfill: 1.0.3 1665 | dev: true 1666 | 1667 | /validator/13.7.0: 1668 | resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} 1669 | engines: {node: '>= 0.10'} 1670 | dev: false 1671 | 1672 | /webidl-conversions/3.0.1: 1673 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1674 | dev: true 1675 | 1676 | /websocket-driver/0.7.4: 1677 | resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} 1678 | engines: {node: '>=0.8.0'} 1679 | dependencies: 1680 | http-parser-js: 0.5.8 1681 | safe-buffer: 5.2.1 1682 | websocket-extensions: 0.1.4 1683 | dev: true 1684 | 1685 | /websocket-extensions/0.1.4: 1686 | resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} 1687 | engines: {node: '>=0.8.0'} 1688 | dev: true 1689 | 1690 | /wget/0.0.1: 1691 | resolution: {integrity: sha512-iKDSrvontU6lAQq89bNn7me3HU/+Cau7NedEYz607TOS4n0AgksloCt2UwU+ZH5Kn0Lq+XbJ6STOpnhpjicvOQ==} 1692 | engines: {node: '>= 0.6.18'} 1693 | hasBin: true 1694 | dependencies: 1695 | tunnel: 0.0.2 1696 | dev: false 1697 | 1698 | /whatwg-url/5.0.0: 1699 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 1700 | dependencies: 1701 | tr46: 0.0.3 1702 | webidl-conversions: 3.0.1 1703 | dev: true 1704 | 1705 | /which-module/2.0.0: 1706 | resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} 1707 | dev: false 1708 | 1709 | /which/1.3.1: 1710 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1711 | hasBin: true 1712 | dependencies: 1713 | isexe: 2.0.0 1714 | dev: true 1715 | 1716 | /which/2.0.2: 1717 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1718 | engines: {node: '>= 8'} 1719 | hasBin: true 1720 | dependencies: 1721 | isexe: 2.0.0 1722 | dev: true 1723 | 1724 | /wordwrap/0.0.3: 1725 | resolution: {integrity: sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==} 1726 | engines: {node: '>=0.4.0'} 1727 | dev: false 1728 | 1729 | /wordwrap/1.0.0: 1730 | resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 1731 | dev: false 1732 | 1733 | /wrap-ansi/6.2.0: 1734 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 1735 | engines: {node: '>=8'} 1736 | dependencies: 1737 | ansi-styles: 4.3.0 1738 | string-width: 4.2.3 1739 | strip-ansi: 6.0.1 1740 | dev: false 1741 | 1742 | /wrap-ansi/7.0.0: 1743 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1744 | engines: {node: '>=10'} 1745 | dependencies: 1746 | ansi-styles: 4.3.0 1747 | string-width: 4.2.3 1748 | strip-ansi: 6.0.1 1749 | dev: true 1750 | 1751 | /wrappy/1.0.2: 1752 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1753 | 1754 | /ws/8.8.0: 1755 | resolution: {integrity: sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==} 1756 | engines: {node: '>=10.0.0'} 1757 | peerDependencies: 1758 | bufferutil: ^4.0.1 1759 | utf-8-validate: ^5.0.2 1760 | peerDependenciesMeta: 1761 | bufferutil: 1762 | optional: true 1763 | utf-8-validate: 1764 | optional: true 1765 | dev: true 1766 | 1767 | /y18n/4.0.3: 1768 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 1769 | dev: false 1770 | 1771 | /y18n/5.0.8: 1772 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1773 | engines: {node: '>=10'} 1774 | dev: true 1775 | 1776 | /yargs-parser/18.1.3: 1777 | resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} 1778 | engines: {node: '>=6'} 1779 | dependencies: 1780 | camelcase: 5.3.1 1781 | decamelize: 1.2.0 1782 | dev: false 1783 | 1784 | /yargs-parser/21.0.1: 1785 | resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} 1786 | engines: {node: '>=12'} 1787 | dev: true 1788 | 1789 | /yargs/15.4.1: 1790 | resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} 1791 | engines: {node: '>=8'} 1792 | dependencies: 1793 | cliui: 6.0.0 1794 | decamelize: 1.2.0 1795 | find-up: 4.1.0 1796 | get-caller-file: 2.0.5 1797 | require-directory: 2.1.1 1798 | require-main-filename: 2.0.0 1799 | set-blocking: 2.0.0 1800 | string-width: 4.2.3 1801 | which-module: 2.0.0 1802 | y18n: 4.0.3 1803 | yargs-parser: 18.1.3 1804 | dev: false 1805 | 1806 | /yargs/17.5.1: 1807 | resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} 1808 | engines: {node: '>=12'} 1809 | dependencies: 1810 | cliui: 7.0.4 1811 | escalade: 3.1.1 1812 | get-caller-file: 2.0.5 1813 | require-directory: 2.1.1 1814 | string-width: 4.2.3 1815 | y18n: 5.0.8 1816 | yargs-parser: 21.0.1 1817 | dev: true 1818 | 1819 | /yauzl/2.10.0: 1820 | resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} 1821 | dependencies: 1822 | buffer-crc32: 0.2.13 1823 | fd-slicer: 1.1.0 1824 | dev: true 1825 | 1826 | /z-schema/4.2.4: 1827 | resolution: {integrity: sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w==} 1828 | engines: {node: '>=6.0.0'} 1829 | hasBin: true 1830 | dependencies: 1831 | lodash.get: 4.4.2 1832 | lodash.isequal: 4.5.0 1833 | validator: 13.7.0 1834 | optionalDependencies: 1835 | commander: 2.20.3 1836 | dev: false 1837 | -------------------------------------------------------------------------------- /resume.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {{#resume.basics}}{{name}}{{/resume.basics}} - Résumé 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |
21 | {{#resume.basics}} 22 |
23 |
24 | 29 |
30 |
31 |

{{name}}

32 |
{{label}}
33 |
34 | 35 | {{#if address}} 36 |
{{address}}
37 | {{/if}} 38 | 39 | {{#if email}} 40 |
41 | 42 | {{email}} 43 | 44 |
45 | {{/if}} 46 | 47 | {{#if phone}} 48 | 53 | {{/if}} 54 | 55 | {{#if location}} 56 |
57 | {{#location}} 58 | 59 | {{city}}, {{region}}, 60 | {{countryCode}} 61 | 62 | {{/location}} 63 |
64 | {{/if}} 65 |
66 | 67 | 75 |
76 |
77 | {{/resume.basics}} 78 | 79 |
80 |
81 | 82 |
83 |
84 |
85 | 86 |

About

87 |
88 |

{{breaklines resume.basics.summary}}

89 |
90 | 91 |
92 | {{#if resume.projects}} 93 |
94 |

Projects

95 |
96 |
97 | {{#each resume.projects}} 98 |
  • 99 |
    100 |

    101 | {{displayName}}  102 | {{#if githubUrl}} 103 | 104 | 105 | 106 | {{/if}} 107 | {{#if website}} 108 | 109 | 110 | 111 | {{/if}} 112 |

    113 |

    114 | {{summary}} 115 |

    116 | {{#if githubUrl}} 117 |

    118 | 119 | {{stars}} 120 |

    121 | {{/if}} 122 |
    123 |
  • 124 | {{/each}} 125 |
    126 | {{#if resume.basics.projects_url}} 127 |
  • 128 | More Projects... 129 |
  • 130 | {{/if}} 131 |
    132 |
    133 |
    134 | {{/if}} 135 | 136 |
    137 |

    Work Experience

    138 |
      139 | {{#each resume.work}} 140 |
    • 141 |
      142 |

      143 | {{#if website}}{{company}}{{else}}{{company}}{{/if}} 144 | {{position}} 145 |

      146 |

      147 | 148 | {{startDate}} - {{#if endDate}}{{endDate}}{{else}}Present{{/if}} | {{location}} 149 | 150 |

      151 |

      {{summary}}

      152 | {{#if highlights}} 153 |
        154 | {{#each highlights}} 155 |
      • {{.}}
      • 156 | {{/each}} 157 |
      158 | {{/if}} 159 |
      160 | 161 |
    • 162 | {{/each}} 163 |
    164 |
    165 |
    166 | 167 |

    Stacks

    168 |
    169 |
    170 | {{#each resume.skills}} 171 |
    {{name}}
    172 |
    {{join keywords}}
    173 | {{/each}} 174 |
    175 |
    176 |
    177 | 178 |
    179 |

    Education

    180 |
      181 | {{#each resume.education}} 182 |
    • 183 |
      184 |

      185 | {{#if area}} {{area}}, {{/if}}{{studyType}},  186 | {{institution}} 187 |

      188 |

      189 | 190 | {{startDate}} - {{#if endDate}} {{endDate}} {{else}} Currently Pursuing {{/if}} 191 | 192 |

      193 |
      {{description}}
      194 | {{gpa}} 195 |
      196 | {{#courses}} {{.}} {{/courses}} 197 |
      198 |
      199 |
    • 200 | {{/each}} 201 |
    202 |
    203 | 204 | 205 | {{#if resume.publications}} 206 |

    Talks

    207 |
      208 | {{#each resume.publications}} 209 |
    • 210 |
      211 |

      212 | {{#if website}}{{name}}{{else}}{{name}}{{/if}},  213 | {{publisher}} 214 |

      215 |

      216 | {{releaseDate}} {{dateNote}} 217 | {{#if slides}}, Slides{{/if}} 218 |

      219 |

      {{summary}}

      220 |
      221 |
    • 222 | {{/each}} 223 |
    224 | {{/if}} 225 | 226 | {{#if resume.awards}} 227 |

    Awards

    228 |
      229 | {{#each resume.awards}} 230 |
    • 231 |
      232 |

      233 | {{title}},  234 | {{awarder}} 235 |

      236 |

      237 | {{date}} 238 |

      239 | {{#if summary}}

      {{summary}}

      {{/if}} 240 |
      241 |
    • 242 | {{/each}} 243 |
    244 | {{/if}} 245 | 246 | {{#if resume.volunteer}} 247 |

    Volunteer Work

    248 |
      249 | {{#each resume.volunteer}} 250 |
    • 251 |
      252 |

      253 | {{position}},  254 | {{organization}} 255 |

      256 |

      257 | 258 | {{startDate}} - {{#if endDate}} {{endDate}} {{else}} Present {{/if}} 259 | 260 |

      261 |

      {{summary}}

      262 |
        263 | {{#each highlights}} 264 |
      • {{.}}
      • 265 | {{/each}} 266 |
      267 |
      268 |
    • 269 | {{/each}} 270 |
    271 | {{/if}} 272 | 273 | {{#if resume.interests}} 274 |

    Interests

    275 |
      276 | {{#each resume.interests}} 277 |
    • 278 |

      279 | {{name}} 280 |

      281 | 282 |
      283 | {{#keywords}} 284 | {{.}} 285 | {{/keywords}} 286 |
      287 |
    • 288 | {{/each}} 289 |
    290 | {{/if}} 291 | 292 | {{#if resume.references}} 293 |

    References

    294 |
      295 | {{#each resume.references}} 296 |
    • 297 |

      298 | {{name}} 299 |

      300 |
      301 |

      {{reference}}

      302 |
      303 |
    • 304 | {{/each}} 305 |
    306 | {{/if}} 307 | 308 | {{#if resume.languages}} 309 |

    Languages

    310 |

    311 | {{#each resume.languages}} 312 | {{language}} ({{fluency}}) 313 | {{/each}} 314 |

    315 | {{/if}} 316 | 317 |
    318 | 323 | 328 |
    Last updated at {{getBuildDate ''}}
    329 |
    330 |
    331 |
    332 |
    333 |
    334 | 335 | 336 | 352 | 353 | 354 | -------------------------------------------------------------------------------- /serve.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/node 2 | // 3 | // This script will run a local development server. This is useful when 4 | // developing the theme. 5 | // 6 | // Usage: 7 | // `serve.js` to use the default JSONResume example 8 | // `serve.js ` to open a particular resume file 9 | 10 | var http = require("http"); 11 | var fs = require('fs'); 12 | var args = require('optimist').argv; 13 | 14 | var port = 8888; 15 | http.createServer(async function (req, res) { 16 | if (req.url === '/') { 17 | res.writeHead(200, { 18 | "Content-Type": "text/html" 19 | }); 20 | res.end(await render()); 21 | } 22 | }).listen(port); 23 | 24 | console.log("Preview: http://localhost:8888/"); 25 | console.log("Serving.."); 26 | 27 | async function render() { 28 | try { 29 | var resume = args._.length 30 | ? JSON.parse(fs.readFileSync(args._[0], 'utf8')) 31 | : require("resume-schema").resumeJson; 32 | return await require("./index.js").render(resume); 33 | } catch (e) { 34 | console.log(e.message); 35 | return ""; 36 | } 37 | } 38 | --------------------------------------------------------------------------------